module Language.Haskell.Tools.AST.Representation.Exprs where
import Language.Haskell.Tools.AST.Ann (Ann, AnnListG, AnnMaybeG)
import Language.Haskell.Tools.AST.Representation.Binds (ULocalBind, ULocalBinds, URhsGuard)
import Language.Haskell.Tools.AST.Representation.Literals (ULiteral)
import Language.Haskell.Tools.AST.Representation.Names (UStringNode, UName, UOperator)
import Language.Haskell.Tools.AST.Representation.Patterns (UPattern)
import Language.Haskell.Tools.AST.Representation.Stmts
import Language.Haskell.Tools.AST.Representation.TH (UBracket, UQuasiQuote, USplice)
import Language.Haskell.Tools.AST.Representation.Types (UType)
data UExpr dom stage
= UVar { _exprName :: Ann UName dom stage
}
| ULit { _exprLit :: Ann ULiteral dom stage
}
| UInfixApp { _exprLhs :: Ann UExpr dom stage
, _exprOperator :: Ann UOperator dom stage
, _exprRhs :: Ann UExpr dom stage
}
| UPrefixApp { _exprOperator :: Ann UOperator dom stage
, _exprRhs :: Ann UExpr dom stage
}
| UApp { _exprFun :: Ann UExpr dom stage
, _exprArg :: Ann UExpr dom stage
}
| ULambda { _exprBindings :: AnnListG UPattern dom stage
, _exprInner :: Ann UExpr dom stage
}
| ULet { _exprFunBind :: AnnListG ULocalBind dom stage
, _exprInner :: Ann UExpr dom stage
}
| UIf { _exprCond :: Ann UExpr dom stage
, _exprThen :: Ann UExpr dom stage
, _exprElse :: Ann UExpr dom stage
}
| UMultiIf { _exprIfAlts :: AnnListG UGuardedCaseRhs dom stage
}
| UCase { _exprCase :: Ann UExpr dom stage
, _exprAlts :: AnnListG UAlt dom stage
}
| UDo { _doKind :: Ann UDoKind dom stage
, _exprStmts :: AnnListG UStmt dom stage
}
| UTuple { _tupleElems :: AnnListG UExpr dom stage
}
| UUnboxedTuple { _tupleElems :: AnnListG UExpr dom stage
}
| UTupleSection { _tupleSectionElems :: AnnListG UTupSecElem dom stage
}
| UUnboxedTupSec { _tupleSectionElems :: AnnListG UTupSecElem dom stage
}
| UList { _listElems :: AnnListG UExpr dom stage
}
| UParArray { _listElems :: AnnListG UExpr dom stage
}
| UParen { _exprInner :: Ann UExpr dom stage
}
| ULeftSection { _exprLhs :: Ann UExpr dom stage
, _exprOperator :: Ann UOperator dom stage
}
| URightSection { _exprOperator :: Ann UOperator dom stage
, _exprRhs :: Ann UExpr dom stage
}
| URecCon { _exprRecName :: Ann UName dom stage
, _exprRecFields :: AnnListG UFieldUpdate dom stage
}
| URecUpdate { _exprInner :: Ann UExpr dom stage
, _exprRecFields :: AnnListG UFieldUpdate dom stage
}
| UEnum { _enumFrom :: Ann UExpr dom stage
, _enumThen :: AnnMaybeG UExpr dom stage
, _enumTo :: AnnMaybeG UExpr dom stage
}
| UParArrayEnum { _enumFrom :: Ann UExpr dom stage
, _enumThen :: AnnMaybeG UExpr dom stage
, _enumToFix :: Ann UExpr dom stage
}
| UListComp { _compExpr :: Ann UExpr dom stage
, _compBody :: AnnListG UListCompBody dom stage
}
| UParArrayComp { _compExpr :: Ann UExpr dom stage
, _compBody :: AnnListG UListCompBody dom stage
}
| UTypeSig { _exprInner :: Ann UExpr dom stage
, _exprSig :: Ann UType dom stage
}
| UExplTypeApp { _exprInner :: Ann UExpr dom stage
, _exprType :: Ann UType dom stage
}
| UVarQuote { _quotedName :: Ann UName dom stage
}
| UTypeQuote { _quotedName :: Ann UName dom stage
}
| UBracketExpr { _exprBracket :: Ann UBracket dom stage
}
| USplice { _exprSplice :: Ann USplice dom stage
}
| UQuasiQuoteExpr { _exprQQ :: Ann UQuasiQuote dom stage
}
| UExprPragma { _exprPragma :: Ann UExprPragma dom stage
, _innerExpr :: Ann UExpr dom stage
}
| UProc { _procPattern :: Ann UPattern dom stage
, _procExpr :: Ann UCmd dom stage
}
| UArrowApp { _exprLhs :: Ann UExpr dom stage
, _arrowAppl :: Ann UArrowAppl dom stage
, _exprRhs :: Ann UExpr dom stage
}
| ULamCase { _exprAlts :: AnnListG UAlt dom stage
}
| UStaticPtr { _exprInner :: Ann UExpr dom stage
}
data UFieldUpdate dom stage
= UNormalFieldUpdate { _fieldName :: Ann UName dom stage
, _fieldValue :: Ann UExpr dom stage
}
| UFieldPun { _fieldUpdateName :: Ann UName dom stage
}
| UFieldWildcard { _fieldWildcard :: Ann UFieldWildcard dom stage
}
data UFieldWildcard dom stage = FldWildcard
data UTupSecElem dom stage
= Present { _tupSecExpr :: Ann UExpr dom stage
}
| Missing
data UAlt' expr dom stage
= UAlt { _altPattern :: Ann UPattern dom stage
, _altRhs :: Ann (UCaseRhs' expr) dom stage
, _altBinds :: AnnMaybeG ULocalBinds dom stage
}
type UAlt = UAlt' UExpr
type UCmdAlt = UAlt' UCmd
data UCaseRhs' expr dom stage
= UUnguardedCaseRhs { _rhsCaseExpr :: Ann expr dom stage
}
| UGuardedCaseRhss { _rhsCaseGuards :: AnnListG (UGuardedCaseRhs' expr) dom stage
}
type UCaseRhs = UCaseRhs' UExpr
type UCmdCaseRhs = UCaseRhs' UCmd
data UGuardedCaseRhs' expr dom stage
= UGuardedCaseRhs { _caseGuardStmts :: AnnListG URhsGuard dom stage
, _caseGuardExpr :: Ann expr dom stage
}
type UGuardedCaseRhs = UGuardedCaseRhs' UExpr
type UCmdGuardedCaseRhs = UGuardedCaseRhs' UCmd
data UExprPragma dom stage
= UCorePragma { _pragmaStr :: Ann UStringNode dom stage
}
| USccPragma { _pragmaStr :: Ann UStringNode dom stage
}
| UGeneratedPragma { _pragmaSrcRange :: Ann USourceRange dom stage
}
data USourceRange dom stage
= USourceRange { _srFileName :: Ann UStringNode 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 UCmd dom stage
= UArrowAppCmd { _cmdLhs :: Ann UExpr dom stage
, _cmdArrowOp :: Ann UArrowAppl dom stage
, _cmdRhs :: Ann UExpr dom stage
}
| UArrowFormCmd { _cmdExpr :: Ann UExpr dom stage
, _cmdInnerCmds :: AnnListG UCmd dom stage
}
| UAppCmd { _cmdInnerCmd :: Ann UCmd dom stage
, _cmdApplied :: Ann UExpr dom stage
}
| UInfixCmd { _cmdLeftCmd :: Ann UCmd dom stage
, _cmdOperator :: Ann UName dom stage
, _cmdRightCmd :: Ann UCmd dom stage
}
| ULambdaCmd { _cmdBindings :: AnnListG UPattern dom stage
, _cmdInner :: Ann UCmd dom stage
}
| UParenCmd { _cmdInner :: Ann UCmd dom stage
}
| UCaseCmd { _cmdExpr :: Ann UExpr dom stage
, _cmdAlts :: AnnListG UCmdAlt dom stage
}
| UIfCmd { _cmdExpr :: Ann UExpr dom stage
, _cmdThen :: Ann UCmd dom stage
, _cmdElse :: Ann UCmd dom stage
}
| ULetCmd { _cmdBinds :: AnnListG ULocalBind dom stage
, _cmdInner :: Ann UCmd dom stage
}
| UDoCmd { _cmdStmts :: AnnListG UCmdStmt dom stage
}
data UArrowAppl dom stage
= ULeftAppl
| URightAppl
| ULeftHighApp
| URightHighApp