language-dart-0.2.0.0: src/Language/Dart/Syntax.hs
{-# LANGUAGE DeriveDataTypeable, DeriveGeneric #-}
module Language.Dart.Syntax
( AnnotatedNode(..)
, Annotation(..)
, ArgumentList(..)
, AstNode(..)
, AsyncModifier(..)
, Block(..)
, CatchClause(..)
, ClassMember(..)
, Combinator(..)
, Comment(..)
, CommentReference(..)
, CommentType(..)
, CompilationUnit(..)
, CompilationUnitMember(..)
, Configuration(..)
, ConstructorInitializer(..)
, ConstructorName(..)
, Declaration(..)
, DeclaredIdentifier(..)
, Directive(..)
, DottedName(..)
, EnumConstantDeclaration(..)
, Expression(..)
, ExtendsClause(..)
, FinalConstVarOrType(..)
, FinalVarOrType(..)
, FormalParameter(..)
, FormalParameterList(..)
, FunctionBody(..)
, FunctionDeclaration(..)
, FunctionExpression(..)
, Identifier(..)
, ImplementsClause(..)
, InterpolationElement(..)
, InvocationExpression(..)
, Label(..)
, LibraryIdentifier(..)
, Literal(..)
, MapLiteralEntry(..)
, MethodModifier(..)
, NamedCompilationUnitMember(..)
, NamespaceDirective(..)
, NewOrConst(..)
, NormalFormalParameter(..)
, ParameterKind(..)
, PropertyKeyword(..)
, ScriptTag(..)
, SimpleIdentifier(..)
, SingleStringLiteral(..)
, Statement(..)
, StringLiteral(..)
, SwitchMember(..)
, Token
, TypeAlias(..)
, TypeArgumentList(..)
, TypedLiteral(..)
, TypeName(..)
, TypeParameter(..)
, TypeParameterList(..)
, UriBasedDirective(..)
, VariableDeclaration(..)
, VariableDeclarationList(..)
, WithClause(..)
) where
import Data.Data
import GHC.Generics (Generic)
type Token = String
-- | A literal that has a type associated with it.
--
-- typedLiteral ::=
-- [ListLiteral]
-- | [MapLiteral]
data TypedLiteral
-- | A literal map.
--
-- mapLiteral ::=
-- 'const'? ('<' [TypeName] (',' [TypeName])* '>')?
-- '{' ([MapLiteralEntry] (',' [MapLiteralEntry])* ','?)? '}'
= MapLiteral Bool -- isConst
(Maybe TypeArgumentList) -- typeArguments
[MapLiteralEntry] -- entries
-- | A list literal.
--
-- listLiteral ::=
-- 'const'? ('<' [TypeName] '>')? '[' ([Expression] ','?)? ']'
| ListLiteral Bool -- isConst
(Maybe TypeArgumentList) -- typeArguments
[Expression] -- elements
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node within a [StringInterpolation].
--
-- interpolationElement ::=
-- [InterpolationExpression]
-- | [InterpolationString]
data InterpolationElement
-- | An expression embedded in a string interpolation.
--
-- interpolationExpression ::=
-- '$' [SimpleIdentifier]
-- | '$' '{' [Expression] '}'
= InterpolationExpression Expression -- expression
-- | A non-empty substring of an interpolated string.
--
-- interpolationString ::=
-- characters
| InterpolationString String -- value
deriving (Eq, Show, Typeable, Generic, Data)
-- | A single string literal expression.
--
-- singleStringLiteral ::=
-- [SimpleStringLiteral]
-- | [StringInterpolation]
data SingleStringLiteral
-- | A string literal expression that does not contain any interpolations.
--
-- simpleStringLiteral ::=
-- rawStringLiteral
-- | basicStringLiteral
--
-- rawStringLiteral ::=
-- 'r' basicStringLiteral
--
-- simpleStringLiteral ::=
-- multiLineStringLiteral
-- | singleLineStringLiteral
--
-- multiLineStringLiteral ::=
-- "'''" characters "'''"
-- | '"""' characters '"""'
--
-- singleLineStringLiteral ::=
-- "'" characters "'"
-- | '"' characters '"'
= SimpleStringLiteral String -- value
-- | A string interpolation literal.
--
-- stringInterpolation ::=
-- ''' [InterpolationElement]* '''
-- | '"' [InterpolationElement]* '"'
| StringInterpolation [InterpolationElement] -- elements
deriving (Eq, Show, Typeable, Generic, Data)
-- A string literal expression.
--
-- stringLiteral ::=
-- [SimpleStringLiteral]
-- | [AdjacentStrings]
-- | [StringInterpolation]
data StringLiteral
= SingleStringLiteral' SingleStringLiteral
-- | Two or more string literals that are implicitly concatenated because of being
-- adjacent (separated only by whitespace).
--
-- While the grammar only allows adjacent strings when all of the strings are of
-- the same kind (single line or multi-line), this class doesn't enforce that
-- restriction.
--
-- adjacentStrings ::=
-- [StringLiteral] [StringLiteral]+
| AdjacentStrings [StringLiteral] -- strings
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node that represents a literal expression.
--
-- literal ::=
-- [BooleanLiteral]
-- | [DoubleLiteral]
-- | [IntegerLiteral]
-- | [ListLiteral]
-- | [MapLiteral]
-- | [NullLiteral]
-- | [StringLiteral]
data Literal
-- A boolean literal expression.
--
-- booleanLiteral ::=
-- 'false' | 'true'
= BooleanLiteral Bool -- bool
-- A floating point literal expression.
--
-- doubleLiteral ::=
-- decimalDigit+ ('.' decimalDigit*)? exponent?
-- | '.' decimalDigit+ exponent?
--
-- exponent ::=
-- ('e' | 'E') ('+' | '-')? decimalDigit+
| DoubleLiteral Double -- value
| TypedLiteral TypedLiteral
-- | An integer literal expression.
--
-- integerLiteral ::=
-- decimalIntegerLiteral
-- | hexadecimalIntegerLiteral
--
-- decimalIntegerLiteral ::=
-- decimalDigit+
--
-- hexadecimalIntegerLiteral ::=
-- '0x' hexadecimalDigit+
-- | '0X' hexadecimalDigit+
| IntegerLiteral Integer -- value
-- | A null literal expression.
--
-- nullLiteral ::=
-- 'null'
| NullLiteral
| StringLiteral' StringLiteral
-- | A symbol literal expression.
--
-- symbolLiteral ::=
-- '#' (operator | (identifier ('.' identifier)*))
| SymbolLiteral [Token] -- components
deriving (Eq, Show, Typeable, Generic, Data)
data FinalConstVarOrType = FCVTFinal TypeName
| FCVTConst TypeName
| FCVTType TypeName
| FCVTVar
deriving (Eq, Show, Typeable, Generic, Data)
data FinalVarOrType = FVTFinal TypeName
| FVTType TypeName
| FVTVar
deriving (Eq, Show, Typeable, Generic, Data)
data NewOrConst = NCNew | NCConst
deriving (Eq, Show, Typeable, Generic, Data)
-- | An identifier that has an initial value associated with it. Instances of this
-- class are always children of the class [VariableDeclarationList].
--
-- variableDeclaration ::=
-- [SimpleIdentifier] ('=' [Expression])?
data VariableDeclaration = VariableDeclaration SimpleIdentifier -- name
(Maybe Expression) -- initializer
deriving (Eq, Show, Typeable, Generic, Data)
-- | The declaration of one or more variables of the same type.
--
-- variableDeclarationList ::=
-- finalConstVarOrType [VariableDeclaration] (',' [VariableDeclaration])*
--
-- finalConstVarOrType ::=
-- | 'final' [TypeName]?
-- | 'const' [TypeName]?
-- | 'var'
-- | [TypeName]
data VariableDeclarationList = VariableDeclarationList (Maybe Comment) -- comment
[Annotation] -- metadata
FinalConstVarOrType -- kind
[VariableDeclaration] -- variables
deriving (Eq, Show, Typeable, Generic, Data)
-- | The declaration of a single identifier.
--
-- declaredIdentifier ::=
-- [Annotation] finalConstVarOrType [SimpleIdentifier]
data DeclaredIdentifier = DeclaredIdentifier (Maybe Comment) -- comment
[Annotation] -- metadata
FinalConstVarOrType -- kind
SimpleIdentifier -- identifier
deriving (Eq, Show, Typeable, Generic, Data)
-- | The declaration of an enum constant.
data EnumConstantDeclaration = EnumConstantDeclaration (Maybe Comment)
[Annotation]
SimpleIdentifier
deriving (Eq, Show, Typeable, Generic, Data)
data PropertyKeyword = Get | Set | Empty
deriving (Eq, Show, Typeable, Generic, Data)
-- | A top-level declaration.
--
-- functionDeclaration ::=
-- 'external' functionSignature
-- | functionSignature [FunctionBody]
--
-- functionSignature ::=
-- [Type]? ('get' | 'set')? [SimpleIdentifier] [FormalParameterList]
data FunctionDeclaration = FunctionDeclaration (Maybe Comment) -- comment
[Annotation] -- metadata
Bool -- isExternal
(Maybe TypeName) -- returnType
PropertyKeyword -- propertyKeyword
SimpleIdentifier -- name
FunctionExpression -- functionExpression
deriving (Eq, Show, Typeable, Generic, Data)
-- | The with clause in a class declaration.
--
-- withClause ::=
-- 'with' [TypeName] (',' [TypeName])*
newtype WithClause = WithClause [TypeName] -- mixinTypes
deriving (Eq, Show, Typeable, Generic, Data)
-- | The "implements" clause in an class declaration.
--
-- implementsClause ::=
-- 'implements' [TypeName] (',' [TypeName])*
newtype ImplementsClause = ImplementsClause [TypeName] -- interfaces
deriving (Eq, Show, Typeable, Generic, Data)
-- | The declaration of a type alias.
--
-- typeAlias ::=
-- 'typedef' typeAliasBody
--
-- typeAliasBody ::=
-- classTypeAlias
-- | functionTypeAlias
data TypeAlias
-- | A class type alias.
--
-- classTypeAlias ::=
-- [SimpleIdentifier] [TypeParameterList]? '=' 'abstract'? mixinApplication
--
-- mixinApplication ::=
-- [TypeName] [WithClause] [ImplementsClause]? ';'
= ClassTypeAlias (Maybe Comment) -- comment
[Annotation] -- metadata
SimpleIdentifier -- name
(Maybe TypeParameterList) -- typeParameters
Bool -- isAbstract
TypeName -- superclass
WithClause -- withClause
(Maybe ImplementsClause) -- implementsClause
-- | A function type alias.
--
-- functionTypeAlias ::=
-- functionPrefix [TypeParameterList]? [FormalParameterList] ';'
--
-- functionPrefix ::=
-- [TypeName]? [SimpleIdentifier]
| FunctionTypeAlias (Maybe Comment) -- comment
[Annotation] -- metadata
(Maybe TypeName) -- returnType
SimpleIdentifier -- name
(Maybe TypeParameterList) -- typeParameters
FormalParameterList -- parameters
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node that declares a single name within the scope of a compilation unit.
data NamedCompilationUnitMember
= FunctionDeclaration' FunctionDeclaration
| TypeAlias TypeAlias
-- | The declaration of a class.
--
-- classDeclaration ::=
-- 'abstract'? 'class' [SimpleIdentifier] [TypeParameterList]?
-- ([ExtendsClause] [WithClause]?)?
-- [ImplementsClause]?
-- '{' [ClassMember]* '}'
| ClassDeclaration (Maybe Comment) -- comment
[Annotation] -- metadata
Bool -- isAbstract
SimpleIdentifier -- name
(Maybe TypeParameterList) -- typeParameters
(Maybe ExtendsClause) -- extendsClause
(Maybe WithClause) -- withClause
(Maybe ImplementsClause) -- implementsClause
[ClassMember] -- members
-- | The declaration of an enumeration.
--
-- enumType ::=
-- metadata 'enum' [SimpleIdentifier] '{' [SimpleIdentifier] (',' [SimpleIdentifier])* (',')? '}'
| EnumDeclaration (Maybe Comment) -- comment
[Annotation] -- metadata
SimpleIdentifier -- name
[EnumConstantDeclaration] -- constants
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node that declares one or more names within the scope of a compilation
-- unit.
--
-- compilationUnitMember ::=
-- [ClassDeclaration]
-- | [TypeAlias]
-- | [FunctionDeclaration]
-- | [MethodDeclaration]
-- | [VariableDeclaration]
-- | [VariableDeclaration]
data CompilationUnitMember
-- | The declaration of one or more top-level variables of the same type.
--
-- topLevelVariableDeclaration ::=
-- ('final' | 'const') type? staticFinalDeclarationList ';'
-- | variableDeclaration ';'
= TopLevelVariableDeclaration (Maybe Comment) -- comment
[Annotation] -- metadata
VariableDeclarationList -- variableList
| NamedCompilationUnitMember NamedCompilationUnitMember
deriving (Eq, Show, Typeable, Generic, Data)
data MethodModifier = Abstract | Static
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node that declares a name within the scope of a class.
data ClassMember
-- A constructor declaration.
--
-- constructorDeclaration ::=
-- constructorSignature [FunctionBody]?
-- | constructorName formalParameterList ':' 'this' ('.' [SimpleIdentifier])? arguments
--
-- constructorSignature ::=
-- 'external'? constructorName formalParameterList initializerList?
-- | 'external'? 'factory' factoryName formalParameterList initializerList?
-- | 'external'? 'const' constructorName formalParameterList initializerList?
--
-- constructorName ::=
-- [SimpleIdentifier] ('.' [SimpleIdentifier])?
--
-- factoryName ::=
-- [Identifier] ('.' [SimpleIdentifier])?
--
-- initializerList ::=
-- ':' [ConstructorInitializer] (',' [ConstructorInitializer])*
= ConstructorDeclaration (Maybe Comment) -- comment
[Annotation] -- metadata
Bool -- isExternal
Bool -- isConst
Bool -- isFactory
Identifier -- returnType
(Maybe SimpleIdentifier) -- name
FormalParameterList -- parameters
[ConstructorInitializer] -- initializers
(Maybe ConstructorName) -- redirectedConstructor
(Maybe FunctionBody) -- body
-- | A method declaration.
--
-- methodDeclaration ::=
-- methodSignature [FunctionBody]
--
-- methodSignature ::=
-- 'external'? ('abstract' | 'static')? [Type]? ('get' | 'set')?
-- methodName [TypeParameterList] [FormalParameterList]
--
-- methodName ::=
-- [SimpleIdentifier]
-- | 'operator' [SimpleIdentifier]
| MethodDeclaration (Maybe Comment) -- comment
[Annotation] -- metadata
Bool -- isExternal
(Maybe MethodModifier) -- methodModifier
(Maybe TypeName) -- returnType
PropertyKeyword
Bool -- isOperator
SimpleIdentifier -- name
(Maybe TypeParameterList) -- typeParameters
(Maybe FormalParameterList) -- parameters
FunctionBody -- body
-- | The declaration of one or more fields of the same type.
--
-- fieldDeclaration ::=
-- 'static'? [VariableDeclarationList] ';'
| FieldDeclaration (Maybe Comment) -- comment
[Annotation] -- metadata
Bool -- isStatic
VariableDeclarationList -- fieldList
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node that represents the declaration of one or more names. Each declared
-- name is visible within a name scope.
data Declaration
= VariableDeclaration' VariableDeclaration
| TypeParameter' TypeParameter
| ClassMember ClassMember
| DeclaredIdentifier' DeclaredIdentifier
| EnumConstantDeclaration' EnumConstantDeclaration
| CompilationUnitMember' CompilationUnitMember
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node that represents a directive that impacts the namespace of a library.
--
-- directive ::=
-- [ExportDirective]
-- | [ImportDirective]
data NamespaceDirective
-- | An export directive.
--
-- exportDirective ::=
-- [Annotation] 'export' [StringLiteral] [Combinator]* ';'
= ExportDirective (Maybe Comment) -- comment
[Annotation] -- metadata
StringLiteral -- libraryUri
[Configuration] -- configurations
[Combinator] -- combinators
-- | An import directive.
--
-- importDirective ::=
-- [Annotation] 'import' [StringLiteral] ('as' identifier)? [Combinator]* ';'
-- | [Annotation] 'import' [StringLiteral] 'deferred' 'as' identifier [Combinator]* ';'
| ImportDirective (Maybe Comment) -- comment
[Annotation] -- metadata
StringLiteral -- libraryUri
[Configuration] -- configurations
Bool -- isDeferred
(Maybe SimpleIdentifier) -- prefix
[Combinator] -- combinators
deriving (Eq, Show, Typeable, Generic, Data)
-- | A directive that references a URI.
--
-- uriBasedDirective ::=
-- [ExportDirective]
-- | [ImportDirective]
-- | [PartDirective]
data UriBasedDirective
= NamespaceDirective NamespaceDirective
-- | A part directive.
--
-- partDirective ::=
-- [Annotation] 'part' [StringLiteral] ';'
| PartDirective (Maybe Comment) -- comment
[Annotation] -- metadata
StringLiteral -- partUri
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node that represents a directive.
--
-- directive ::=
-- [ExportDirective]
-- | [ImportDirective]
-- | [LibraryDirective]
-- | [PartDirective]
-- | [PartOfDirective]
data Directive
= UriBasedDirective UriBasedDirective
-- | A part-of directive.
--
-- partOfDirective ::=
-- [Annotation] 'part' 'of' [Identifier] ';'
| PartOfDirective (Maybe Comment) -- comment
[Annotation] -- metadata
LibraryIdentifier -- libraryName
-- | A library directive.
--
-- libraryDirective ::=
-- [Annotation] 'library' [Identifier] ';'
| LibraryDirective (Maybe Comment) -- comment
[Annotation] -- metadata
LibraryIdentifier -- name
deriving (Eq, Show, Typeable, Generic, Data)
-- | An AST node that can be annotated with both a documentation comment and a
-- list of annotations.
data AnnotatedNode
= VariableDeclarationList' VariableDeclarationList
| Declaration' Declaration
| Directive Directive
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node that can occur in the initializer list of a constructor declaration.
--
-- constructorInitializer ::=
-- [SuperConstructorInvocation]
-- | [ConstructorFieldInitializer]
-- | [RedirectingConstructorInvocation]
data ConstructorInitializer
-- | The invocation of a constructor in the same class from within a constructor's
-- initialization list.
--
-- redirectingConstructorInvocation ::=
-- 'this' ('.' identifier)? arguments
= RedirectingConstructorInvocation (Maybe SimpleIdentifier) -- constructorName
ArgumentList -- argumentList
-- | The initialization of a field within a constructor's initialization list.
--
-- fieldInitializer ::=
-- ('this' '.')? [SimpleIdentifier] '=' [Expression]
| ConstructorFieldInitializer Bool -- explicitThis
SimpleIdentifier -- fieldName
Expression -- expression
-- | The invocation of a superclass' constructor from within a constructor's
-- initialization list.
--
-- superInvocation ::=
-- 'super' ('.' [SimpleIdentifier])? [ArgumentList]
| SuperConstructorInvocation (Maybe SimpleIdentifier) -- constructorName
ArgumentList -- argumentList
deriving (Eq, Show, Typeable, Generic, Data)
-- | A combinator associated with an import or export directive.
--
-- combinator ::=
-- [HideCombinator]
-- | [ShowCombinator]
data Combinator
-- | A combinator that restricts the names being imported to those in a given list.
--
-- showCombinator ::=
-- 'show' [SimpleIdentifier] (',' [SimpleIdentifier])*
= ShowCombinator [SimpleIdentifier] -- shownNames
-- | A combinator that restricts the names being imported to those that are not in
-- a given list.
--
-- hideCombinator ::=
-- 'hide' [SimpleIdentifier] (',' [SimpleIdentifier])*
| HideCombinator [SimpleIdentifier] -- hiddenNames
deriving (Eq, Show, Typeable, Generic, Data)
-- | A dotted name, used in a configuration within an import or export directive.
--
-- dottedName ::=
-- [SimpleIdentifier] ('.' [SimpleIdentifier])*
newtype DottedName = DottedName [SimpleIdentifier] -- components
deriving (Eq, Show, Typeable, Generic, Data)
-- | A configuration in either an import or export directive.
--
-- configuration ::=
-- 'if' '(' test ')' uri
--
-- test ::=
-- dottedName ('==' stringLiteral)?
--
-- dottedName ::=
-- identifier ('.' identifier)*
data Configuration = Configuration DottedName -- name
StringLiteral -- value
StringLiteral -- libraryUri
deriving (Eq, Show, Typeable, Generic, Data)
-- | The "extends" clause in a class declaration.
--
-- extendsClause ::=
-- 'extends' [TypeName]
newtype ExtendsClause = ExtendsClause TypeName -- superclass
deriving (Eq, Show, Typeable, Generic, Data)
-- | A single key/value pair in a map literal.
--
-- mapLiteralEntry ::=
-- [Expression] ':' [Expression]
data MapLiteralEntry = MapLiteralEntry Expression -- key
Expression -- value
deriving (Eq, Show, Typeable, Generic, Data)
newtype ScriptTag = ScriptTag Token -- scriptTag
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node in the AST structure for a Dart program.
data AstNode
= SwitchMember SwitchMember
| Statement Statement
| CatchClause' CatchClause
| TypeNameNode TypeName
| TypeArgumentList' TypeArgumentList
| Label' Label
| Annotation' Annotation
| Comment' Comment
| CommentReference' CommentReference
| ArgumentList' ArgumentList
| TypeParameterList' TypeParameterList
| FormalParameterList' FormalParameterList
| AnnotatedNode' AnnotatedNode
| WithClause' WithClause
| ExtendsClause' ExtendsClause
| ConstructorName' ConstructorName
| InterpolationElement' InterpolationElement
| ConstructorInitializer ConstructorInitializer
| Combinator Combinator
| Configuration' Configuration
| DottedName' DottedName
-- A script tag that can optionally occur at the beginning of a compilation unit.
--
-- scriptTag ::=
-- '#!' (~NEWLINE)* NEWLINE
| ScriptTag' ScriptTag
-- | The "native" clause in an class declaration.
--
-- nativeClause ::=
-- 'native' [StringLiteral]
| NativeClause StringLiteral -- name
| MapLiteralEntry' MapLiteralEntry
deriving (Eq, Show, Typeable, Generic, Data)
data ParameterKind = Required | Positional | Named
deriving (Eq, Show, Typeable, Generic, Data)
-- | A formal parameter that is required (is not optional).
--
-- normalFormalParameter ::=
-- [FunctionTypedFormalParameter]
-- | [FieldFormalParameter]
-- | [SimpleFormalParameter]
data NormalFormalParameter
-- | A function-typed formal parameter.
--
-- functionSignature ::=
-- [TypeName]? [SimpleIdentifier] [TypeParameterList]? [FormalParameterList]
= FunctionTypedFormalParameter (Maybe Comment) -- comment
[Annotation] -- metadata
(Maybe TypeName) -- returnType
SimpleIdentifier -- identifier
(Maybe TypeParameterList) -- typeParameters
FormalParameterList -- parameters
-- | A field formal parameter.
--
-- fieldFormalParameter ::=
-- ('final' [TypeName] | 'const' [TypeName] | 'var' | [TypeName])?
-- 'this' '.' [SimpleIdentifier]
| FieldFormalParameter (Maybe Comment) -- comment
[Annotation] -- metadata
(Maybe FinalConstVarOrType)
Bool -- explicitThis
SimpleIdentifier -- identifier
-- | A simple formal parameter.
--
-- simpleFormalParameter ::=
-- ('final' [TypeName] | 'var' | [TypeName])? [SimpleIdentifier]
| SimpleFormalParameter (Maybe Comment) -- comment
[Annotation] -- metadata
(Maybe FinalVarOrType)
SimpleIdentifier -- identifier
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node representing a parameter to a function.
--
-- formalParameter ::=
-- [NormalFormalParameter]
-- | [DefaultFormalParameter]
data FormalParameter
= NormalFormalParameter' NormalFormalParameter
-- A formal parameter with a default value. There are two kinds of parameters
-- that are both represented by this class: named formal parameters and
-- positional formal parameters.
--
-- defaultFormalParameter ::=
-- [NormalFormalParameter] ('=' [Expression])?
--
-- defaultNamedParameter ::=
-- [NormalFormalParameter] (':' [Expression])?
| DefaultFormalParameter NormalFormalParameter -- parameter
ParameterKind -- kind
(Maybe Expression) -- defaultValue
deriving (Eq, Show, Typeable, Generic, Data)
-- | The formal parameter list of a method declaration, function declaration, or
-- function type alias.
--
-- While the grammar requires all optional formal parameters to follow all of
-- the normal formal parameters and at most one grouping of optional formal
-- parameters, this class does not enforce those constraints. All parameters are
-- flattened into a single list, which can have any or all kinds of parameters
-- (normal, named, and positional) in any order.
--
-- formalParameterList ::=
-- '(' ')'
-- | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
-- | '(' optionalFormalParameters ')'
--
-- normalFormalParameters ::=
-- [NormalFormalParameter] (',' [NormalFormalParameter])*
--
-- optionalFormalParameters ::=
-- optionalPositionalFormalParameters
-- | namedFormalParameters
--
-- optionalPositionalFormalParameters ::=
-- '[' [DefaultFormalParameter] (',' [DefaultFormalParameter])* ']'
--
-- namedFormalParameters ::=
-- '{' [DefaultFormalParameter] (',' [DefaultFormalParameter])* '}'
newtype FormalParameterList = FormalParameterList [FormalParameter] -- parameters
deriving (Eq, Show, Typeable, Generic, Data)
-- | A type parameter.
--
-- typeParameter ::=
-- [SimpleIdentifier] ('extends' [TypeName])?
data TypeParameter = TypeParameter (Maybe Comment) -- comment
[Annotation] -- metadata
SimpleIdentifier -- name
(Maybe TypeName) -- bound
deriving (Eq, Show, Typeable, Generic, Data)
-- | Type parameters within a declaration.
--
-- typeParameterList ::=
-- '<' [TypeParameter] (',' [TypeParameter])* '>'
newtype TypeParameterList = TypeParameterList [TypeParameter] -- typeParameters
deriving (Eq, Show, Typeable, Generic, Data)
-- | A list of arguments in the invocation of an executable element (that is, a
-- function, method, or constructor).
--
-- argumentList ::=
-- '(' arguments? ')'
--
-- arguments ::=
-- [NamedExpression] (',' [NamedExpression])*
-- | [Expression] (',' [Expression])* (',' [NamedExpression])*
newtype ArgumentList = ArgumentList [Expression] -- arguments
deriving (Eq, Show, Typeable, Generic, Data)
-- | A reference to a Dart element that is found within a documentation comment.
--
-- commentReference ::=
-- '[' 'new'? [Identifier] ']'
data CommentReference = CommentReference Bool -- isNew
Identifier -- identifier
deriving (Eq, Show, Typeable, Generic, Data)
data CommentType = BlockComment | DocumentationComment | EndOfLineComment
deriving (Eq, Show, Typeable, Generic, Data)
-- | A comment within the source code.
--
-- comment ::=
-- endOfLineComment
-- | blockComment
-- | documentationComment
--
-- endOfLineComment ::=
-- '//' (CHARACTER - EOL)* EOL
--
-- blockComment ::=
-- '/-- ' CHARACTER* '*/'
--
-- documentationComment ::=
-- '/-- *' (CHARACTER | [CommentReference])* '*/'
-- | ('///' (CHARACTER - EOL)* EOL)+
data Comment = Comment [Token] -- tokens
CommentType -- type
[CommentReference] -- references
deriving (Eq, Show, Typeable, Generic, Data)
-- | An annotation that can be associated with an AST node.
--
-- metadata ::=
-- annotation*
--
-- annotation ::=
-- '@' [Identifier] ('.' [SimpleIdentifier])? [ArgumentList]?
data Annotation = Annotation Identifier -- name
(Maybe SimpleIdentifier) -- constructorName
(Maybe ArgumentList) -- arguments
deriving (Eq, Show, Typeable, Generic, Data)
-- | A label on either a [LabeledStatement] or a [NamedExpression].
--
-- label ::=
-- [SimpleIdentifier] ':'
newtype Label = Label SimpleIdentifier -- label
deriving (Eq, Show, Typeable, Generic, Data)
-- | The name of a type, which can optionally include type arguments.
--
-- typeName ::=
-- [Identifier] typeArguments?
data TypeName = TypeName Identifier -- name
(Maybe TypeArgumentList) --typeArguments
deriving (Eq, Show, Typeable, Generic, Data)
-- | A list of type arguments.
--
-- typeArguments ::=
-- '<' typeName (',' typeName)* '>'
data TypeArgumentList = TypeArgumentList [TypeName] -- arguments
deriving (Eq, Show, Typeable, Generic, Data)
-- | An element within a switch statement.
--
-- switchMember ::=
-- switchCase
-- | switchDefault
data SwitchMember
-- | The default case in a switch statement.
--
-- switchDefault ::=
-- [SimpleIdentifier]* 'default' ':' [Statement]*
= SwitchDefault [Label] -- labels
[Statement] -- statements
-- | A case in a switch statement.
--
-- switchCase ::=
-- [SimpleIdentifier]* 'case' [Expression] ':' [Statement]*
| SwitchCase [Label] -- labels
Expression -- expression
[Statement] -- statements
deriving (Eq, Show, Typeable, Generic, Data)
-- | A catch clause within a try statement.
--
-- onPart ::=
-- catchPart [Block]
-- | 'on' type catchPart? [Block]
--
-- catchPart ::=
-- 'catch' '(' [SimpleIdentifier] (',' [SimpleIdentifier])? ')'
data CatchClause = CatchClause (Maybe TypeName) -- exceptionType
SimpleIdentifier -- exceptionParameter
(Maybe SimpleIdentifier) -- stackTraceParameter
Block -- body
deriving (Eq, Show, Typeable, Generic, Data)
-- | A sequence of statements.
--
-- block ::=
-- '{' statement* '}'
data Block = Block [Statement] -- statements
deriving (Eq, Show, Typeable, Generic, Data)
-- | A simple identifier.
--
-- simpleIdentifier ::=
-- initialCharacter internalCharacter*
--
-- initialCharacter ::= '_' | '$' | letter
--
-- internalCharacter ::= '_' | '$' | letter | digit
newtype SimpleIdentifier = SimpleIdentifier Token -- token
deriving (Eq, Show, Typeable, Generic, Data)
-- | The identifier for a library.
--
-- libraryIdentifier ::=
-- [SimpleIdentifier] ('.' [SimpleIdentifier])*
newtype LibraryIdentifier = LibraryIdentifier [SimpleIdentifier] -- components
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node that represents an identifier.
--
-- identifier ::=
-- [SimpleIdentifier]
-- | [PrefixedIdentifier]
data Identifier
= SimpleIdentifier' SimpleIdentifier
-- | An identifier that is prefixed or an access to an object property where the
-- target of the property access is a simple identifier.
--
-- prefixedIdentifier ::=
-- [SimpleIdentifier] '.' [SimpleIdentifier]
| PrefixedIdentifier SimpleIdentifier -- prefix
SimpleIdentifier -- identifier
| LibraryIdentifier' LibraryIdentifier
deriving (Eq, Show, Typeable, Generic, Data)
data AsyncModifier = Async | Sync | AsyncStar | SyncStar
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node representing the body of a function or method.
--
-- functionBody ::=
-- [BlockFunctionBody]
-- | [EmptyFunctionBody]
-- | [ExpressionFunctionBody]
data FunctionBody
-- | A function body that consists of a block of statements.
--
-- blockFunctionBody ::=
-- ('async' | 'async' '*' | 'sync' '*')? [Block]
= BlockFunctionBody AsyncModifier -- asyncModifier
Block -- block
-- | An empty function body, which can only appear in constructors or abstract
-- methods.
--
-- emptyFunctionBody ::=
-- ';'
| EmptyFunctionBody
-- | A function body consisting of a single expression.
--
-- expressionFunctionBody ::=
-- 'async'? '=>' [Expression] ';'
| ExpressionFunctionBody Bool -- isAsync
Expression -- expression
-- | A function body that consists of a native keyword followed by a string
-- literal.
--
-- nativeFunctionBody ::=
-- 'native' [SimpleStringLiteral] ';'
| NativeFunctionBody StringLiteral -- stringLiteral
deriving (Eq, Show, Typeable, Generic, Data)
-- | A function expression.
--
-- functionExpression ::=
-- [TypeParameterList]? [FormalParameterList] [FunctionBody]
data FunctionExpression = FunctionExpression (Maybe TypeParameterList) -- typeParameters
FormalParameterList -- parameters
FunctionBody -- body
deriving (Eq, Show, Typeable, Generic, Data)
-- | The name of a constructor.
--
-- constructorName ::=
-- type ('.' identifier)?
data ConstructorName = ConstructorName TypeName -- type
(Maybe SimpleIdentifier) -- name
deriving (Eq, Show, Typeable, Generic, Data)
-- | The invocation of a function or method; either a
-- [FunctionExpressionInvocation] or a [MethodInvocation].
data InvocationExpression
-- | The invocation of a function resulting from evaluating an expression.
-- Invocations of methods and other forms of functions are represented by
-- [MethodInvocation] nodes. Invocations of getters and setters are represented
-- by either [PrefixedIdentifier] or [PropertyAccess] nodes.
--
-- functionExpressionInvocation ::=
-- [Expression] [TypeArgumentList]? [ArgumentList]
= FunctionExpressionInvocation Expression -- function
(Maybe TypeArgumentList) -- typeArguments
ArgumentList -- argumentList
-- | The invocation of either a function or a method. Invocations of functions
-- resulting from evaluating an expression are represented by
-- [FunctionExpressionInvocation] nodes. Invocations of getters and setters are
-- represented by either [PrefixedIdentifier] or [PropertyAccess] nodes.
--
-- methodInvocation ::=
-- ([Expression] '.')? [SimpleIdentifier] [TypeArgumentList]? [ArgumentList]
| MethodInvocation (Maybe Expression) -- target
SimpleIdentifier -- methodName
(Maybe TypeArgumentList) -- typeArguments
ArgumentList -- argumentList
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node that represents an expression.
--
-- expression ::=
-- [AssignmentExpression]
-- | [ConditionalExpression] cascadeSection*
-- | [ThrowExpression]
data Expression
= Literal' Literal
| Identifier' Identifier
-- | A prefix unary expression.
--
-- prefixExpression ::=
-- [Token] [Expression]
| PrefixExpression Token -- operator
Expression -- operand
-- | A postfix unary expression.
--
-- postfixExpression ::=
-- [Expression] [Token]
| PostfixExpression Expression -- operand
Token -- operator
-- | A binary (infix) expression.
--
-- binaryExpression ::=
-- [Expression] [Token] [Expression]
| BinaryExpression Expression -- leftOperand
Token -- operator
Expression -- rightOperand
-- | An assignment expression.
--
-- assignmentExpression ::=
-- [Expression] operator [Expression]
| AssignmentExpression Expression -- leftHandSide
Token -- operator
Expression -- rightHandSide
| FunctionExpression' FunctionExpression
-- | An instance creation expression.
--
-- newExpression ::=
-- ('new' | 'const') [TypeName] ('.' [SimpleIdentifier])? [ArgumentList]
| InstanceCreationExpression NewOrConst
ConstructorName -- constructorName
ArgumentList -- argumentList
-- | An as expression.
--
-- asExpression ::=
-- [Expression] 'as' [TypeName]
| AsExpression Expression -- expression
TypeName -- type
-- | An is expression.
--
-- isExpression ::=
-- [Expression] 'is' '!'? [TypeName]
| IsExpression Expression -- expression
Bool -- isNot
TypeName -- type
-- | A throw expression.
--
-- throwExpression ::=
-- 'throw' [Expression]
| ThrowExpression Expression -- expression
-- | A rethrow expression.
--
-- rethrowExpression ::=
-- 'rethrow'
| RethrowExpression
-- | A this expression.
--
-- thisExpression ::=
-- 'this'
| ThisExpression
-- | A super expression.
--
-- superExpression ::=
-- 'super'
| SuperExpression
-- | A parenthesized expression.
--
-- parenthesizedExpression ::=
-- '(' [Expression] ')'
| ParenthesizedExpression Expression -- expression
-- | The access of a property of an object.
--
-- Note, however, that accesses to properties of objects can also be represented
-- as [PrefixedIdentifier] nodes in cases where the target is also a simple
-- identifier.
--
-- propertyAccess ::=
-- [Expression] '.' [SimpleIdentifier]
| PropertyAccess Expression -- target
SimpleIdentifier -- propertyName
-- | An expression that has a name associated with it. They are used in method
-- invocations when there are named parameters.
--
-- namedExpression ::=
-- [Label] [Expression]
| NamedExpression Label -- name
Expression -- expression
| InvocationExpression InvocationExpression
-- | A conditional expression.
--
-- conditionalExpression ::=
-- [Expression] '?' [Expression] ':' [Expression]
| ConditionalExpression Expression -- condition
Expression -- thenExpression
Expression -- elseExpression
-- | A sequence of cascaded expressions: expressions that share a common target.
-- There are three kinds of expressions that can be used in a cascade
-- expression: [IndexExpression], [MethodInvocation] and [PropertyAccess].
--
-- cascadeExpression ::=
-- [Expression] cascadeSection*
--
-- cascadeSection ::=
-- '..' (cascadeSelector arguments*) (assignableSelector arguments*)*
-- (assignmentOperator expressionWithoutCascade)?
--
-- cascadeSelector ::=
-- '[ ' expression '] '
-- | identifier
| CascadeExpression Expression -- target
[Expression] -- cascadeSections
-- | An index expression.
--
-- indexExpression ::=
-- [Expression] '[' [Expression] ']'
| IndexExpressionForCasecade Expression -- index
| IndexExpressionForTarget Expression -- target
Expression -- index
-- | An await expression.
--
-- awaitExpression ::=
-- 'await' [Expression]
| AwaitExpression Expression -- expression
deriving (Eq, Show, Typeable, Generic, Data)
-- | A node that represents a statement.
--
-- statement ::=
-- [Block]
-- | [VariableDeclarationStatement]
-- | [ForStatement]
-- | [ForEachStatement]
-- | [WhileStatement]
-- | [DoStatement]
-- | [SwitchStatement]
-- | [IfStatement]
-- | [TryStatement]
-- | [BreakStatement]
-- | [ContinueStatement]
-- | [ReturnStatement]
-- | [ExpressionStatement]
-- | [FunctionDeclarationStatement]
data Statement
= Block' Block
-- | A list of variables that are being declared in a context where a statement is
-- required.
--
-- variableDeclarationStatement ::=
-- [VariableDeclarationList] ';'
| VariableDeclarationStatement VariableDeclarationList -- variableList
-- | A for statement.
--
-- forStatement ::=
-- 'for' '(' forLoopParts ')' [Statement]
--
-- forLoopParts ::=
-- forInitializerStatement ';' [Expression]? ';' [Expression]?
--
-- forInitializerStatement ::=
-- [DefaultFormalParameter]
-- | [Expression]?
| ForStatement (Maybe VariableDeclarationList) -- variableList
(Maybe Expression) -- initialization
(Maybe Expression) -- condition
[Expression] -- updaters
Statement -- body
-- | A for-each statement.
--
-- forEachStatement ::=
-- 'await'? 'for' '(' [DeclaredIdentifier] 'in' [Expression] ')' [Block]
-- | 'await'? 'for' '(' [SimpleIdentifier] 'in' [Expression] ')' [Block]
| ForEachStatementWithDeclaration Bool -- isAwait
DeclaredIdentifier -- loopVariable
Expression -- iterator
Statement -- body
| ForEachStatementWithReference Bool -- isAwait
SimpleIdentifier -- identifier
Expression -- iterator
Statement -- body
-- | A while statement.
--
-- whileStatement ::=
-- 'while' '(' [Expression] ')' [Statement]
| WhileStatement Expression -- condition
Statement -- body
-- | A do statement.
--
-- doStatement ::=
-- 'do' [Statement] 'while' '(' [Expression] ')' ';'
| DoStatement Statement -- body
Expression -- condition
-- | A switch statement.
--
-- switchStatement ::=
-- 'switch' '(' [Expression] ')' '{' [SwitchCase]* [SwitchDefault]? '}'
| SwitchStatement Expression -- expression
[SwitchMember] -- members
-- | An if statement.
--
-- ifStatement ::=
-- 'if' '(' [Expression] ')' [Statement] ('else' [Statement])?
| IfStatement Expression -- condition
Statement -- thenStatement
(Maybe Statement) -- elseStatement
-- | A try statement.
--
-- tryStatement ::=
-- 'try' [Block] ([CatchClause]+ finallyClause? | finallyClause)
--
-- finallyClause ::=
-- 'finally' [Block]
| TryStatement Block -- body
[CatchClause] -- catchClauses
(Maybe Block) -- finallyBlock
-- A break statement.
--
-- breakStatement ::=
-- 'break' [SimpleIdentifier]? ';'
| BreakStatement (Maybe SimpleIdentifier) -- label
-- | A continue statement.
--
-- continueStatement ::=
-- 'continue' [SimpleIdentifier]? ';'
| ContinueStatement (Maybe SimpleIdentifier) -- label
-- | A return statement.
--
-- returnStatement ::=
-- 'return' [Expression]? ';'
| ReturnStatement (Maybe Expression) -- expression
-- | An expression used as a statement.
--
-- expressionStatement ::=
-- [Expression]? ';'
| ExpressionStatement Expression -- expression
-- | A [FunctionDeclaration] used as a statement.
| FunctionDeclarationStatement FunctionDeclaration
-- | An assert statement.
--
-- assertStatement ::=
-- 'assert' '(' [Expression] ')' ';'
| AssertStatement Expression -- condition
(Maybe Expression) -- message
-- | A yield statement.
--
-- yieldStatement ::=
-- 'yield' '*'? [Expression] ‘;’
| YieldStatement Bool -- isStar
Expression -- expression
-- | An empty statement.
--
-- emptyStatement ::=
-- ';'
| EmptyStatement
-- | A statement that has a label associated with them.
--
-- labeledStatement ::=
-- [Label]+ [Statement]
| LabeledStatement [Label] -- labels
Statement -- statement
deriving (Eq, Show, Typeable, Generic, Data)
-- | A compilation unit.
--
-- While the grammar restricts the order of the directives and declarations
-- within a compilation unit, this class does not enforce those restrictions.
-- In particular, the children of a compilation unit will be visited in lexical
-- order even if lexical order does not conform to the restrictions of the
-- grammar.
--
-- compilationUnit ::=
-- directives declarations
--
-- directives ::=
-- [ScriptTag]? [LibraryDirective]? namespaceDirective* [PartDirective]*
-- | [PartOfDirective]
--
-- namespaceDirective ::=
-- [ImportDirective]
-- | [ExportDirective]
--
-- declarations ::=
-- [CompilationUnitMember]*
data CompilationUnit = CompilationUnit (Maybe ScriptTag) -- scriptTag
[Directive] -- directives
[CompilationUnitMember] -- declarations
deriving (Eq, Show, Typeable, Generic, Data)