module Language.Haskell.Tools.AST.Decls where
import Language.Haskell.Tools.AST.Binds
import Language.Haskell.Tools.AST.Types
import Language.Haskell.Tools.AST.Patterns
import Language.Haskell.Tools.AST.Kinds
import Language.Haskell.Tools.AST.Exprs
import Language.Haskell.Tools.AST.Base
import Language.Haskell.Tools.AST.Literals
import Language.Haskell.Tools.AST.Ann
import Language.Haskell.Tools.AST.TH
data Decl a
= TypeDecl { _declHead :: Ann DeclHead a
, _declType :: Ann Type a
}
| TypeFamilyDecl { _declTypeFamily :: Ann TypeFamily a
}
| ClosedTypeFamilyDecl { _declHead :: Ann DeclHead a
, _declKind :: AnnMaybe KindConstraint a
, _declDecl :: AnnList TypeEqn a
}
| DataDecl { _declNewtype :: Ann DataOrNewtypeKeyword a
, _declCtx :: AnnMaybe Context a
, _declHead :: Ann DeclHead a
, _declCons :: AnnList ConDecl a
, _declDeriving :: AnnMaybe Deriving a
}
| GDataDecl { _declNewtype :: Ann DataOrNewtypeKeyword a
, _declCtx :: AnnMaybe Context a
, _declHead :: Ann DeclHead a
, _declKind :: AnnMaybe KindConstraint a
, _declGadt :: AnnList GadtConDecl a
, _declDeriving :: AnnMaybe Deriving a
}
| TypeInstDecl { _declInstance :: Ann InstanceRule a
, _declAssignedType :: Ann Type a
}
| DataInstDecl { _declNewtype :: Ann DataOrNewtypeKeyword a
, _declInstance :: Ann InstanceRule a
, _declCons :: AnnList ConDecl a
, _declDeriving :: AnnMaybe Deriving a
}
| GDataInstDecl { _declNewtype :: Ann DataOrNewtypeKeyword a
, _declInstance :: Ann InstanceRule a
, _declKind :: AnnMaybe KindConstraint a
, _declGadt :: AnnList GadtConDecl a
}
| ClassDecl { _declCtx :: AnnMaybe Context a
, _declHead :: Ann DeclHead a
, _declFunDeps :: AnnMaybe FunDeps a
, _declBody :: AnnMaybe ClassBody a
}
| InstDecl { _declOverlap :: AnnMaybe OverlapPragma a
, _declInstRule :: Ann InstanceRule a
, _declInstDecl :: AnnMaybe InstBody a
}
| PatternSynonymDecl { _declPatSyn :: Ann PatternSynonym a
}
| DerivDecl { _declOverlap :: AnnMaybe OverlapPragma a
, _declInstRule :: Ann InstanceRule a
}
| FixityDecl { _declFixity :: Ann FixitySignature a
}
| DefaultDecl { _declTypes :: AnnList Type a
}
| TypeSigDecl { _declTypeSig :: Ann TypeSignature a
}
| PatTypeSigDecl { _declPatTypeSig :: Ann PatternTypeSignature a
}
| ValueBinding { _declValBind :: Ann ValueBind a
}
| ForeignImport { _declCallConv :: Ann CallConv a
, _declSafety :: AnnMaybe Safety a
, _declName :: Ann Name a
, _declType :: Ann Type a
}
| ForeignExport { _declCallConv :: Ann CallConv a
, _declName :: Ann Name a
, _declType :: Ann Type a
}
| PragmaDecl { _declPragma :: Ann TopLevelPragma a
}
| RoleDecl { _declRoleType :: Ann SimpleName a
, _declRoles :: AnnList Role a
}
| SpliceDecl { _declSplice :: Ann Splice a
}
data TypeFamily a
= TypeFamily { _tfHead :: Ann DeclHead a
, _tfSpec :: AnnMaybe TypeFamilySpec a
}
| DataFamily { _tfHead :: Ann DeclHead a
, _tfKind :: AnnMaybe KindConstraint a
}
data TypeFamilySpec a
= TypeFamilyKind { _tfSpecKind :: Ann KindConstraint a
}
| TypeFamilyInjectivity { _tfInjectivity :: Ann InjectivityAnn a
}
data InjectivityAnn a
= InjectivityAnn { _injAnnRes :: Ann Name a
, _injAnnDeps :: AnnList Name a
}
data ClassBody a
= ClassBody { _cbElements :: AnnList ClassElement a
}
data ClassElement a
= ClsSig { _ceTypeSig :: Ann TypeSignature a
}
| ClsDef { _ceBind :: Ann ValueBind a
}
| ClsTypeFam { _ceTypeFam :: Ann TypeFamily a
}
| ClsTypeDef { _ceHead :: Ann DeclHead a
, _ceKind :: Ann Type a
}
| ClsDefSig { _ceName :: Ann Name a
, _ceType :: Ann Type a
}
| ClsMinimal { _pragmaFormula :: Ann MinimalFormula a
}
| ClsPatSig { _cePatSig :: Ann PatternTypeSignature a
}
data DeclHead a
= DeclHead { _dhName :: Ann Name a
}
| DHParen { _dhBody :: Ann DeclHead a
}
| DHApp { _dhAppFun :: Ann DeclHead a
, _dhAppOperand :: Ann TyVar a
}
| DHInfix { _dhLeft :: Ann TyVar a
, _dhOperator :: Ann Operator a
, _dhRight :: Ann TyVar a
}
data InstBody a
= InstBody { _instBodyDecls :: AnnList InstBodyDecl a
}
data InstBodyDecl a
= InstBodyNormalDecl { _instBodyDeclFunbind :: Ann ValueBind a
}
| InstBodyTypeSig { _instBodyTypeSig :: Ann TypeSignature a
}
| InstBodyTypeDecl { _instBodyTypeEqn :: Ann TypeEqn a
}
| InstBodyDataDecl { _instBodyDataNew :: Ann DataOrNewtypeKeyword a
, _instBodyLhsType :: Ann InstanceRule a
, _instBodyDataCons :: AnnList ConDecl a
, _instBodyDerivings :: AnnMaybe Deriving a
}
| InstBodyGadtDataDecl { _instBodyDataNew :: Ann DataOrNewtypeKeyword a
, _instBodyLhsType :: Ann InstanceRule a
, _instBodyDataKind :: AnnMaybe Kind a
, _instBodyGadtCons :: AnnList GadtConDecl a
, _instBodyDerivings :: AnnMaybe Deriving a
}
| SpecializeInstance { _specializeInstanceType :: Ann Type a
}
| InstBodyPatSyn { _instBodyPatSyn :: Ann PatternSynonym a
}
data GadtConDecl a
= GadtConDecl { _gadtConNames :: AnnList Name a
, _gadtConType :: Ann GadtConType a
}
data GadtConType a
= GadtNormalType { _gadtConNormalType :: Ann Type a
}
| GadtRecordType { _gadtConRecordFields :: AnnList FieldDecl a
, _gadtConResultType :: Ann Type a
}
data GadtField a
= GadtNormalField { _gadtFieldType :: Ann Type a
}
| GadtNamedField { _gadtFieldName :: Ann Name a
, _gadtFieldType :: Ann Type a
}
data FunDeps a
= FunDeps { _funDeps :: AnnList FunDep a
}
data FunDep a
= FunDep { _funDepLhs :: AnnList Name a
, _funDepRhs :: AnnList Name a
}
data ConDecl a
= ConDecl { _conDeclName :: Ann Name a
, _conDeclArgs :: AnnList Type a
}
| RecordDecl { _conDeclName :: Ann Name a
, _conDeclFields :: AnnList FieldDecl a
}
| InfixConDecl { _conDeclLhs :: Ann Type a
, _conDeclOp :: Ann Operator a
, _conDeclRhs :: Ann Type a
}
data FieldDecl a
= FieldDecl { _fieldNames :: AnnList Name a
, _fieldType :: Ann Type a
}
data Deriving a
= DerivingOne { _oneDerived :: Ann InstanceHead a }
| Derivings { _allDerived :: AnnList InstanceHead a }
data InstanceRule a
= InstanceRule { _irVars :: AnnMaybe (AnnList TyVar) a
, _irCtx :: AnnMaybe Context a
, _irHead :: Ann InstanceHead a
}
| InstanceParen { _irRule :: Ann InstanceRule a
}
data InstanceHead a
= InstanceHeadCon { _ihConName :: Ann Name a
}
| InstanceHeadInfix { _ihLeftOp :: Ann Type a
, _ihOperator :: Ann Name a
}
| InstanceHeadParen { _ihHead :: Ann InstanceHead a
}
| InstanceHeadApp { _ihFun :: Ann InstanceHead a
, _ihType :: Ann Type a
}
data TypeEqn a
= TypeEqn { _teLhs :: Ann Type a
, _teRhs :: Ann Type a
}
data PatternTypeSignature a
= PatternTypeSignature { _patSigName :: Ann Name a
, _patSigType :: Ann Type a
}
data PatternSynonym a
= PatternSynonym { _patLhs :: Ann PatSynLhs a
, _patRhs :: Ann PatSynRhs a
}
data PatSynLhs a
= NormalPatSyn { _patName :: Ann Name a
, _patArgs :: AnnList Name a
}
| InfixPatSyn { _patSynLhs :: Ann Name a
, _patSynOp :: Ann Operator a
, _patSynRhs :: Ann Name a
}
| RecordPatSyn { _patName :: Ann Name a
, _patArgs :: AnnList Name a
}
data PatSynRhs a
= BidirectionalPatSyn { _patRhsPat :: Ann Pattern a
, _patRhsOpposite :: AnnMaybe PatSynWhere a
}
| OneDirectionalPatSyn { _patRhsPat :: Ann Pattern a
}
data PatSynWhere a
= PatSynWhere { _patOpposite :: AnnList Match a }