module Language.Haskell.Tools.Rewrite.ElementTypes where

import Language.Haskell.Tools.AST

type AnnList node = AnnListG node IdDom SrcTemplateStage
type AnnMaybe node = AnnMaybeG node IdDom SrcTemplateStage

-- * Modules


-- | The representation of a haskell module, that is a separate compilation unit.

-- It may or may not have a header.

type Module = Ann UModule IdDom SrcTemplateStage

-- | Module declaration with name and (optional) exports

type ModuleHead = Ann UModuleHead IdDom SrcTemplateStage

-- | A list of export specifications surrounded by parentheses

type ExportSpecs = Ann UExportSpecs IdDom SrcTemplateStage

-- | Export specifier

type ExportSpec = Ann UExportSpec IdDom SrcTemplateStage

-- | Marks a name to be imported or exported with related names (subspecifier)

type IESpec = Ann UIESpec IdDom SrcTemplateStage

-- | Specifies the imported element

type ImportModifier = Ann UImportModifier IdDom SrcTemplateStage

-- | Marks how related names will be imported or exported with a given name

type SubSpec = Ann USubSpec IdDom SrcTemplateStage

-- | Pragmas that must be used after the module head

type ModulePragma = Ann UModulePragma IdDom SrcTemplateStage

-- | Pragmas that must be used before defining the module

type FilePragma = Ann UFilePragma IdDom SrcTemplateStage

-- | An import declaration: @import Module.Name@

type ImportDecl = Ann UImportDecl IdDom SrcTemplateStage

-- | Restriction on the imported names

type ImportSpec = Ann UImportSpec IdDom SrcTemplateStage

-- | Marks the import as qualified: @qualified@

type ImportQualified = Ann UImportQualified IdDom SrcTemplateStage

