module Language.Haskell.Tools.AST.Representation.Decls where
import Language.Haskell.Tools.AST.Ann (Ann, AnnListG, AnnMaybeG)
import Language.Haskell.Tools.AST.Representation.Binds
import Language.Haskell.Tools.AST.Representation.Exprs (UExpr)
import Language.Haskell.Tools.AST.Representation.Kinds (UKindConstraint)
import Language.Haskell.Tools.AST.Representation.Names
import Language.Haskell.Tools.AST.Representation.Patterns (UPattern)
import Language.Haskell.Tools.AST.Representation.TH (USplice)
import Language.Haskell.Tools.AST.Representation.Types (UContext, UType, UTyVar)
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
, _declSpec :: AnnMaybeG UTypeFamilySpec 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
, _declForeignType :: Ann UType dom stage
}
| UForeignExport { _declCallConv :: Ann UCallConv dom stage
, _declName :: Ann UName dom stage
, _declForeignType :: 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
}
| UClsFixity { _clsFixity :: Ann UFixitySignature 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
}
| UClsInline { _clsInline :: Ann UInlinePragma 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 UOperator 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
}
| UInlineInstance { _instanceInline :: Ann UInlinePragma dom stage
}
| UInstanceSpecialize { _specializeInstance :: Ann USpecializePragma 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 UTyVar 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
, _gadtConTypeArgs :: AnnListG UTyVar dom stage
, _gadtConTypeCtx :: AnnMaybeG UContext 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 { _conTypeArgs :: AnnListG UTyVar dom stage
, _conTypeCtx :: AnnMaybeG UContext dom stage
, _conDeclName :: Ann UName dom stage
, _conDeclArgs :: AnnListG UType dom stage
}
| URecordDecl { _conTypeArgs :: AnnListG UTyVar dom stage
, _conTypeCtx :: AnnMaybeG UContext dom stage
, _conDeclName :: Ann UName dom stage
, _conDeclFields :: AnnListG UFieldDecl dom stage
}
| UInfixConDecl { _conTypeArgs :: AnnListG UTyVar dom stage
, _conTypeCtx :: AnnMaybeG UContext dom stage
, _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 UTopLevelPragma dom stage
= URulePragma { _pragmaRule :: AnnListG URule dom stage
}
| UDeprPragma { _pragmaObjects :: AnnListG UName dom stage
, _deprMessage :: AnnListG UStringNode dom stage
}
| UWarningPragma { _pragmaObjects :: AnnListG UName dom stage
, _warnMessage :: AnnListG UStringNode dom stage
}
| UAnnPragma { _annotationSubject :: Ann UAnnotationSubject dom stage
, _annotateExpr :: Ann UExpr dom stage
}
| UInlinePragmaDecl { _pragmaInline :: Ann UInlinePragma dom stage }
| ULinePragma { _pragmaLineNum :: Ann LineNumber dom stage
, _pragmaFileName :: AnnMaybeG UStringNode dom stage
}
| USpecializeDecl { _specializePragma :: Ann USpecializePragma dom stage }
data USpecializePragma 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 URuleVar dom stage
, _ruleLhs :: Ann UExpr dom stage
, _ruleRhs :: Ann UExpr dom stage
}
data URuleVar dom stage
= URuleVar { _ruleVarName :: Ann UName dom stage
}
| USigRuleVar { _ruleVarName :: Ann UName dom stage
, _ruleVarType :: Ann UType 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 LineNumber dom stage
= LineNumber { _lineNumber :: Int }