module Language.Haskell.Tools.AST.Representation.Decls where
import Language.Haskell.Tools.AST.Representation.Binds
import Language.Haskell.Tools.AST.Representation.Types
import Language.Haskell.Tools.AST.Representation.Patterns
import Language.Haskell.Tools.AST.Representation.Kinds
import Language.Haskell.Tools.AST.Representation.Exprs
import Language.Haskell.Tools.AST.Representation.Names
import Language.Haskell.Tools.AST.Representation.Literals
import Language.Haskell.Tools.AST.Ann
import Language.Haskell.Tools.AST.Representation.TH
data UDecl dom stage
= UTypeDecl { _declHead :: Ann UDeclHead dom stage
, _declType :: Ann UType dom stage
}
| UTypeFamilyDecl { _declTypeFamily :: Ann UTypeFamily dom stage
}
| UClosedTypeFamilyDecl { _declHead :: Ann UDeclHead dom stage
, _declKind :: AnnMaybeG UKindConstraint dom stage
, _declDecl :: AnnListG UTypeEqn dom stage
}
| UDataDecl { _declNewtype :: Ann UDataOrNewtypeKeyword dom stage
, _declCtx :: AnnMaybeG UContext dom stage
, _declHead :: Ann UDeclHead dom stage
, _declCons :: AnnListG UConDecl dom stage
, _declDeriving :: AnnMaybeG UDeriving dom stage
}
| UGDataDecl { _declNewtype :: Ann UDataOrNewtypeKeyword dom stage
, _declCtx :: AnnMaybeG UContext dom stage
, _declHead :: Ann UDeclHead dom stage
, _declKind :: AnnMaybeG UKindConstraint dom stage
, _declGadt :: AnnListG UGadtConDecl dom stage
, _declDeriving :: AnnMaybeG UDeriving dom stage
}
| UTypeInstDecl { _declInstance :: Ann UInstanceRule dom stage
, _declAssignedType :: Ann UType dom stage
}
| UDataInstDecl { _declNewtype :: Ann UDataOrNewtypeKeyword dom stage
, _declInstance :: Ann UInstanceRule dom stage
, _declCons :: AnnListG UConDecl dom stage
, _declDeriving :: AnnMaybeG UDeriving dom stage
}
| UGDataInstDecl { _declNewtype :: Ann UDataOrNewtypeKeyword dom stage
, _declInstance :: Ann UInstanceRule dom stage
, _declKind :: AnnMaybeG UKindConstraint dom stage
, _declGadt :: AnnListG UGadtConDecl dom stage
}
| UClassDecl { _declCtx :: AnnMaybeG UContext dom stage
, _declHead :: Ann UDeclHead dom stage
, _declFunDeps :: AnnMaybeG UFunDeps dom stage
, _declBody :: AnnMaybeG UClassBody dom stage
}
| UInstDecl { _declOverlap :: AnnMaybeG UOverlapPragma dom stage
, _declInstRule :: Ann UInstanceRule dom stage
, _declInstDecl :: AnnMaybeG UInstBody dom stage
}
| UPatternSynonymDecl { _declPatSyn :: Ann UPatternSynonym dom stage
}
| UDerivDecl { _declOverlap :: AnnMaybeG UOverlapPragma dom stage
, _declInstRule :: Ann UInstanceRule dom stage
}
| UFixityDecl { _declFixity :: Ann UFixitySignature dom stage
}
| UDefaultDecl { _declTypes :: AnnListG UType dom stage
}
| UTypeSigDecl { _declTypeSig :: Ann UTypeSignature dom stage
}
| UPatTypeSigDecl { _declPatTypeSig :: Ann UPatternTypeSignature dom stage
}
| UValueBinding { _declValBind :: Ann UValueBind dom stage
}
| UForeignImport { _declCallConv :: Ann UCallConv dom stage
, _declSafety :: AnnMaybeG USafety dom stage
, _declName :: Ann UName dom stage
, _declType :: Ann UType dom stage
}
| UForeignExport { _declCallConv :: Ann UCallConv dom stage
, _declName :: Ann UName dom stage
, _declType :: Ann UType dom stage
}
| UPragmaDecl { _declPragma :: Ann UTopLevelPragma dom stage
}
| URoleDecl { _declRoleType :: Ann UQualifiedName dom stage
, _declRoles :: AnnListG URole dom stage
}
| USpliceDecl { _declSplice :: Ann USplice dom stage
}
data UDeclHead dom stage
= UDeclHead { _dhName :: Ann UName dom stage
}
| UDHParen { _dhBody :: Ann UDeclHead dom stage
}
| UDHApp { _dhAppFun :: Ann UDeclHead dom stage
, _dhAppOperand :: Ann UTyVar dom stage
}
| UDHInfix { _dhLeft :: Ann UTyVar dom stage
, _dhOperator :: Ann UOperator dom stage
, _dhRight :: Ann UTyVar dom stage
}
data UClassBody dom stage
= UClassBody { _cbElements :: AnnListG UClassElement dom stage
}
data UClassElement dom stage
= UClsSig { _ceTypeSig :: Ann UTypeSignature dom stage
}
| UClsDef { _ceBind :: Ann UValueBind dom stage
}
| UClsTypeFam { _ceTypeFam :: Ann UTypeFamily dom stage
}
| UClsTypeDef { _ceHead :: Ann UDeclHead dom stage
, _ceKind :: Ann UType dom stage
}
| UClsDefSig { _ceName :: Ann UName dom stage
, _ceType :: Ann UType dom stage
}
| UClsMinimal { _pragmaFormula :: Ann UMinimalFormula dom stage
}
data UInstanceRule dom stage
= UInstanceRule { _irVars :: AnnMaybeG (AnnListG UTyVar) dom stage
, _irCtx :: AnnMaybeG UContext dom stage
, _irHead :: Ann UInstanceHead dom stage
}
data UInstanceHead dom stage
= UInstanceHeadCon { _ihConName :: Ann UName dom stage
}
| UInstanceHeadInfix { _ihLeftOp :: Ann UType dom stage
, _ihOperator :: Ann UName dom stage
}
| UInstanceHeadParen { _ihHead :: Ann UInstanceHead dom stage
}
| UInstanceHeadApp { _ihFun :: Ann UInstanceHead dom stage
, _ihType :: Ann UType dom stage
}
data UInstBody dom stage
= UInstBody { _instBodyDecls :: AnnListG UInstBodyDecl dom stage
}
data UInstBodyDecl dom stage
= UInstBodyNormalDecl { _instBodyDeclFunbind :: Ann UValueBind dom stage
}
| UInstBodyTypeSig { _instBodyTypeSig :: Ann UTypeSignature dom stage
}
| UInstBodyTypeDecl { _instBodyTypeEqn :: Ann UTypeEqn dom stage
}
| UInstBodyDataDecl { _instBodyDataNew :: Ann UDataOrNewtypeKeyword dom stage
, _instBodyLhsType :: Ann UInstanceRule dom stage
, _instBodyDataCons :: AnnListG UConDecl dom stage
, _instBodyDerivings :: AnnMaybeG UDeriving dom stage
}
| UInstBodyGadtDataDecl { _instBodyDataNew :: Ann UDataOrNewtypeKeyword dom stage
, _instBodyLhsType :: Ann UInstanceRule dom stage
, _instBodyDataKind :: AnnMaybeG UKindConstraint dom stage
, _instBodyGadtCons :: AnnListG UGadtConDecl dom stage
, _instBodyDerivings :: AnnMaybeG UDeriving dom stage
}
| USpecializeInstance { _specializeInstanceType :: Ann UType dom stage
}
data UOverlapPragma dom stage
= UEnableOverlap
| UDisableOverlap
| UOverlappable
| UOverlapping
| UOverlaps
| UIncoherentOverlap
data UTypeFamily dom stage
= UTypeFamily { _tfHead :: Ann UDeclHead dom stage
, _tfSpec :: AnnMaybeG UTypeFamilySpec dom stage
}
| UDataFamily { _tfHead :: Ann UDeclHead dom stage
, _tfKind :: AnnMaybeG UKindConstraint dom stage
}
data UTypeFamilySpec dom stage
= UTypeFamilyKind { _tfSpecKind :: Ann UKindConstraint dom stage
}
| UTypeFamilyInjectivity { _tfInjectivity :: Ann UInjectivityAnn dom stage
}
data UInjectivityAnn dom stage
= UInjectivityAnn { _injAnnRes :: Ann UName dom stage
, _injAnnDeps :: AnnListG UName dom stage
}
data UTypeEqn dom stage
= UTypeEqn { _teLhs :: Ann UType dom stage
, _teRhs :: Ann UType dom stage
}
data UGadtConDecl dom stage
= UGadtConDecl { _gadtConNames :: AnnListG UName dom stage
, _gadtConType :: Ann UGadtConType dom stage
}
data UDataOrNewtypeKeyword dom stage
= UDataKeyword
| UNewtypeKeyword
data UGadtConType dom stage
= UGadtNormalType { _gadtConNormalType :: Ann UType dom stage
}
| UGadtRecordType { _gadtConRecordFields :: AnnListG UFieldDecl dom stage
, _gadtConResultType :: Ann UType dom stage
}
data UFunDeps dom stage
= UFunDeps { _funDeps :: AnnListG UFunDep dom stage
}
data UFunDep dom stage
= UFunDep { _funDepLhs :: AnnListG UName dom stage
, _funDepRhs :: AnnListG UName dom stage
}
data UConDecl dom stage
= UConDecl { _conDeclName :: Ann UName dom stage
, _conDeclArgs :: AnnListG UType dom stage
}
| URecordDecl { _conDeclName :: Ann UName dom stage
, _conDeclFields :: AnnListG UFieldDecl dom stage
}
| UInfixConDecl { _conDeclLhs :: Ann UType dom stage
, _conDeclOp :: Ann UOperator dom stage
, _conDeclRhs :: Ann UType dom stage
}
data UFieldDecl dom stage
= UFieldDecl { _fieldNames :: AnnListG UName dom stage
, _fieldType :: Ann UType dom stage
}
data UDeriving dom stage
= UDerivingOne { _oneDerived :: Ann UInstanceHead dom stage }
| UDerivings { _allDerived :: AnnListG UInstanceHead dom stage }
data UPatternTypeSignature dom stage
= UPatternTypeSignature { _patSigName :: Ann UName dom stage
, _patSigType :: Ann UType dom stage
}
data UPatternSynonym dom stage
= UPatternSynonym { _patLhs :: Ann UPatSynLhs dom stage
, _patRhs :: Ann UPatSynRhs dom stage
}
data UPatSynLhs dom stage
= UNormalPatSyn { _patName :: Ann UName dom stage
, _patArgs :: AnnListG UName dom stage
}
| UInfixPatSyn { _patSynLhs :: Ann UName dom stage
, _patSynOp :: Ann UOperator dom stage
, _patSynRhs :: Ann UName dom stage
}
| URecordPatSyn { _patName :: Ann UName dom stage
, _patArgs :: AnnListG UName dom stage
}
data UPatSynRhs dom stage
= UBidirectionalPatSyn { _patRhsPat :: Ann UPattern dom stage
, _patRhsOpposite :: AnnMaybeG UPatSynWhere dom stage
}
| UOneDirectionalPatSyn { _patRhsPat :: Ann UPattern dom stage
}
data UPatSynWhere dom stage
= UPatSynWhere { _patOpposite :: AnnListG UMatch dom stage }
data UCallConv dom stage
= UStdCall
| UCCall
| UCPlusPlus
| UDotNet
| UJvm
| UJs
| UJavaScript
| UCApi
data USafety dom stage
= USafe
| UThreadSafe
| UUnsafe
| UInterruptible
data URole dom stage
= UNominal
| URepresentational
| UPhantom
data UPhaseControl dom stage
= UPhaseControl { _phaseUntil :: AnnMaybeG PhaseInvert dom stage
, _phaseNumber :: Ann PhaseNumber dom stage
}
data PhaseNumber dom stage
= PhaseNumber { _phaseNum :: Integer }
data PhaseInvert dom stage = PhaseInvert
data UTopLevelPragma dom stage
= URulePragma { _pragmaRule :: AnnListG URule dom stage
}
| UDeprPragma { _pragmaObjects :: AnnListG UName dom stage
, _pragmaMessage :: Ann UStringNode dom stage
}
| UWarningPragma { _pragmaObjects :: AnnListG UName dom stage
, _pragmaMessage :: Ann UStringNode dom stage
}
| UAnnPragma { _annotationSubject :: Ann UAnnotationSubject dom stage
, _annotateExpr :: Ann UExpr dom stage
}
| UInlinePragma { _pragmaConlike :: AnnMaybeG UConlikeAnnot dom stage
, _pragmaPhase :: AnnMaybeG UPhaseControl dom stage
, _inlineDef :: Ann UName dom stage
}
| UNoInlinePragma { _pragmaConlike :: AnnMaybeG UConlikeAnnot dom stage
, _pragmaPhase :: AnnMaybeG UPhaseControl dom stage
, _noInlineDef :: Ann UName dom stage
}
| UInlinablePragma { _pragmaPhase :: AnnMaybeG UPhaseControl dom stage
, _inlinableDef :: Ann UName dom stage
}
| ULinePragma { _pragmaLineNum :: Ann LineNumber dom stage
, _pragmaFileName :: AnnMaybeG UStringNode dom stage
}
| USpecializePragma { _pragmaPhase :: AnnMaybeG UPhaseControl dom stage
, _specializeDef :: Ann UName dom stage
, _specializeType :: AnnListG UType dom stage
}
data URule dom stage
= URule { _ruleName :: Ann UStringNode dom stage
, _rulePhase :: AnnMaybeG UPhaseControl dom stage
, _ruleBounded :: AnnListG UTyVar dom stage
, _ruleLhs :: Ann UExpr dom stage
, _ruleRhs :: Ann UExpr dom stage
}
data UAnnotationSubject dom stage
= UNameAnnotation { _annotateName :: Ann UName dom stage
}
| UTypeAnnotation { _annotateName :: Ann UName dom stage
}
| UModuleAnnotation
data UMinimalFormula dom stage
= UMinimalName { _minimalName :: Ann UName dom stage
}
| UMinimalParen { _minimalInner :: Ann UMinimalFormula dom stage
}
| UMinimalOr { _minimalOrs :: AnnListG UMinimalFormula dom stage
}
| UMinimalAnd { _minimalAnds :: AnnListG UMinimalFormula dom stage
}
data UConlikeAnnot dom stage = UConlikeAnnot
data LineNumber dom stage
= LineNumber { _lineNumber :: Int }