-- | Marks the import as source: @{-\# SOURCE \#-}@

type ImportSource = Ann UImportSource IdDom SrcTemplateStage

-- | Marks the import as safe: @safe@

type ImportSafe = Ann UImportSafe IdDom SrcTemplateStage

-- | Marks an imported name to belong to the type namespace: @type@

type TypeNamespace = Ann UTypeNamespace IdDom SrcTemplateStage

-- | Renaming imports (@ as A @)

type ImportRenaming = Ann UImportRenaming IdDom SrcTemplateStage

-- | The name of a module

type ModuleName = Ann UModuleName IdDom SrcTemplateStage

-- | The name of the enabled language extension, for example (@ LambdaCase @)

type LanguageExtension = Ann ULanguageExtension IdDom SrcTemplateStage

-- * Declarations


-- | Haskell declaration

type Decl = Ann UDecl IdDom SrcTemplateStage

-- | The list of declarations that can appear in a typeclass

type ClassBody = Ann UClassBody IdDom SrcTemplateStage

-- | Members of a class declaration

type ClassElement = Ann UClassElement IdDom SrcTemplateStage

-- The declared (possibly parameterized) type (@ A x :+: B y @).

type DeclHead = Ann UDeclHead IdDom SrcTemplateStage

-- | Instance body is the implementation of the class functions (@ where a x = 1; b x = 2 @)

type InstBody = Ann UInstBody IdDom SrcTemplateStage

-- | Declarations inside an instance declaration.

type InstBodyDecl = Ann UInstBodyDecl IdDom SrcTemplateStage

-- | GADT constructor declaration (@ D1 :: { val :: Int } -> T String @)

type GadtConDecl = Ann UGadtConDecl IdDom SrcTemplateStage

-- | Type of GADT constructors (can be record types: @{ val :: Int }@)

type GadtConType = Ann UGadtConType IdDom SrcTemplateStage

-- | Marker for a field wildcard. Only needed to attach semantic information in a type-safe way.

type FieldWildcard = Ann UFieldWildcard IdDom SrcTemplateStage

-- | A list of functional dependencies: @ | a -> b, c -> d @ separated by commas

type FunDeps = Ann UFunDeps IdDom SrcTemplateStage

-- | A functional dependency, given on the form @l1 ... ln -> r1 ... rn@

type FunDep = Ann UFunDep IdDom SrcTemplateStage

-- | A constructor declaration for a datatype

type ConDecl = Ann UConDecl IdDom SrcTemplateStage

-- | The @data@ or the @newtype@ keyword to define ADTs.

type DataOrNewtypeKeyword = Ann UDataOrNewtypeKeyword IdDom SrcTemplateStage

-- | Field declaration (@ fld :: Int @)

type FieldDecl = Ann UFieldDecl IdDom SrcTemplateStage

-- | A deriving clause following a data type declaration. (@ deriving Show @ or @ deriving (Show, Eq) @)

type Deriving = Ann UDeriving IdDom SrcTemplateStage

-- | A deriving strategy (@stock@, @newtype@ or @anyclass@)

type DeriveStrategy = Ann UDeriveStrategy IdDom SrcTemplateStage

-- | The instance declaration rule, which is, roughly, the part of the instance declaration before the where keyword.

type InstanceRule = Ann UInstanceRule IdDom SrcTemplateStage

-- | The specification of the class instance declaration

type InstanceHead = Ann UInstanceHead IdDom SrcTemplateStage

-- | Specialize pragma (@ {-# SPECIALISE f :: Int -> b -> b #-} @)

type SpecializePragma = Ann USpecializePragma IdDom SrcTemplateStage

-- | Overlap pragmas. Can be applied to class declarations and class instance declarations.

type OverlapPragma = Ann UOverlapPragma IdDom SrcTemplateStage

-- | Type equations as found in closed type families (@ T A = S @)

type TypeEqn = Ann UTypeEqn IdDom SrcTemplateStage

-- | Top level pragmas

type TopLevelPragma = Ann UTopLevelPragma IdDom SrcTemplateStage

-- | A rewrite rule (@ "map/map" forall f g xs. map f (map g xs) = map (f.g) xs @)

type Rule = Ann URule IdDom SrcTemplateStage

-- | A variable for a rewrite rule. With or without type signature.

type RuleVar = Ann URuleVar IdDom SrcTemplateStage

-- | Annotation allows you to connect an expression to any declaration.

type AnnotationSubject = Ann UAnnotationSubject IdDom SrcTemplateStage

-- | Formulas of minimal annotations declaring which functions should be defined.

type MinimalFormula = Ann UMinimalFormula IdDom SrcTemplateStage

-- | In-AST source ranges (for generated pragmas)

type SourceRange = Ann USourceRange IdDom SrcTemplateStage

-- | Open type and data families

type TypeFamily = Ann UTypeFamily IdDom SrcTemplateStage

-- | Type family specification with kinds specification and injectivity.

type TypeFamilySpec = Ann UTypeFamilySpec IdDom SrcTemplateStage

-- | Injectivity annotation for type families (@ = r | r -> a @)

type InjectivityAnn = Ann UInjectivityAnn IdDom SrcTemplateStage

-- | Pattern synonyms: @ pattern Arrow t1 t2 = App "->" [t1, t2] @

type PatternSynonym = Ann UPatternSynonym IdDom SrcTemplateStage

-- | Right-hand side of pattern synonym

type PatSynRhs = Ann UPatSynRhs IdDom SrcTemplateStage

-- | Left hand side of a pattern synonym

type PatSynLhs = Ann UPatSynLhs IdDom SrcTemplateStage

-- | Where clause of pattern synonym (explicit expression direction)

type PatSynWhere = Ann UPatSynWhere IdDom SrcTemplateStage

-- | Pattern type signature declaration (@ pattern Succ :: Int -> Int @)

type PatternSignature = Ann UPatternTypeSignature IdDom SrcTemplateStage

-- | Role annotations for types

type Role = Ann URole IdDom SrcTemplateStage

-- | Call conventions of foreign functions

type CallConv = Ann UCallConv IdDom SrcTemplateStage

-- | Safety annotations for foreign calls

type Safety = Ann USafety IdDom SrcTemplateStage

-- | A @CONLIKE@ modifier for an @INLINE@ pragma.

type ConlikeAnnot = Ann UConlikeAnnot IdDom SrcTemplateStage

-- | Controls the activation of a rewrite rule (@ [1] @)

type PhaseControl = Ann UPhaseControl IdDom SrcTemplateStage

-- * Binds


-- | Value binding for top-level and local bindings

type ValueBind = Ann UValueBind IdDom SrcTemplateStage

-- | Clause of function binding

type Match = Ann UMatch IdDom SrcTemplateStage

-- | Something on the left side of the match

type MatchLhs = Ann UMatchLhs IdDom SrcTemplateStage

-- | Right hand side of a value binding (possible with guards): (@ = 3 @ or @ | x == 1 = 3; | otherwise = 4 @)

type Rhs = Ann URhs IdDom SrcTemplateStage

-- | A guarded right-hand side of a value binding (@ | x > 3 = 2 @)

type GuardedRhs = Ann UGuardedRhs IdDom SrcTemplateStage

-- | Guards for value bindings and pattern matches (@ Just v <- x, v > 1 @)

type RhsGuard = Ann URhsGuard IdDom SrcTemplateStage

-- | Bindings that are enabled in local blocks (where or let).

type LocalBind = Ann ULocalBind IdDom SrcTemplateStage

-- | Local bindings attached to a declaration (@ where x = 42 @)

type LocalBinds = Ann ULocalBinds IdDom SrcTemplateStage

-- | A fixity signature (@ infixl 5 +, - @).

type FixitySignature = Ann UFixitySignature IdDom SrcTemplateStage

-- | A type signature (@ f :: Int -> Int @)

type TypeSignature = Ann UTypeSignature IdDom SrcTemplateStage

-- * Types


-- | Haskell types

type Type = Ann UType IdDom SrcTemplateStage

-- | Type variable declarations (with possible kind annotation)

type TyVar = Ann UTyVar IdDom SrcTemplateStage

-- One or more assertions

type Context = Ann UContext IdDom SrcTemplateStage

-- | A single assertion in the context

type Assertion = Ann UAssertion IdDom SrcTemplateStage

-- * Kinds


-- | Kind constraint (@ :: * -> * @)

type KindConstraint = Ann UKindConstraint IdDom SrcTemplateStage

-- | Haskell kinds

type Kind = Ann UKind IdDom SrcTemplateStage

-- | Values promoted to the kind level

type PromotedKind = Ann (UPromoted UKind) IdDom SrcTemplateStage

-- * Expressions


-- | Haskell expressions

type Expr = Ann UExpr IdDom SrcTemplateStage

-- | Clause of case expression (@ Just x -> x + 1 @)

type Alt = Ann UAlt IdDom SrcTemplateStage

-- | Right hand side of a match (possible with guards): (@ -> 3 @ or @ | x == 1 -> 3; | otherwise -> 4 @)

type CaseRhs = Ann UCaseRhs IdDom SrcTemplateStage

-- | A guarded right-hand side of pattern matches binding (@ | x > 3 -> 2 @)

type GuardedCaseRhs = Ann UGuardedCaseRhs IdDom SrcTemplateStage

-- | Field update expressions

type FieldUpdate = Ann UFieldUpdate IdDom SrcTemplateStage

-- | An element of a tuple section that can be an expression or missing (indicating a value from a parameter)

type TupSecElem = Ann UTupSecElem IdDom SrcTemplateStage

-- | Pragmas that can be applied to expressions

type ExprPragma = Ann UExprPragma IdDom SrcTemplateStage

-- | Special expressions for arrows

type Cmd = Ann UCmd IdDom SrcTemplateStage

-- | Clause of case expression for commands

type CmdAlt = Ann UCmdAlt IdDom SrcTemplateStage

-- | Arrow directions

type ArrowApp = Ann UArrowAppl IdDom SrcTemplateStage

-- * Statements


-- | A statement in a do-notation

type Stmt = Ann UStmt IdDom SrcTemplateStage

-- | Keywords @do@ or @mdo@ to start a do-block

type DoKind = Ann UDoKind IdDom SrcTemplateStage

-- | List comprehension statement

type CompStmt = Ann UCompStmt IdDom SrcTemplateStage

-- | Body of a list comprehension: (@ | x <- [1..10] @)

type ListCompBody = Ann UListCompBody IdDom SrcTemplateStage

-- | A do-notation for arrows

type CmdStmt = Ann UCmdStmt IdDom SrcTemplateStage

-- * Patterns


-- | Representation of patterns for pattern bindings

type Pattern = Ann UPattern IdDom SrcTemplateStage

-- Field specification of a record pattern

type PatternField = Ann UPatternField IdDom SrcTemplateStage

-- * Template Haskell


-- | A template haskell splice

type Splice = Ann USplice IdDom SrcTemplateStage

-- | Template Haskell bracket expressions

type Bracket = Ann UBracket IdDom SrcTemplateStage

-- | Template haskell quasi-quotation: @[quoter|str]@

type QuasiQuote = Ann UQuasiQuote IdDom SrcTemplateStage

-- * Literals


-- | Haskell literals

type Literal = Ann ULiteral IdDom SrcTemplateStage

-- * Names


-- | A definition that functions as an operator

type Operator = Ann UOperator IdDom SrcTemplateStage

-- | A definition that functions as a name

type Name = Ann UName IdDom SrcTemplateStage

-- | Possible qualified names. Contains also implicit names.

-- Linear implicit parameter: @%x@. Non-linear implicit parameter: @?x@.

type QualifiedName = Ann UQualifiedName IdDom SrcTemplateStage

-- | Parts of a qualified name.

type NamePart = Ann UNamePart IdDom SrcTemplateStage

-- | Program elements formatted as string literals (import packages, pragma texts)

type StringNode = Ann UStringNode IdDom SrcTemplateStage

-- * Optional AST elements


type MaybeContext = AnnMaybe UContext
type MaybeDeriving = AnnMaybe UDeriving
type MaybeDeriveStrategy = AnnMaybe UDeriveStrategy
type MaybeLocalBinds = AnnMaybe ULocalBinds
type MaybeTypeFamilySpec = AnnMaybe UTypeFamilySpec
type MaybeKindConstraint = AnnMaybe UKindConstraint
type MaybeClassBody = AnnMaybe UClassBody
type MaybeInstBody = AnnMaybe UInstBody
type MaybeExpr = AnnMaybe UExpr
type MaybeExportSpecs = AnnMaybe UExportSpecs
type MaybeImportQualified = AnnMaybe UImportQualified
type MaybeImportSource = AnnMaybe UImportSource
type MaybeImportSafe = AnnMaybe UImportSafe
type MaybeImportSpec = AnnMaybe UImportSpec
type MaybeModuleHead = AnnMaybe UModuleHead
type MaybeImportModifier = AnnMaybe UImportModifier
type MaybeModulePragma = AnnMaybe UModulePragma
type MaybeSubSpec = AnnMaybe USubSpec
type MaybeStringNode = AnnMaybe UStringNode
type MaybeImportRenaming = AnnMaybe UImportRenaming
type MaybeSafety = AnnMaybe USafety
type MaybePhaseControl = AnnMaybe UPhaseControl
type MaybeConlikeAnnot = AnnMaybe UConlikeAnnot
type MaybeFunDeps = AnnMaybe UFunDeps


-- * AST elements with multiplicity


type MatchList = AnnList UMatch
type DeclList = AnnList UDecl
type PatternList = AnnList UPattern
type OperatorList = AnnList UOperator
type NameList = AnnList UName
type LocalBindList = AnnList ULocalBind
type IESpecList = AnnList UIESpec
type RhsGuardList = AnnList URhsGuard
type GuardedRhsList = AnnList UGuardedRhs
type GuardedCaseRhsList = AnnList UGuardedCaseRhs
type ConDeclList = AnnList UConDecl
type TypeEqnList = AnnList UTypeEqn
type TypeList = AnnList UType
type FieldDeclList = AnnList UFieldDecl
type ExprList = AnnList UExpr
type FieldUpdateList = AnnList UFieldUpdate
type GadtConDeclList = AnnList UGadtConDecl
type ClassElementList = AnnList UClassElement
type InstBodyDeclList = AnnList UInstBodyDecl
type InstanceHeadList = AnnList UInstanceHead
type AltList = AnnList UAlt
type StmtList = AnnList UStmt
type KindList = AnnList UKind
type TyVarList = AnnList UTyVar
type ListCompBodyList = AnnList UListCompBody
type ExportSpecList = AnnList UExportSpec
type FilePragmaList = AnnList UFilePragma
type ImportDeclList = AnnList UImportDecl
type PatternFieldList = AnnList UPatternField
type AssertionList = AnnList UAssertion
type CompStmtList = AnnList UCompStmt
type RuleList = AnnList URule
type RuleVarList = AnnList URuleVar
type RoleList = AnnList URole
type MinimalFormulaList = AnnList UMinimalFormula
type FunDepList = AnnList UFunDep
type TupSecElemList = AnnList UTupSecElem
type CmdList = AnnList UCmd
type CmdAltList = AnnList UCmdAlt
type CmdStmtList = AnnList UCmdStmt
type LanguageExtensionList = AnnList ULanguageExtension
type StringNodeList = AnnList UStringNode
type NamePartList = AnnList UNamePart
type DerivingList = AnnList UDeriving