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