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