module UHC.Light.Compiler.HS(module UU.Scanner.Position
, AGItf (..), Module (..), Body (..), Declaration (..), Declarations, MaybeDeclarations, Type (..), Types, MaybeType, Expression (..), Expressions, MaybeExpression, FunctionBinding (..), FunctionBindings, LeftHandSide (..), RightHandSide (..), Pattern (..), Patterns, Literal (..), Name, Names, MaybeName, MaybeNames, Strings, Range (..), Fixity (..)
, TypeAnnotation (..), ExpressionAnnotation (..), PatternAnnotation (..)
, mkRngNm, mkRngNm', mkRngStr
, TypeLeftHandSide (..), TypePattern (..), TypePatterns
, Constructor (..), Constructors
, GuardedExpression (..), GuardedExpressions, Alternative (..), Alternatives, Qualifier (..), Qualifiers
, Kind (..), Kinds, KindAnnotation (..)
, FieldDeclaration (..), FieldDeclarations
, RecordPatternBinding (..), RecordPatternBindings
, RecordExpressionBinding (..), RecordExpressionBindings
, RowRecordExpressionUpdate (..), RowRecordExpressionUpdates, RowRecordPatternBinding (..), RowRecordPatternBindings, RowTypeUpdate (..), RowTypeUpdates
, module UHC.Light.Compiler.Base.Target
, ContextItem (..), ContextItems
, Statement (..), Statements
, ContextedExpression (..), ContextedExpressions, ContextedPattern (..), ContextedPatterns
, FunctionalDependency (..), FunctionalDependencies
, Export (..), Exports, MaybeExports, ImportDeclaration (..), ImportDeclarations, ImportSpecification (..), MaybeImportSpecification, Import (..), Imports
, Deriving (..), Derivings
, Pragma (..), Pragmas) where
import UHC.Light.Compiler.Base.Common
import UHC.Light.Compiler.Base.TermLike
import UU.Scanner.Position
import UHC.Util.ScanUtils
import UHC.Light.Compiler.Scanner.Token
import UHC.Light.Compiler.Base.Target (FFIWay)
type Name = HsName
type Names = [Name]
type MaybeName = Maybe Name
type MaybeNames = Maybe Names
mkRngNm' :: (Position t,HSNM t) => (Range -> HsName -> r) -> t -> (r,Range)
mkRngNm' ast t
= (ast r (mkHNm t),r)
where r = mkRange1 t
mkRngNm :: (Position t,HSNM t) => (Range -> HsName -> r) -> t -> r
mkRngNm ast t = fst (mkRngNm' ast t)
mkRngStr :: (Range -> String -> r) -> Token -> r
mkRngStr ast t = ast (mkRange1 t) (tokMkStr t)
instance AppLike Type () where
app1App = \e1 e2 -> Type_NormalApplication emptyRange e1 [e2]
appTop = id
appCon = mkRngNm Type_Constructor
appPar = Type_Parenthesized emptyRange
appTopApp (a:as) = if null as then a else Type_NormalApplication emptyRange a as
appRngCon r n = Type_Constructor r (mkHNm n)
appRngVar r n = Type_Variable r (mkHNm n)
instance AppLike Expression () where
app1App = \e1 e2 -> Expression_NormalApplication emptyRange e1 [e2]
appTop = id
appCon = mkRngNm Expression_Constructor
appPar = Expression_Parenthesized emptyRange
appTopApp (a:as) = if null as then a else Expression_NormalApplication emptyRange a as
appRngCon r n = Expression_Constructor r (mkHNm n)
appRngVar r n = Expression_Variable r (mkHNm n)
data AGItf = AGItf_AGItf {module_AGItf_AGItf :: !(Module)}
data Alternative = Alternative_Alternative {range_Alternative_Alternative :: !(Range),pattern_Alternative_Alternative :: !(Pattern),righthandside_Alternative_Alternative :: !(RightHandSide)}
| Alternative_Empty {range_Alternative_Empty :: !(Range)}
type Alternatives = [Alternative]
data Body = Body_Body {range_Body_Body :: !(Range),importdeclarations_Body_Body :: !(ImportDeclarations),declarations_Body_Body :: !(Declarations)}
data Constructor = Constructor_Constructor {range_Constructor_Constructor :: !(Range),constructor_Constructor_Constructor :: !(Name),types_Constructor_Constructor :: !(Types)}
| Constructor_Infix {range_Constructor_Infix :: !(Range),leftType_Constructor_Infix :: !(Type),constructorOperator_Constructor_Infix :: !(Name),rightType_Constructor_Infix :: !(Type)}
| Constructor_Record {range_Constructor_Record :: !(Range),constructor_Constructor_Record :: !(Name),fieldDeclarations_Constructor_Record :: !(FieldDeclarations)}
| Constructor_Contexted {range_Constructor_Contexted :: !(Range),context_Constructor_Contexted :: !(ContextItems),constructor_Constructor_Contexted :: !(Constructor)}
| Constructor_GADTFunction {range_Constructor_GADTFunction :: !(Range),constructor_Constructor_GADTFunction :: !(Name),type_Constructor_GADTFunction :: !(Type)}
type Constructors = [Constructor]
data ContextItem = ContextItem_Class {range_ContextItem_Class :: !(Range),name_ContextItem_Class :: !(Name),types_ContextItem_Class :: !(Types)}
| ContextItem_Forall {range_ContextItem_Forall :: !(Range),typevariables_ContextItem_Forall :: !(Names),context_ContextItem_Forall :: !(ContextItem)}
| ContextItem_Arrow {range_ContextItem_Arrow :: !(Range),argument_ContextItem_Arrow :: !(ContextItem),result_ContextItem_Arrow :: !(ContextItem)}
| ContextItem_Implicits {range_ContextItem_Implicits :: !(Range)}
| ContextItem_NoImplicits {range_ContextItem_NoImplicits :: !(Range)}
| ContextItem_RowLacksLabel {range_ContextItem_RowLacksLabel :: !(Range),rowvariable_ContextItem_RowLacksLabel :: !(Name),name_ContextItem_RowLacksLabel :: !(Name)}
| ContextItem_Equal {range_ContextItem_Equal :: !(Range),type1_ContextItem_Equal :: !(Type),type2_ContextItem_Equal :: !(Type)}
type ContextItems = [ContextItem]
data ContextedExpression = ContextedExpression_Contexted {range_ContextedExpression_Contexted :: !(Range),expression_ContextedExpression_Contexted :: !(Expression),context_ContextedExpression_Contexted :: !(ContextItem)}
type ContextedExpressions = [ContextedExpression]
data ContextedPattern = ContextedPattern_Contexted {range_ContextedPattern_Contexted :: !(Range),pattern_ContextedPattern_Contexted :: !(Pattern),context_ContextedPattern_Contexted :: !(ContextItem)}
type ContextedPatterns = [ContextedPattern]
data Declaration = Declaration_FunctionBindings {range_Declaration_FunctionBindings :: !(Range),bindings_Declaration_FunctionBindings :: !(FunctionBindings)}
| Declaration_PatternBinding {range_Declaration_PatternBinding :: !(Range),pattern_Declaration_PatternBinding :: !(Pattern),righthandside_Declaration_PatternBinding :: !(RightHandSide)}
| Declaration_TypeSignature {range_Declaration_TypeSignature :: !(Range),names_Declaration_TypeSignature :: !(Names),type_Declaration_TypeSignature :: !(Type)}
| Declaration_Fixity {range_Declaration_Fixity :: !(Range),fixity_Declaration_Fixity :: !(Fixity),priority_Declaration_Fixity :: !((Maybe Int)),operators_Declaration_Fixity :: !(Names)}
| Declaration_FusionDeclaration {range_Declaration_FusionDeclaration :: !(Range),fusename_Declaration_FusionDeclaration :: !(Name)}
| Declaration_FusionConversion {range_Declaration_FusionConversion :: !(Range),absname_Declaration_FusionConversion :: !(Name),conname_Declaration_FusionConversion :: !(Name)}
| Declaration_Empty {range_Declaration_Empty :: !(Range)}
| Declaration_Data {range_Declaration_Data :: !(Range),context_Declaration_Data :: !(ContextItems),typelefthandside_Declaration_Data :: !(TypeLeftHandSide),constructors_Declaration_Data :: !(Constructors),derivings_Declaration_Data :: !(Derivings)}
| Declaration_Newtype {range_Declaration_Newtype :: !(Range),context_Declaration_Newtype :: !(ContextItems),typelefthandside_Declaration_Newtype :: !(TypeLeftHandSide),constructors_Declaration_Newtype :: !(Constructor),derivings_Declaration_Newtype :: !(Derivings)}
| Declaration_GADT {range_Declaration_GADT :: !(Range),context_Declaration_GADT :: !(ContextItems),typelefthandside_Declaration_GADT :: !(TypeLeftHandSide),constructors_Declaration_GADT :: !(Constructors),derivings_Declaration_GADT :: !(Derivings)}
| Declaration_KindSignature {range_Declaration_KindSignature :: !(Range),names_Declaration_KindSignature :: !(Names),kind_Declaration_KindSignature :: !(Kind)}
| Declaration_ForeignImport {range_Declaration_ForeignImport :: !(Range),callconvention_Declaration_ForeignImport :: !(FFIWay),safety_Declaration_ForeignImport :: !((Maybe String)),importname_Declaration_ForeignImport :: !((Maybe String)),name_Declaration_ForeignImport :: !(Name),type_Declaration_ForeignImport :: !(Type)}
| Declaration_ForeignExport {range_Declaration_ForeignExport :: !(Range),callconvention_Declaration_ForeignExport :: !(FFIWay),exportname_Declaration_ForeignExport :: !((Maybe String)),name_Declaration_ForeignExport :: !(Name),type_Declaration_ForeignExport :: !(Type)}
| Declaration_Class {range_Declaration_Class :: !(Range),context_Declaration_Class :: !(ContextItems),typelefthandside_Declaration_Class :: !(TypeLeftHandSide),dependencies_Declaration_Class :: !(FunctionalDependencies),where_Declaration_Class :: !(MaybeDeclarations)}
| Declaration_Instance {range_Declaration_Instance :: !(Range),instVariant_Declaration_Instance :: !(InstVariant),maybeinstancename_Declaration_Instance :: !(MaybeName),useimplicitly_Declaration_Instance :: !(Bool),context_Declaration_Instance :: !(ContextItems),type_Declaration_Instance :: !(Type),where_Declaration_Instance :: !(MaybeDeclarations)}
| Declaration_InstanceUseImplicitly {range_Declaration_InstanceUseImplicitly :: !(Range),expression_Declaration_InstanceUseImplicitly :: !(Expression),name_Declaration_InstanceUseImplicitly :: !(Name),types_Declaration_InstanceUseImplicitly :: !(Types)}
| Declaration_Default {range_Declaration_Default :: !(Range),name_Declaration_Default :: !(MaybeName),types_Declaration_Default :: !(Types)}
| Declaration_Type {range_Declaration_Type :: !(Range),typelefthandside_Declaration_Type :: !(TypeLeftHandSide),type_Declaration_Type :: !(Type)}
| Declaration_Pragma {range_Declaration_Pragma :: !(Range),pragma_Declaration_Pragma :: !(Pragma)}
| Declaration_Module {range_Declaration_Module :: !(Range),name_Declaration_Module :: !(MaybeName),exports_Declaration_Module :: !(MaybeExports)}
type Declarations = [Declaration]
data Deriving = Deriving_Deriving {range_Deriving_Deriving :: !(Range),maybeinstancename_Deriving_Deriving :: !(MaybeName),useimplicitly_Deriving_Deriving :: !(Bool),name_Deriving_Deriving :: !(Name)}
type Derivings = [Deriving]
data Export = Export_Variable {range_Export_Variable :: !(Range),name_Export_Variable :: !(Name)}
| Export_TypeOrClass {range_Export_TypeOrClass :: !(Range),name_Export_TypeOrClass :: !(Name),names_Export_TypeOrClass :: !(MaybeNames)}
| Export_TypeOrClassComplete {range_Export_TypeOrClassComplete :: !(Range),name_Export_TypeOrClassComplete :: !(Name)}
| Export_Module {range_Export_Module :: !(Range),name_Export_Module :: !(Name)}
type Exports = [Export]
data Expression = Expression_Literal {range_Expression_Literal :: !(Range),literal_Expression_Literal :: !(Literal)}
| Expression_Variable {range_Expression_Variable :: !(Range),name_Expression_Variable :: !(Name)}
| Expression_Constructor {range_Expression_Constructor :: !(Range),name_Expression_Constructor :: !(Name)}
| Expression_TupleConstructor {range_Expression_TupleConstructor :: !(Range),arity_Expression_TupleConstructor :: !(Int)}
| Expression_Parenthesized {range_Expression_Parenthesized :: !(Range),expression_Expression_Parenthesized :: !(Expression)}
| Expression_NormalApplication {range_Expression_NormalApplication :: !(Range),function_Expression_NormalApplication :: !(Expression),arguments_Expression_NormalApplication :: !(Expressions)}
| Expression_SectionApplication {range_Expression_SectionApplication :: !(Range),leftExpression_Expression_SectionApplication :: !(MaybeExpression),operator_Expression_SectionApplication :: !(Expression),rightExpression_Expression_SectionApplication :: !(MaybeExpression)}
| Expression_InfixApplication {range_Expression_InfixApplication :: !(Range),leftExpression_Expression_InfixApplication :: !(Expression),operator_Expression_InfixApplication :: !(Expression),rightExpression_Expression_InfixApplication :: !(Expression)}
| Expression_InfixApplicationChainTop {range_Expression_InfixApplicationChainTop :: !(Range),expression_Expression_InfixApplicationChainTop :: !(Expression)}
| Expression_Lambda {range_Expression_Lambda :: !(Range),patterns_Expression_Lambda :: !(Patterns),expression_Expression_Lambda :: !(Expression)}
| Expression_Let {range_Expression_Let :: !(Range),isStrict_Expression_Let :: !(Bool),declarations_Expression_Let :: !(Declarations),expression_Expression_Let :: !(Expression)}
| Expression_Tuple {range_Expression_Tuple :: !(Range),expressions_Expression_Tuple :: !(Expressions)}
| Expression_Typed {range_Expression_Typed :: !(Range),expression_Expression_Typed :: !(Expression),type_Expression_Typed :: !(Type)}
| Expression_Negate {range_Expression_Negate :: !(Range),expression_Expression_Negate :: !(Expression)}
| Expression_Annotate {range_Expression_Annotate :: !(Range),annotation_Expression_Annotate :: !(ExpressionAnnotation),expression_Expression_Annotate :: !(Expression)}
| Expression_ImpredicativeApplication {range_Expression_ImpredicativeApplication :: !(Range),function_Expression_ImpredicativeApplication :: !(Expression),arguments_Expression_ImpredicativeApplication :: !(Expressions)}
| Expression_If {range_Expression_If :: !(Range),guardExpression_Expression_If :: !(Expression),thenExpression_Expression_If :: !(Expression),elseExpression_Expression_If :: !(Expression)}
| Expression_Case {range_Expression_Case :: !(Range),expression_Expression_Case :: !(Expression),alternatives_Expression_Case :: !(Alternatives)}
| Expression_List {range_Expression_List :: !(Range),expressions_Expression_List :: !(Expressions)}
| Expression_Enum {range_Expression_Enum :: !(Range),from_Expression_Enum :: !(Expression),then_Expression_Enum :: !(MaybeExpression),to_Expression_Enum :: !(MaybeExpression)}
| Expression_Comprehension {range_Expression_Comprehension :: !(Range),expression_Expression_Comprehension :: !(Expression),qualifiers_Expression_Comprehension :: !(Qualifiers)}
| Expression_RecordConstruction {range_Expression_RecordConstruction :: !(Range),name_Expression_RecordConstruction :: !(Name),recordExpressionBindings_Expression_RecordConstruction :: !(RecordExpressionBindings)}
| Expression_RecordUpdate {range_Expression_RecordUpdate :: !(Range),expression_Expression_RecordUpdate :: !(Expression),recordExpressionBindings_Expression_RecordUpdate :: !(RecordExpressionBindings)}
| Expression_RowRecordUpdate {range_Expression_RowRecordUpdate :: !(Range),expression_Expression_RowRecordUpdate :: !(Expression),rowRecordExpressionUpdates_Expression_RowRecordUpdate :: !(RowRecordExpressionUpdates)}
| Expression_RowRecordEmpty {range_Expression_RowRecordEmpty :: !(Range)}
| Expression_RowRecordSelect {range_Expression_RowRecordSelect :: !(Range),expression_Expression_RowRecordSelect :: !(Expression),name_Expression_RowRecordSelect :: !(Name)}
| Expression_Do {range_Expression_Do :: !(Range),statements_Expression_Do :: !(Statements)}
| Expression_ImplicitApplication {range_Expression_ImplicitApplication :: !(Range),function_Expression_ImplicitApplication :: !(Expression),arguments_Expression_ImplicitApplication :: !(ContextedExpressions)}
| Expression_ImplicitLambda {range_Expression_ImplicitLambda :: !(Range),patterns_Expression_ImplicitLambda :: !(ContextedPatterns),expression_Expression_ImplicitLambda :: !(Expression)}
data ExpressionAnnotation = ExpressionAnnotation_Empty {}
type Expressions = [Expression]
data FieldDeclaration = FieldDeclaration_FieldDeclaration {range_FieldDeclaration_FieldDeclaration :: !(Range),names_FieldDeclaration_FieldDeclaration :: !(Names),type_FieldDeclaration_FieldDeclaration :: !(Type)}
type FieldDeclarations = [FieldDeclaration]
data FunctionBinding = FunctionBinding_FunctionBinding {range_FunctionBinding_FunctionBinding :: !(Range),lefthandside_FunctionBinding_FunctionBinding :: !(LeftHandSide),righthandside_FunctionBinding_FunctionBinding :: !(RightHandSide)}
type FunctionBindings = [FunctionBinding]
type FunctionalDependencies = [FunctionalDependency]
data FunctionalDependency = FunctionalDependency_Dependency {range_FunctionalDependency_Dependency :: !(Range),fromtypevariables_FunctionalDependency_Dependency :: !(Names),totypevariables_FunctionalDependency_Dependency :: !(Names)}
data GuardedExpression = GuardedExpression_GuardedExpression {range_GuardedExpression_GuardedExpression :: !(Range),guard_GuardedExpression_GuardedExpression :: !(Expression),expression_GuardedExpression_GuardedExpression :: !(Expression)}
type GuardedExpressions = [GuardedExpression]
data Import = Import_Variable {range_Import_Variable :: !(Range),name_Import_Variable :: !(Name)}
| Import_TypeOrClass {range_Import_TypeOrClass :: !(Range),name_Import_TypeOrClass :: !(Name),names_Import_TypeOrClass :: !(MaybeNames)}
| Import_TypeOrClassComplete {range_Import_TypeOrClassComplete :: !(Range),name_Import_TypeOrClassComplete :: !(Name)}
data ImportDeclaration = ImportDeclaration_Import {range_ImportDeclaration_Import :: !(Range),qualified_ImportDeclaration_Import :: !(Bool),name_ImportDeclaration_Import :: !(Name),asname_ImportDeclaration_Import :: !(MaybeName),importspecification_ImportDeclaration_Import :: !(MaybeImportSpecification)}
| ImportDeclaration_Empty {range_ImportDeclaration_Empty :: !(Range)}
type ImportDeclarations = [ImportDeclaration]
data ImportSpecification = ImportSpecification_Import {range_ImportSpecification_Import :: !(Range),hiding_ImportSpecification_Import :: !(Bool),imports_ImportSpecification_Import :: !(Imports)}
type Imports = [Import]
data Kind = Kind_NormalApplication {range_Kind_NormalApplication :: !(Range),function_Kind_NormalApplication :: !(Kind),arguments_Kind_NormalApplication :: !(Kinds)}
| Kind_InfixApplication {range_Kind_InfixApplication :: !(Range),leftKind_Kind_InfixApplication :: !(Kind),operator_Kind_InfixApplication :: !(Kind),rightKind_Kind_InfixApplication :: !(Kind)}
| Kind_Constructor {range_Kind_Constructor :: !(Range),name_Kind_Constructor :: !(Name)}
| Kind_Parenthesized {range_Kind_Parenthesized :: !(Range),kind_Kind_Parenthesized :: !(Kind)}
| Kind_Variable {range_Kind_Variable :: !(Range),name_Kind_Variable :: !(Name)}
| Kind_Forall {range_Kind_Forall :: !(Range),kindvariables_Kind_Forall :: !(Names),kind_Kind_Forall :: !(Kind)}
| Kind_Annotate {range_Kind_Annotate :: !(Range),annotation_Kind_Annotate :: !(KindAnnotation),kind_Kind_Annotate :: !(Kind)}
data KindAnnotation = KindAnnotation_Empty {}
type Kinds = [Kind]
data LeftHandSide = LeftHandSide_Function {range_LeftHandSide_Function :: !(Range),name_LeftHandSide_Function :: !(Name),patterns_LeftHandSide_Function :: !(Patterns)}
| LeftHandSide_Infix {range_LeftHandSide_Infix :: !(Range),leftPattern_LeftHandSide_Infix :: !(Pattern),operator_LeftHandSide_Infix :: !(Name),rightPattern_LeftHandSide_Infix :: !(Pattern)}
| LeftHandSide_Parenthesized {range_LeftHandSide_Parenthesized :: !(Range),lefthandside_LeftHandSide_Parenthesized :: !(LeftHandSide),patterns_LeftHandSide_Parenthesized :: !(Patterns)}
| LeftHandSide_Typed {range_LeftHandSide_Typed :: !(Range),lefthandside_LeftHandSide_Typed :: !(LeftHandSide),type_LeftHandSide_Typed :: !(Type)}
data Literal = Literal_Int {range_Literal_Int :: !(Range),base_Literal_Int :: !(Int),value_Literal_Int :: !(String)}
| Literal_Char {range_Literal_Char :: !(Range),value_Literal_Char :: !(String)}
| Literal_String {range_Literal_String :: !(Range),value_Literal_String :: !(String)}
| Literal_Float {range_Literal_Float :: !(Range),value_Literal_Float :: !(String)}
type MaybeDeclarations = Maybe (Declarations)
type MaybeExports = Maybe (Exports)
type MaybeExpression = Maybe (Expression)
type MaybeImportSpecification = Maybe (ImportSpecification)
type MaybeType = Maybe (Type)
data Module = Module_Module {range_Module_Module :: !(Range),name_Module_Module :: !(MaybeName),fileheaderpragmas_Module_Module :: !(Pragmas),exports_Module_Module :: !(MaybeExports),body_Module_Module :: !(Body)}
data Pattern = Pattern_Literal {range_Pattern_Literal :: !(Range),sign_Pattern_Literal :: !(Int),literal_Pattern_Literal :: !(Literal)}
| Pattern_Variable {range_Pattern_Variable :: !(Range),name_Pattern_Variable :: !(Name)}
| Pattern_Constructor {range_Pattern_Constructor :: !(Range),name_Pattern_Constructor :: !(Name),patterns_Pattern_Constructor :: !(Patterns)}
| Pattern_Parenthesized {range_Pattern_Parenthesized :: !(Range),pattern_Pattern_Parenthesized :: !(Pattern)}
| Pattern_As {range_Pattern_As :: !(Range),name_Pattern_As :: !(Name),pattern_Pattern_As :: !(Pattern)}
| Pattern_Wildcard {range_Pattern_Wildcard :: !(Range)}
| Pattern_Tuple {range_Pattern_Tuple :: !(Range),arity_Pattern_Tuple :: !(Int),patterns_Pattern_Tuple :: !(Patterns)}
| Pattern_Annotate {range_Pattern_Annotate :: !(Range),annotation_Pattern_Annotate :: !(PatternAnnotation),pattern_Pattern_Annotate :: !(Pattern)}
| Pattern_Typed {range_Pattern_Typed :: !(Range),pattern_Pattern_Typed :: !(Pattern),type_Pattern_Typed :: !(Type)}
| Pattern_InfixConstructor {range_Pattern_InfixConstructor :: !(Range),leftPattern_Pattern_InfixConstructor :: !(Pattern),constructorOperator_Pattern_InfixConstructor :: !(Name),rightPattern_Pattern_InfixConstructor :: !(Pattern)}
| Pattern_List {range_Pattern_List :: !(Range),patterns_Pattern_List :: !(Patterns)}
| Pattern_Record {range_Pattern_Record :: !(Range),name_Pattern_Record :: !(Name),recordPatternBindings_Pattern_Record :: !(RecordPatternBindings)}
| Pattern_RowRecordBinding {range_Pattern_RowRecordBinding :: !(Range),pattern_Pattern_RowRecordBinding :: !(Pattern),rowRecordPattternBindings_Pattern_RowRecordBinding :: !(RowRecordPatternBindings)}
| Pattern_RowRecordEmpty {range_Pattern_RowRecordEmpty :: !(Range)}
| Pattern_Irrefutable {range_Pattern_Irrefutable :: !(Range),pattern_Pattern_Irrefutable :: !(Pattern)}
| Pattern_Bang {range_Pattern_Bang :: !(Range),pattern_Pattern_Bang :: !(Pattern)}
data PatternAnnotation = PatternAnnotation_Empty {}
type Patterns = [Pattern]
data Pragma = Pragma_Language {range_Pragma_Language :: !(Range),pragmas_Pragma_Language :: !(Names)}
| Pragma_OptionsUHC {range_Pragma_OptionsUHC :: !(Range),options_Pragma_OptionsUHC :: !(String)}
| Pragma_Derivable {range_Pragma_Derivable :: !(Range),className_Pragma_Derivable :: !(Name),fieldName_Pragma_Derivable :: !(Name),defaultName_Pragma_Derivable :: !(Name)}
| Pragma_ExcludeIfTarget {range_Pragma_ExcludeIfTarget :: !(Range),targetNames_Pragma_ExcludeIfTarget :: !(([String]))}
type Pragmas = [Pragma]
data Qualifier = Qualifier_Guard {range_Qualifier_Guard :: !(Range),guard_Qualifier_Guard :: !(Expression)}
| Qualifier_Let {range_Qualifier_Let :: !(Range),declarations_Qualifier_Let :: !(Declarations)}
| Qualifier_Generator {range_Qualifier_Generator :: !(Range),pattern_Qualifier_Generator :: !(Pattern),expression_Qualifier_Generator :: !(Expression)}
| Qualifier_Empty {range_Qualifier_Empty :: !(Range)}
type Qualifiers = [Qualifier]
data RecordExpressionBinding = RecordExpressionBinding_Binding {range_RecordExpressionBinding_Binding :: !(Range),name_RecordExpressionBinding_Binding :: !(Name),expression_RecordExpressionBinding_Binding :: !(Expression)}
type RecordExpressionBindings = [RecordExpressionBinding]
data RecordPatternBinding = RecordPatternBinding_Binding {range_RecordPatternBinding_Binding :: !(Range),name_RecordPatternBinding_Binding :: !(Name),pattern_RecordPatternBinding_Binding :: !(Pattern)}
| RecordPatternBinding_Pun {range_RecordPatternBinding_Pun :: !(Range),name_RecordPatternBinding_Pun :: !(Name)}
type RecordPatternBindings = [RecordPatternBinding]
data RightHandSide = RightHandSide_Expression {range_RightHandSide_Expression :: !(Range),expression_RightHandSide_Expression :: !(Expression),where_RightHandSide_Expression :: !(MaybeDeclarations)}
| RightHandSide_Guarded {range_RightHandSide_Guarded :: !(Range),guardedexpressions_RightHandSide_Guarded :: !(GuardedExpressions),where_RightHandSide_Guarded :: !(MaybeDeclarations)}
data RowRecordExpressionUpdate = RowRecordExpressionUpdate_Update {range_RowRecordExpressionUpdate_Update :: !(Range),name_RowRecordExpressionUpdate_Update :: !(Name),expression_RowRecordExpressionUpdate_Update :: !(Expression)}
| RowRecordExpressionUpdate_Extends {range_RowRecordExpressionUpdate_Extends :: !(Range),name_RowRecordExpressionUpdate_Extends :: !(MaybeName),expression_RowRecordExpressionUpdate_Extends :: !(Expression)}
type RowRecordExpressionUpdates = [RowRecordExpressionUpdate]
data RowRecordPatternBinding = RowRecordPatternBinding_Binding {range_RowRecordPatternBinding_Binding :: !(Range),name_RowRecordPatternBinding_Binding :: !(MaybeName),pattern_RowRecordPatternBinding_Binding :: !(Pattern)}
type RowRecordPatternBindings = [RowRecordPatternBinding]
data RowTypeUpdate = RowTypeUpdate_Extends {range_RowTypeUpdate_Extends :: !(Range),name_RowTypeUpdate_Extends :: !(MaybeName),type_RowTypeUpdate_Extends :: !(Type)}
type RowTypeUpdates = [RowTypeUpdate]
data Statement = Statement_Expression {range_Statement_Expression :: !(Range),expression_Statement_Expression :: !(Expression)}
| Statement_Let {range_Statement_Let :: !(Range),declarations_Statement_Let :: !(Declarations)}
| Statement_Generator {range_Statement_Generator :: !(Range),pattern_Statement_Generator :: !(Pattern),expression_Statement_Generator :: !(Expression)}
| Statement_Empty {range_Statement_Empty :: !(Range)}
type Statements = [Statement]
type Strings = [(String)]
data Type = Type_NormalApplication {range_Type_NormalApplication :: !(Range),function_Type_NormalApplication :: !(Type),arguments_Type_NormalApplication :: !(Types)}
| Type_InfixApplication {range_Type_InfixApplication :: !(Range),leftType_Type_InfixApplication :: !(Type),operator_Type_InfixApplication :: !(Type),rightType_Type_InfixApplication :: !(Type)}
| Type_InfixApplicationChainTop {range_Type_InfixApplicationChainTop :: !(Range),type_Type_InfixApplicationChainTop :: !(Type)}
| Type_Constructor {range_Type_Constructor :: !(Range),name_Type_Constructor :: !(Name)}
| Type_Parenthesized {range_Type_Parenthesized :: !(Range),type_Type_Parenthesized :: !(Type)}
| Type_SectionApplication {range_Type_SectionApplication :: !(Range),leftType_Type_SectionApplication :: !(MaybeType),operator_Type_SectionApplication :: !(Type),rightType_Type_SectionApplication :: !(MaybeType)}
| Type_Annotate {range_Type_Annotate :: !(Range),annotation_Type_Annotate :: !(TypeAnnotation),type_Type_Annotate :: !(Type)}
| Type_Wildcard {range_Type_Wildcard :: !(Range)}
| Type_MonoWildcard {range_Type_MonoWildcard :: !(Range)}
| Type_Variable {range_Type_Variable :: !(Range),name_Type_Variable :: !(Name)}
| Type_NamedWildcard {range_Type_NamedWildcard :: !(Range),name_Type_NamedWildcard :: !(Name)}
| Type_Forall {range_Type_Forall :: !(Range),typevariables_Type_Forall :: !(Names),type_Type_Forall :: !(Type)}
| Type_Exists {range_Type_Exists :: !(Range),typevariables_Type_Exists :: !(Names),type_Type_Exists :: !(Type)}
| Type_RowUpdate {range_Type_RowUpdate :: !(Range),type_Type_RowUpdate :: !(Type),rowTypeUpdates_Type_RowUpdate :: !(RowTypeUpdates)}
| Type_RowEmpty {range_Type_RowEmpty :: !(Range)}
| Type_RowRecUpdate {range_Type_RowRecUpdate :: !(Range),type_Type_RowRecUpdate :: !(Type),rowTypeUpdates_Type_RowRecUpdate :: !(RowTypeUpdates)}
| Type_RowRecEmpty {range_Type_RowRecEmpty :: !(Range)}
| Type_RowSumUpdate {range_Type_RowSumUpdate :: !(Range),type_Type_RowSumUpdate :: !(Type),rowTypeUpdates_Type_RowSumUpdate :: !(RowTypeUpdates)}
| Type_RowSumEmpty {range_Type_RowSumEmpty :: !(Range)}
| Type_Qualified {range_Type_Qualified :: !(Range),context_Type_Qualified :: !(ContextItems),type_Type_Qualified :: !(Type)}
| Type_TupleConstructor {range_Type_TupleConstructor :: !(Range),arity_Type_TupleConstructor :: !(Int)}
data TypeAnnotation = TypeAnnotation_Strict {}
| TypeAnnotation_AnnotationName {name_TypeAnnotation_AnnotationName :: !(Name)}
| TypeAnnotation_AnnotationVar {name_TypeAnnotation_AnnotationVar :: !(Name),var_TypeAnnotation_AnnotationVar :: !(Name)}
data TypeLeftHandSide = TypeLeftHandSide_Function {range_TypeLeftHandSide_Function :: !(Range),name_TypeLeftHandSide_Function :: !(Name),patterns_TypeLeftHandSide_Function :: !(TypePatterns)}
| TypeLeftHandSide_Infix {range_TypeLeftHandSide_Infix :: !(Range),leftPattern_TypeLeftHandSide_Infix :: !(TypePattern),operator_TypeLeftHandSide_Infix :: !(Name),rightPattern_TypeLeftHandSide_Infix :: !(TypePattern)}
| TypeLeftHandSide_Parenthesized {range_TypeLeftHandSide_Parenthesized :: !(Range),lefthandside_TypeLeftHandSide_Parenthesized :: !(TypeLeftHandSide),patterns_TypeLeftHandSide_Parenthesized :: !(TypePatterns)}
data TypePattern = TypePattern_Variable {range_TypePattern_Variable :: !(Range),name_TypePattern_Variable :: !(Name)}
type TypePatterns = [TypePattern]
type Types = [Type]