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 {-# SOURCE #-} 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 :: AnnListG 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 :: AnnListG 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 :: AnnListG 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 { _declDerivStrat :: AnnMaybeG UDeriveStrategy dom stage
, _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 :: AnnListG 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 :: AnnListG 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
}
| UTypeFamilyTyVar { _tfTypeVar :: Ann UTyVar 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 { _deriveStrategy :: AnnMaybeG UDeriveStrategy dom stage
, _oneDerived :: Ann UInstanceHead dom stage
}
| UDerivings { _deriveStrategy :: AnnMaybeG UDeriveStrategy dom stage
, _allDerived :: AnnListG UInstanceHead dom stage
}
data UDeriveStrategy dom stage
= UStockStrategy
| UAnyClassStrategy
| UNewtypeStrategy
data UPatternTypeSignature dom stage
= UPatternTypeSignature { _patSigName :: AnnListG 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 }
| UCompletePragma { _pragmaObjects :: AnnListG UName dom stage
, _pragmaSignature :: AnnMaybeG UName 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 }