module Fay.Types.Js
( JsStmt (..)
, JsExp (..)
, JsLit (..)
, JsName (..)
) where
import qualified Fay.Exts.NoAnnotation as N
import Fay.Types.ModulePath
import Data.String
import Language.Haskell.Exts
data JsStmt
= JsVar JsName JsExp
| JsIf JsExp [JsStmt] [JsStmt]
| JsEarlyReturn JsExp
| JsThrow JsExp
| JsWhile JsExp [JsStmt]
| JsUpdate JsName JsExp
| JsSetProp JsName JsName JsExp
| JsSetQName (Maybe SrcSpan) N.QName JsExp
| JsSetModule ModulePath JsExp
| JsSetConstructor N.QName JsExp
| JsSetPropExtern JsName JsName JsExp
| JsContinue
| JsBlock [JsStmt]
| JsExpStmt JsExp
deriving (Show,Eq)
data JsExp
= JsName JsName
| JsRawExp String
| JsSeq [JsExp]
| JsFun (Maybe JsName) [JsName] [JsStmt] (Maybe JsExp)
| JsLit JsLit
| JsApp JsExp [JsExp]
| JsNegApp JsExp
| JsTernaryIf JsExp JsExp JsExp
| JsNull
| JsParen JsExp
| JsGetProp JsExp JsName
| JsLookup JsExp JsExp
| JsUpdateProp JsExp JsName JsExp
| JsGetPropExtern JsExp String
| JsUpdatePropExtern JsExp JsName JsExp
| JsList [JsExp]
| JsNew JsName [JsExp]
| JsThrowExp JsExp
| JsInstanceOf JsExp JsName
| JsIndex Int JsExp
| JsEq JsExp JsExp
| JsNeq JsExp JsExp
| JsInfix String JsExp JsExp
| JsObj [(String,JsExp)]
| JsLitObj [(N.Name,JsExp)]
| JsUndefined
| JsAnd JsExp JsExp
| JsOr JsExp JsExp
deriving (Eq, Show)
data JsName
= JsNameVar N.QName
| JsThis
| JsParametrizedType
| JsThunk
| JsForce
| JsApply
| JsParam Integer
| JsTmp Integer
| JsConstructor N.QName
| JsBuiltIn N.Name
| JsModuleName N.ModuleName
deriving (Eq, Show)
data JsLit
= JsChar Char
| JsStr String
| JsInt Int
| JsFloating Double
| JsBool Bool
deriving (Eq, Show)
instance IsString JsLit where fromString = JsStr