module Language.Haskell.Tools.AST.Binds where
import Language.Haskell.Tools.AST.Ann
import Language.Haskell.Tools.AST.Base
import Language.Haskell.Tools.AST.Patterns
import Language.Haskell.Tools.AST.Exprs
import Language.Haskell.Tools.AST.Types
import Language.Haskell.Tools.AST.Literals
import Language.Haskell.Tools.AST.TH
data ValueBind dom stage
= SimpleBind { _valBindPat :: Ann Pattern dom stage
, _valBindRhs :: Ann Rhs dom stage
, _valBindLocals :: AnnMaybe LocalBinds dom stage
}
| FunBind { _funBindMatches :: AnnList Match dom stage
}
data Match dom stage
= Match { _matchLhs :: Ann MatchLhs dom stage
, _matchRhs :: Ann Rhs dom stage
, _matchBinds :: AnnMaybe LocalBinds dom stage
}
data MatchLhs dom stage
= NormalLhs { _matchLhsName :: Ann Name dom stage
, _matchLhsArgs :: AnnList Pattern dom stage
}
| InfixLhs { _matchLhsLhs :: Ann Pattern dom stage
, _matchLhsOperator :: Ann Operator dom stage
, _matchLhsRhs :: Ann Pattern dom stage
, _matchLhsArgs :: AnnList Pattern dom stage
}
data LocalBinds dom stage
= LocalBinds { _localBinds :: AnnList LocalBind dom stage
}
data LocalBind dom stage
= LocalValBind { _localVal :: Ann ValueBind dom stage
}
| LocalSignature { _localSig :: Ann TypeSignature dom stage
}
| LocalFixity { _localFixity :: Ann FixitySignature dom stage
}
data TypeSignature dom stage
= TypeSignature { _tsName :: AnnList Name dom stage
, _tsType :: Ann Type dom stage
}
data FixitySignature dom stage
= FixitySignature { _fixityAssoc :: Ann Assoc dom stage
, _fixityPrecedence :: Ann Precedence dom stage
, _fixityOperators :: AnnList Operator dom stage
}
data Rhs dom stage
= UnguardedRhs { _rhsExpr :: Ann Expr dom stage
}
| GuardedRhss { _rhsGuards :: AnnList GuardedRhs dom stage
}
data GuardedRhs dom stage
= GuardedRhs { _guardStmts :: AnnList RhsGuard dom stage
, _guardExpr :: Ann Expr dom stage
}
data RhsGuard dom stage
= GuardBind { _guardPat :: Ann Pattern dom stage
, _guardRhs :: Ann Expr dom stage
}
| GuardLet { _guardBinds :: AnnList LocalBind dom stage
}
| GuardCheck { _guardCheck :: Ann Expr dom stage
}
data TopLevelPragma dom stage
= RulePragma { _pragmaRule :: AnnList Rule dom stage
}
| DeprPragma { _pragmaObjects :: AnnList Name dom stage
, _pragmaMessage :: Ann StringNode dom stage
}
| WarningPragma { _pragmaObjects :: AnnList Name dom stage
, _pragmaMessage :: Ann StringNode dom stage
}
| AnnPragma { _annotationSubject :: Ann AnnotationSubject dom stage
, _annotateExpr :: Ann Expr dom stage
}
| InlinePragma { _pragmaConlike :: AnnMaybe ConlikeAnnot dom stage
, _pragmaPhase :: AnnMaybe PhaseControl dom stage
, _inlineDef :: Ann Name dom stage
}
| NoInlinePragma { _pragmaConlike :: AnnMaybe ConlikeAnnot dom stage
, _pragmaPhase :: AnnMaybe PhaseControl dom stage
, _noInlineDef :: Ann Name dom stage
}
| InlinablePragma { _pragmaPhase :: AnnMaybe PhaseControl dom stage
, _inlinableDef :: Ann Name dom stage
}
| LinePragma { _pragmaLineNum :: Ann LineNumber dom stage
, _pragmaFileName :: AnnMaybe StringNode dom stage
}
| SpecializePragma { _pragmaPhase :: AnnMaybe PhaseControl dom stage
, _specializeDef :: Ann Name dom stage
, _specializeType :: AnnList Type dom stage
}
data Rule dom stage
= Rule { _ruleName :: Ann StringNode dom stage
, _rulePhase :: AnnMaybe PhaseControl dom stage
, _ruleBounded :: AnnList TyVar dom stage
, _ruleLhs :: Ann Expr dom stage
, _ruleRhs :: Ann Expr dom stage
}
data AnnotationSubject dom stage
= NameAnnotation { _annotateName :: Ann Name dom stage
}
| TypeAnnotation { _annotateName :: Ann Name dom stage
}
| ModuleAnnotation
data MinimalFormula dom stage
= MinimalName { _minimalName :: Ann Name dom stage
}
| MinimalParen { _minimalInner :: Ann MinimalFormula dom stage
}
| MinimalOr { _minimalOrs :: AnnList MinimalFormula dom stage
}
| MinimalAnd { _minimalAnds :: AnnList MinimalFormula dom stage
}