module Language.Haskell.Tools.AST.Exprs where
import Language.Haskell.Tools.AST.Ann
import Language.Haskell.Tools.AST.Base
import Language.Haskell.Tools.AST.Literals
import Language.Haskell.Tools.AST.Types
import Language.Haskell.Tools.AST.Patterns
import Language.Haskell.Tools.AST.Stmts
import Language.Haskell.Tools.AST.TH
import Language.Haskell.Tools.AST.Binds (LocalBind, LocalBinds, RhsGuard)
data Expr dom stage
= Var { _exprName :: Ann Name dom stage
}
| Lit { _exprLit :: Ann Literal dom stage
}
| InfixApp { _exprLhs :: Ann Expr dom stage
, _exprOperator :: Ann Operator dom stage
, _exprRhs :: Ann Expr dom stage
}
| PrefixApp { _exprOperator :: Ann Operator dom stage
, _exprRhs :: Ann Expr dom stage
}
| App { _exprFun :: Ann Expr dom stage
, _exprArg :: Ann Expr dom stage
}
| Lambda { _exprBindings :: AnnList Pattern dom stage
, _exprInner :: Ann Expr dom stage
}
| Let { _exprFunBind :: AnnList LocalBind dom stage
, _exprInner :: Ann Expr dom stage
}
| If { _exprCond :: Ann Expr dom stage
, _exprThen :: Ann Expr dom stage
, _exprElse :: Ann Expr dom stage
}
| MultiIf { _exprIfAlts :: AnnList GuardedCaseRhs dom stage
}
| Case { _exprCase :: Ann Expr dom stage
, _exprAlts :: AnnList Alt dom stage
}
| Do { _doKind :: Ann DoKind dom stage
, _exprStmts :: AnnList Stmt dom stage
}
| Tuple { _tupleElems :: AnnList Expr dom stage
}
| UnboxedTuple { _tupleElems :: AnnList Expr dom stage
}
| TupleSection { _tupleSectionElems :: AnnList TupSecElem dom stage
}
| UnboxedTupSec { _tupleSectionElems :: AnnList TupSecElem dom stage
}
| List { _listElems :: AnnList Expr dom stage
}
| ParArray { _listElems :: AnnList Expr dom stage
}
| Paren { _exprInner :: Ann Expr dom stage
}
| LeftSection { _exprLhs :: Ann Expr dom stage
, _exprOperator :: Ann Operator dom stage
}
| RightSection { _exprOperator :: Ann Operator dom stage
, _exprRhs :: Ann Expr dom stage
}
| RecCon { _exprRecName :: Ann Name dom stage
, _exprRecFields :: AnnList FieldUpdate dom stage
}
| RecUpdate { _exprInner :: Ann Expr dom stage
, _exprRecFields :: AnnList FieldUpdate dom stage
}
| Enum { _enumFrom :: Ann Expr dom stage
, _enumThen :: AnnMaybe Expr dom stage
, _enumTo :: AnnMaybe Expr dom stage
}
| ParArrayEnum { _enumFrom :: Ann Expr dom stage
, _enumThen :: AnnMaybe Expr dom stage
, _enumToFix :: Ann Expr dom stage
}
| ListComp { _compExpr :: Ann Expr dom stage
, _compBody :: AnnList ListCompBody dom stage
}
| ParArrayComp { _compExpr :: Ann Expr dom stage
, _compBody :: AnnList ListCompBody dom stage
}
| TypeSig { _exprInner :: Ann Expr dom stage
, _exprSig :: Ann Type dom stage
}
| ExplTypeApp { _exprInner :: Ann Expr dom stage
, _exprType :: Ann Type dom stage
}
| VarQuote { _quotedName :: Ann Name dom stage
}
| TypeQuote { _quotedName :: Ann Name dom stage
}
| BracketExpr { _bracket :: Ann Bracket dom stage
}
| Splice { _innerExpr :: Ann Splice dom stage
}
| QuasiQuoteExpr { _exprQQ :: Ann QuasiQuote dom stage
}
| ExprPragma { _exprPragma :: Ann ExprPragma dom stage
}
| Proc { _procPattern :: Ann Pattern dom stage
, _procExpr :: Ann Cmd dom stage
}
| ArrowApp { _exprLhs :: Ann Expr dom stage
, _arrowAppl :: Ann ArrowAppl dom stage
, _exprRhs :: Ann Expr dom stage
}
| LamCase { _exprAlts :: AnnList Alt dom stage
}
| StaticPtr { _exprInner :: Ann Expr dom stage
}
data FieldUpdate dom stage
= NormalFieldUpdate { _fieldName :: Ann Name dom stage
, _fieldValue :: Ann Expr dom stage
}
| FieldPun { _fieldUpdateName :: Ann Name dom stage
}
| FieldWildcard { _fieldWildcard :: Ann FieldWildcard dom stage
}
data FieldWildcard dom stage = FldWildcard
data TupSecElem dom stage
= Present { _tupSecExpr :: Ann Expr dom stage
}
| Missing
data Alt' expr dom stage
= Alt { _altPattern :: Ann Pattern dom stage
, _altRhs :: Ann (CaseRhs' expr) dom stage
, _altBinds :: AnnMaybe LocalBinds dom stage
}
type Alt = Alt' Expr
type CmdAlt = Alt' Cmd
data CaseRhs' expr dom stage
= UnguardedCaseRhs { _rhsCaseExpr :: Ann expr dom stage
}
| GuardedCaseRhss { _rhsCaseGuards :: AnnList (GuardedCaseRhs' expr) dom stage
}
type CaseRhs = CaseRhs' Expr
type CmdCaseRhs = CaseRhs' Cmd
data GuardedCaseRhs' expr dom stage
= GuardedCaseRhs { _caseGuardStmts :: AnnList RhsGuard dom stage
, _caseGuardExpr :: Ann expr dom stage
}
type GuardedCaseRhs = GuardedCaseRhs' Expr
type CmdGuardedCaseRhs = GuardedCaseRhs' Cmd
data ExprPragma dom stage
= CorePragma { _pragmaStr :: Ann StringNode dom stage
}
| SccPragma { _pragmaStr :: Ann StringNode dom stage
}
| GeneratedPragma { _pragmaSrcRange :: Ann SourceRange dom stage
}
data SourceRange dom stage
= SourceRange { _srFileName :: Ann StringNode dom stage
, _srFromLine :: Ann Number dom stage
, _srFromCol :: Ann Number dom stage
, _srToLine :: Ann Number dom stage
, _srToCol :: Ann Number dom stage
}
data Number dom stage
= Number { _numberInteger :: Integer
}
data Cmd dom stage
= ArrowAppCmd { _cmdLhs :: Ann Expr dom stage
, _cmdArrowOp :: Ann ArrowAppl dom stage
, _cmdRhs :: Ann Expr dom stage
}
| ArrowFormCmd { _cmdExpr :: Ann Expr dom stage
, _cmdInnerCmds :: AnnList Cmd dom stage
}
| AppCmd { _cmdInnerCmd :: Ann Cmd dom stage
, _cmdApplied :: Ann Expr dom stage
}
| InfixCmd { _cmdLeftCmd :: Ann Cmd dom stage
, _cmdOperator :: Ann Name dom stage
, _cmdRightCmd :: Ann Cmd dom stage
}
| LambdaCmd { _cmdBindings :: AnnList Pattern dom stage
, _cmdInner :: Ann Cmd dom stage
}
| ParenCmd { _cmdInner :: Ann Cmd dom stage
}
| CaseCmd { _cmdExpr :: Ann Expr dom stage
, _cmdAlts :: AnnList CmdAlt dom stage
}
| IfCmd { _cmdExpr :: Ann Expr dom stage
, _cmdThen :: Ann Cmd dom stage
, _cmdElse :: Ann Cmd dom stage
}
| LetCmd { _cmdBinds :: AnnList LocalBind dom stage
, _cmdInner :: Ann Cmd dom stage
}
| DoCmd { _cmdStmts :: AnnList (Stmt' Cmd) dom stage
}