Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 35.32 KB | None | 0 0
  1. // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
  2. {
  3. psiImplUtilClass="com.jetbrains.lang.dart.util.DartPsiImplUtil"
  4.  
  5. parserClass="com.jetbrains.lang.dart.DartParser"
  6. parserUtilClass="com.jetbrains.lang.dart.DartGeneratedParserUtilBase"
  7.  
  8. implements="com.jetbrains.lang.dart.psi.DartPsiCompositeElement"
  9. extends="com.jetbrains.lang.dart.psi.impl.DartPsiCompositeElementImpl"
  10.  
  11. psiClassPrefix="Dart"
  12. psiImplClassSuffix="Impl"
  13. psiPackage="com.jetbrains.lang.dart.psi"
  14. psiImplPackage="com.jetbrains.lang.dart.psi.impl"
  15.  
  16. elementTypeHolderClass="com.jetbrains.lang.dart.DartTokenTypes"
  17. elementTypePrefix=""
  18. elementTypeClass="com.jetbrains.lang.dart.DartElementType"
  19. tokenTypeClass="com.jetbrains.lang.dart.DartElementType"
  20.  
  21. tokenTypeClass="com.jetbrains.lang.dart.DartTokenTypes"
  22.  
  23. generateFirstCheck=50
  24.  
  25. tokens = [
  26. // reserved words
  27. ASSERT="assert"
  28. BREAK="break"
  29. CASE="case"
  30. CATCH="catch"
  31. CLASS="class"
  32. CONST="const"
  33. CONTINUE="continue"
  34. DEFAULT="default"
  35. DO="do"
  36. ELSE="else"
  37. ENUM="enum"
  38. EXTENDS="extends"
  39. FALSE="false"
  40. FINAL="final"
  41. FINALLY="finally"
  42. FOR="for"
  43. IF="if"
  44. IN="in"
  45. IS="is"
  46. NEW="new"
  47. NULL="null"
  48. RETHROW="rethrow"
  49. RETURN="return"
  50. SUPER="super"
  51. SWITCH="switch"
  52. THIS="this"
  53. THROW="throw"
  54. TRUE="true"
  55. TRY="try"
  56. VAR="var"
  57. VOID="void"
  58. WHILE="while"
  59. WITH="with"
  60.  
  61. // BUILT_IN_IDENTIFIER
  62. ABSTRACT="abstract"
  63. AS="as"
  64. COVARIANT="covariant"
  65. DEFERRED="deferred"
  66. EXPORT="export"
  67. EXTERNAL="external"
  68. FACTORY="factory"
  69. GET="get"
  70. IMPLEMENTS="implements"
  71. IMPORT="import"
  72. LIBRARY="library"
  73. MIXIN="mixin"
  74. OPERATOR="operator"
  75. PART="part"
  76. SET="set"
  77. STATIC="static"
  78. TYPEDEF="typedef"
  79.  
  80. // other
  81. ON="on"
  82. OF="of"
  83. NATIVE="native"
  84. SHOW="show"
  85. HIDE="hide"
  86. SYNC="sync"
  87. ASYNC="async"
  88. AWAIT="await"
  89. YIELD="yield"
  90. LATE="late"
  91. REQUIRED="required"
  92.  
  93. LBRACE="{"
  94. RBRACE="}"
  95. LBRACKET="["
  96. RBRACKET="]"
  97. LPAREN="("
  98. RPAREN=")"
  99. SEMICOLON=";"
  100. MINUS="-"
  101. MINUS_EQ="-="
  102. MINUS_MINUS="--"
  103. PLUS="+"
  104. PLUS_PLUS="++"
  105. PLUS_EQ="+="
  106. DIV="/"
  107. DIV_EQ="/="
  108. MUL="*"
  109. MUL_EQ="*="
  110. INT_DIV="~/"
  111. INT_DIV_EQ="~/="
  112. REM_EQ="%="
  113. REM="%"
  114. BIN_NOT="~"
  115. NOT="!"
  116.  
  117. EXPRESSION_BODY_DEF="=>"
  118. EQ="="
  119. EQ_EQ="=="
  120. NEQ="!="
  121. DOT="."
  122. DOT_DOT=".."
  123. QUEST_DOT_DOT="?.."
  124. DOT_DOT_DOT="..."
  125. DOT_DOT_DOT_QUEST="...?"
  126. COMMA=","
  127. COLON=":"
  128. GT=">"
  129. GT_EQ=">="
  130. GT_GT=">>"
  131. GT_GT_EQ=">>="
  132. LT="<"
  133. LT_EQ="<="
  134. LT_LT="<<"
  135. LT_LT_EQ="<<="
  136. OR="|"
  137. OR_EQ="|="
  138. OR_OR="||"
  139. OR_OR_EQ="||="
  140. QUEST="?"
  141. QUEST_DOT="?."
  142. QUEST_QUEST="??"
  143. QUEST_QUEST_EQ="??="
  144. XOR="^"
  145. XOR_EQ="^="
  146. AND="&"
  147. AND_EQ="&="
  148. AND_AND="&&"
  149. AND_AND_EQ="&&="
  150. HASH="#"
  151. AT="@"
  152. ]
  153.  
  154. extends(".*Expression")="expression"
  155. }
  156.  
  157. dartUnit ::= topLevelDefinition*
  158. private topLevelDefinition ::= libraryStatement
  159. | partOfStatement
  160. | importStatement
  161. | exportStatement
  162. | partStatement
  163. | classDefinition
  164. | mixinDeclaration
  165. | enumDefinition
  166. | functionTypeAlias
  167. | getterOrSetterDeclaration
  168. | functionDeclarationWithBodyOrNative
  169. | varDeclarationListWithSemicolon
  170. | incompleteDeclaration // not valid according to spec, but we'd like it to be parsed in order to have completion
  171. {recoverWhile="top_level_recover"}
  172. private top_level_recover ::= !(<<nonStrictID>> | '@' | 'abstract' | 'class' | 'const' | 'enum' | 'export' | 'external' | 'final' | 'get' | 'import' | 'library' | 'part' | 'set' | 'static' | 'typedef' | 'var' | 'void')
  173.  
  174. incompleteDeclaration ::= metadata* ('external' | 'static' | 'final' | 'const' | 'covariant')* type | metadata+;
  175.  
  176. partOfStatement ::= metadata* 'part' 'of' (libraryId | uriElement)';' {
  177. pin=4
  178. methods = [ getLibraryName ]
  179. }
  180.  
  181. libraryId ::= <<nonStrictID>> ('.' <<nonStrictID>>)*
  182. {mixin="com.jetbrains.lang.dart.psi.impl.DartLibraryIdBase" implements="com.jetbrains.lang.dart.psi.DartReference"}
  183.  
  184. libraryStatement ::= metadata* 'library' libraryNameElement ';' {pin=3}
  185.  
  186. libraryNameElement ::= <<nonStrictID>> ('.' <<nonStrictID>>)* {
  187. mixin="com.jetbrains.lang.dart.psi.impl.DartLibraryNameElementBase"
  188. implements="com.jetbrains.lang.dart.psi.DartPsiCompositeElement, com.intellij.psi.PsiNameIdentifierOwner"
  189. methods=[getName]
  190. }
  191.  
  192. importStatement ::= metadata* 'import' uriElement importConfig* ('deferred'? 'as' componentName )? combinator* ';' {
  193. pin=3
  194. implements="com.jetbrains.lang.dart.psi.DartImportOrExportStatement"
  195. methods = [
  196. getUriString
  197. importPrefix = "componentName"
  198. ]
  199. }
  200.  
  201. exportStatement ::= metadata* 'export' uriElement importConfig* combinator* ';' {
  202. pin=3
  203. implements="com.jetbrains.lang.dart.psi.DartImportOrExportStatement"
  204. methods = [ getUriString ]
  205. }
  206.  
  207. private importConfig ::= 'if' '(' dottedName ('==' stringLiteralExpression)? ')' stringLiteralExpression
  208. private dottedName ::= <<nonStrictID>> ('.' <<nonStrictID>>)*
  209.  
  210. private combinator ::= showCombinator | hideCombinator
  211.  
  212. showCombinator ::= 'show' libraryReferenceList {pin=1}
  213. hideCombinator ::= 'hide' libraryReferenceList {pin=1}
  214. libraryReferenceList ::= libraryComponentReferenceExpression (',' libraryComponentReferenceExpression)*
  215.  
  216. partStatement ::= metadata* 'part' uriElement ';' {
  217. pin=3
  218. implements="com.jetbrains.lang.dart.psi.DartUriBasedDirective"
  219. methods = [ getUriString ]
  220. }
  221.  
  222. metadata ::= '@' simpleQualifiedReferenceExpression <<argumentsWrapper>>?
  223.  
  224. uriElement ::= stringLiteralExpression {mixin="com.jetbrains.lang.dart.psi.impl.DartUriElementBase" methods = [ getUriStringAndItsRange ]}
  225.  
  226. varAccessDeclaration ::= metadata* 'static'? ('covariant'? 'late'? finalOrConst type componentName |
  227. 'covariant'? 'late'? finalOrConst componentName <<failIfItLooksLikeConstantObjectExpression>> |
  228. 'covariant'? 'late'? 'var' componentName |
  229. 'covariant' 'late' type !asExpression componentName |
  230. 'covariant' type !asExpression componentName |
  231. 'late' type !asExpression componentName |
  232. type !asExpression componentName) !'.' !':'
  233. {mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl" implements="com.jetbrains.lang.dart.psi.DartComponent"}
  234. private finalOrConst ::= 'final' | 'const'
  235. private varDeclarationListWithSemicolon ::= varDeclarationList ';'{pin=1}
  236. varDeclarationList ::= varAccessDeclaration varInit? (',' varDeclarationListPart)* {pin = 3}
  237. varDeclarationListPart ::= componentName varInit?
  238. {
  239. mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl"
  240. implements="com.jetbrains.lang.dart.psi.DartComponent"
  241. methods= [getMetadataList]
  242. }
  243.  
  244. classDefinition ::= metadata* 'abstract'? 'class' componentName typeParameters? (mixinApplication | standardClassDeclarationTail)
  245. {pin=4 mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartPsiClass" implements="com.jetbrains.lang.dart.psi.DartClass"}
  246.  
  247. mixinDeclaration ::= metadata* 'mixin' componentName typeParameters? onMixins? interfaces? classBody
  248. {mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartPsiClass" implements="com.jetbrains.lang.dart.psi.DartClass"}
  249.  
  250. enumDefinition ::= metadata* 'enum' componentName '{' enumConstantDeclaration (',' enumConstantDeclaration)* ','? '}'
  251. {pin=3 mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartPsiClass" implements="com.jetbrains.lang.dart.psi.DartClass"}
  252.  
  253. enumConstantDeclaration ::= componentName
  254. {
  255. mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl"
  256. implements="com.jetbrains.lang.dart.psi.DartComponent"
  257. methods = [getMetadataList]
  258. }
  259.  
  260. mixinApplication ::= '=' type mixins? interfaces? ';' {pin = 1}
  261. private standardClassDeclarationTail ::= superclass? mixins? interfaces? ('native' stringLiteralExpression?)? classBody?
  262.  
  263. classBody ::= '{' classMembers '}' {pin=1}
  264. classMembers ::= classMemberDefinition*
  265. {recoverWhile="simple_scope_recover" implements="com.jetbrains.lang.dart.psi.DartExecutionScope"}
  266. private simple_scope_recover ::= !'}'
  267.  
  268. private getterOrSetterDeclaration ::= getterDeclaration | setterDeclaration
  269.  
  270. getterDeclaration ::= getterDeclarationWithReturnType | getterDeclarationWithoutReturnType // 'get' is a valid identifier, so can be a returnType
  271. {mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl" implements="com.jetbrains.lang.dart.psi.DartComponent"}
  272. private getterDeclarationWithReturnType ::= metadata* ('external' | 'static')* returnType 'get' componentName formalParameterList? (';' | functionBodyOrNative) {pin=5}
  273. private getterDeclarationWithoutReturnType ::= metadata* ('external' | 'static')* 'get' componentName formalParameterList? (';' | functionBodyOrNative) {pin=4}
  274.  
  275. setterDeclaration ::= setterDeclarationWithReturnType | setterDeclarationWithoutReturnType // 'set' is a valid identifier, so can be a returnType
  276. {mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl" implements="com.jetbrains.lang.dart.psi.DartComponent"}
  277. private setterDeclarationWithReturnType ::= metadata* ('external' | 'static')* returnType 'set' componentName formalParameterList (';' | functionBodyOrNative) {pin=5}
  278. private setterDeclarationWithoutReturnType ::= metadata* ('external' | 'static')* 'set' componentName formalParameterList (';' | functionBodyOrNative) {pin=4}
  279.  
  280. typeParameters ::= '<' typeParameter? (',' typeParameter)* '>' {pin=1}
  281. typeParameter ::= metadata* componentName ('extends' type)?
  282. {recoverWhile="type_parameter_recover" mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl" implements="com.jetbrains.lang.dart.psi.DartComponent"}
  283.  
  284. private type_parameter_recover ::= !(<<nonStrictID>> | '(' | ',' | '=' | '>' | '@' | 'abstract' | 'class' | 'const' | 'export' | 'extends' |
  285. 'external' | 'final' | 'get' | 'implements' | 'import' | 'library' | 'native' | 'part' | 'set' |
  286. 'static' | 'typedef' | 'var' | 'void' | '{')
  287. superclass ::= 'extends' type {pin=1}
  288. mixins ::= 'with' typeList {pin=1}
  289. onMixins ::= 'on' typeList {pin=1}
  290. interfaces ::= 'implements' typeList {pin=1}
  291.  
  292. private classMemberDefinition ::= factoryConstructorDeclaration
  293. | namedConstructorDeclaration
  294. | getterOrSetterDeclaration
  295. | methodDeclaration
  296. | varDeclarationListWithSemicolon
  297. | incompleteDeclaration // not valid according to spec, but we'd like it to be parsed in order to have completion
  298. {recoverWhile="class_member_recover"}
  299. private class_member_recover ::= !(<<nonStrictID>> | '@' | 'abstract' | 'class' | 'const' | 'export' | 'external' | 'factory' | 'final' | 'get' | 'import' | 'library' | 'operator' | 'part' | 'set' | 'static' | 'typedef' | 'var' | 'void' | '}' )
  300.  
  301. private functionBodyOrNative ::= 'native' functionBody
  302. | functionNative
  303. | functionBody
  304.  
  305. private functionNative ::= 'native' (stringLiteralExpression ';' | ';' | stringLiteralExpression functionBody)
  306.  
  307. methodDeclaration ::= metadata* ('external' | 'static' | 'const')* methodDeclarationPrivate initializers? (';' | functionBodyOrNative | redirection)?
  308. {pin=3 mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartMethodDeclarationImpl" implements="com.jetbrains.lang.dart.psi.DartComponent"}
  309. private methodDeclarationPrivate ::= returnType <<methodNameWrapper>> typeParameters? formalParameterList | !untypedFunctionType <<methodNameWrapper>> typeParameters? formalParameterList // todo remove, use functionSignature as in spec
  310.  
  311. namedConstructorDeclaration ::= metadata* ('external' | 'const')* componentName '.' componentName formalParameterList initializers? (';' | functionBodyOrNative | redirection)?
  312. {pin=6 mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl" implements="com.jetbrains.lang.dart.psi.DartComponent" methods = [getComponentName]}
  313.  
  314. initializers ::= ':' superCallOrFieldInitializer (',' superCallOrFieldInitializer)*
  315.  
  316. // If it were possible to edit Object or Null then we'd have to allow for ?.
  317. redirection ::= ':' 'this' ('.' referenceExpression)? <<argumentsWrapper>> {pin=2}
  318.  
  319. fieldInitializer ::= ('this' '.')? referenceExpression '=' expression {pin=2}
  320.  
  321. superCallOrFieldInitializer ::= (superExpression | thisExpression) ('.' referenceExpression)? <<argumentsWrapper>>
  322. | fieldInitializer
  323. | assertStatement
  324. {recoverWhile="super_call_or_field_initializer_recover"}
  325. private super_call_or_field_initializer_recover ::= !(<<nonStrictID>> | ',' | ':' | ';' | '=>' | '@' | 'abstract' | 'async' | 'class' | 'const' |
  326. 'export' | 'external' | 'factory' | 'final' | 'get' | 'import' | 'library' |
  327. 'native' | 'operator' | 'part' | 'set' | 'static' | 'sync' | 'typedef' | 'var' | 'void' | '{' |
  328. '}' )
  329.  
  330. functionTypeAlias ::= metadata* 'typedef' functionPrefix typeParameters? formalParameterList ';'?
  331. | metadata* 'typedef' componentName typeParameters? '=' functionTypeWrapper ';'?
  332. {pin=5 mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl" implements="com.jetbrains.lang.dart.psi.DartComponent"}
  333. private functionPrefix ::= returnType componentName | componentName
  334.  
  335. parameterTypeList ::= '(' ')'
  336. | '(' normalParameterTypes ','? ')'
  337. | '(' normalParameterTypes ',' optionalParameterTypes ')'
  338. | '(' optionalParameterTypes ')'
  339.  
  340. private normalParameterTypes ::= normalParameterType (',' normalParameterType)*
  341. normalParameterType ::= typedIdentifier | type
  342. private typedIdentifier ::= type <<nonStrictID>>
  343.  
  344. optionalParameterTypes ::= optionalPositionalParameterTypes | namedParameterTypes
  345. private optionalPositionalParameterTypes ::= '[' normalParameterTypes ','? ']'
  346. private namedParameterTypes ::= '{' 'required'? typedIdentifier (',' 'required'? typedIdentifier)* ','? '}'
  347.  
  348. factoryConstructorDeclaration ::= metadata* ('external' | 'const')* 'factory' componentName ('.' componentName)? formalParameterList factoryTail?
  349. {pin=3 mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl" implements="com.jetbrains.lang.dart.psi.DartComponent" methods = [getComponentName]}
  350. private factoryTail ::= varFactoryDeclaration ';' | functionBodyOrNative | ';' {pin(".*")=1}
  351. private varFactoryDeclaration ::= '=' type ['.' referenceExpression] {pin(".*")=1}
  352.  
  353. userDefinableOperator ::= binaryOperator |
  354. '~' |
  355. '[' ']' '='?
  356. private binaryOperator ::= multiplicativeOperator |
  357. additiveOperator |
  358. shiftOperator|
  359. relationalOperator|
  360. '==' |
  361. bitwiseOperator
  362.  
  363. multiplicativeOperator ::= '*' | '/' | '%' | '~/'
  364. additiveOperator ::= '+' | '-'
  365. shiftOperator ::= '<<' | <<gtGt>>
  366. relationalOperator ::= <<gtEq>> | '>' | '<=' | '<'
  367. bitwiseOperator ::= '&' | '^' | '|'
  368.  
  369. assignmentOperator ::= '=' | '*=' | '/=' | '~/=' | '%=' | '+=' | '-=' | '<<=' | <<gtGtEq>> | '&=' | '&&=' | '^=' | '|=' | '||=' | '??='
  370. equalityOperator ::= '==' | '!='
  371.  
  372. formalParameterList ::= '(' ')' |
  373. '(' normalFormalParameters (',' optionalFormalParameters)? ','? ')' |
  374. '(' optionalFormalParameters ')'
  375. private normalFormalParameters ::= normalFormalParameter (',' normalFormalParameter)*
  376.  
  377. fieldFormalParameter ::= metadata* finalConstVarVoidOrType? 'this' '.' referenceExpression typeParameters? formalParameterList?
  378.  
  379. optionalFormalParameters ::= optionalPositionalFormalParameters (',' namedFormalParameters)? | namedFormalParameters
  380. private optionalPositionalFormalParameters ::= '[' defaultFormalNamedParameter (',' defaultFormalNamedParameter)* ','? ']'
  381. private namedFormalParameters ::= '{' defaultFormalNamedParameter (',' defaultFormalNamedParameter)* ','? '}'
  382.  
  383. defaultFormalNamedParameter ::= 'required'? normalFormalParameter (('=' | ':') expression)? {recoverWhile="default_formal_parameter_recover"}
  384. private default_formal_parameter_recover ::= !(')' | ',' | ']' | '}')
  385.  
  386. normalFormalParameter ::= functionFormalParameter
  387. | fieldFormalParameter
  388. | simpleFormalParameter
  389. | incorrectNormalFormalParameter {
  390. methods = [findComponentName]
  391. }
  392. private incorrectNormalFormalParameter ::= '<' + <<nonStrictID>> + '>' <<nonStrictID>> // because Analysis Server gives syntactically incorrect quick fixes, e.g. "void foo(<bottom> arg0) {\n}"
  393.  
  394. functionFormalParameter ::= !functionTypeWrapper (metadata* componentName typeParameters? formalParameterList |
  395. metadata* 'covariant'? returnType componentName typeParameters? formalParameterList |
  396. metadata* 'covariant' componentName typeParameters? formalParameterList)
  397. '?'?
  398. {mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl" implements="com.jetbrains.lang.dart.psi.DartComponent"}
  399.  
  400. simpleFormalParameter ::= declaredIdentifier | metadata* componentName | metadata* 'covariant' componentName
  401. {mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl" implements="com.jetbrains.lang.dart.psi.DartComponent"}
  402. private declaredIdentifier ::= metadata* finalConstVarOrTypeAndComponentName;
  403.  
  404. returnType ::= 'void' !untypedFunctionType | type // TODO returnType is now equivalent to type and removed from spec, we could remove it as well
  405.  
  406. private finalConstVarVoidOrType ::= 'late'? 'final' type? | 'const' type? | 'late'? 'var' | 'late'? 'void' | 'late' type | type // Be careful on using it! It may erroneously consume 'type?'. See finalConstVarOrTypeAndComponentName
  407. private finalConstVarOrTypeAndComponentName ::= 'covariant'? 'late'? 'final' type componentName |
  408. 'covariant'? 'late'? 'final' componentName |
  409. 'covariant'? 'const' type componentName |
  410. 'covariant'? 'const' componentName |
  411. 'covariant'? 'late'? 'var' componentName |
  412. 'covariant' 'late' type componentName |
  413. 'covariant' type componentName |
  414. 'late' type componentName |
  415. type componentName
  416.  
  417. componentName ::= << nonStrictID >>
  418. {mixin="com.jetbrains.lang.dart.psi.impl.DartNamedElementImpl" implements="com.jetbrains.lang.dart.psi.DartNamedElement"}
  419.  
  420. // see nonStrictID
  421. id ::= IDENTIFIER
  422.  
  423. type ::= 'void' !untypedFunctionType | functionTypeWrapper | simpleType {
  424. methods=[
  425. resolveReference getReferenceExpression getTypeArguments
  426. ]
  427. }
  428.  
  429. untypedFunctionType ::= <<functionId>> typeParameters? parameterTypeList '?'?
  430. private functionTypeWrapper ::= (voidTypeFunctionType | untypedFunctionType | simpleType) typedFunctionType+ | untypedFunctionType
  431. left typedFunctionType ::= <<functionId>> typeParameters? parameterTypeList '?'?
  432.  
  433. voidTypeFunctionType ::= 'void'
  434. simpleType ::= simpleQualifiedReferenceExpression typeArguments? '?'?
  435.  
  436. typeArguments ::= '<' typeList '>'
  437. typeList ::= type? (',' type)*
  438.  
  439. block ::= '{' statements '}' {extraRoot=true pin=1 implements="com.jetbrains.lang.dart.psi.IDartBlock"}
  440.  
  441. statements ::= statement* {implements="com.jetbrains.lang.dart.psi.DartExecutionScope"}
  442. private statement ::= label* nonLabelledStatement
  443.  
  444. private nonLabelledStatement ::= block // Guard to break tie with map literal.
  445. | functionDeclarationWithBody
  446. | forStatement
  447. | whileStatement
  448. | doWhileStatement
  449. | switchStatement
  450. | ifStatement
  451. | rethrowStatement
  452. | tryStatement
  453. | breakStatement
  454. | continueStatement
  455. | returnStatement
  456. | assertStatementWithSemicolon
  457. | statementFollowedBySemiColon
  458. | yieldEachStatement
  459. | yieldStatement
  460. | ';'
  461. | '=>' // for better recovery
  462. private statementFollowedBySemiColon ::= (varDeclarationList | expression) ';' {pin=1}
  463.  
  464. label::= componentName ':'
  465. {
  466. mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl"
  467. implements="com.jetbrains.lang.dart.psi.DartComponent"
  468. methods = [getMetadataList]
  469. }
  470.  
  471. private expressionWithRecoverUntilParen ::= expression {recoverWhile="not_paren_recover"}
  472. private expressionWithRecoverUntilParenOrComma ::= expression {recoverWhile="not_paren_or_comma_recover"}
  473. private not_paren_recover ::= !')'
  474. private not_paren_or_comma_recover ::= !(')' | ',')
  475.  
  476. whileStatement ::= 'while' '(' expressionWithRecoverUntilParen ')' statement {pin=1}
  477. doWhileStatement ::= 'do' statement 'while' '(' expressionWithRecoverUntilParen ')' ';' {pin=1}
  478. forStatement ::= 'await'? 'for' forLoopPartsInBraces statement {pin=2}
  479. //todo component
  480. private assertStatementWithSemicolon ::= assertStatement ';' {pin=1}
  481. assertStatement ::= 'assert' '(' expressionWithRecoverUntilParenOrComma (',' expressionWithRecoverUntilParenOrComma)? ','? ')' {pin=1}
  482. yieldEachStatement ::= 'yield' '*' expression ';' {pin=2}
  483. yieldStatement ::= 'yield' expression ';' {pin=1}
  484. breakStatement ::= 'break' referenceExpression? ';' {pin=1}
  485. continueStatement ::= 'continue' referenceExpression? ';' {pin=1}
  486. returnStatement ::= 'return' expression? ';' {pin=1}
  487. rethrowStatement ::= 'rethrow' ';' {pin=1}
  488.  
  489. forLoopPartsInBraces::= '(' forLoopParts ')'
  490. forLoopParts::= forInPart
  491. | varDeclarationList (';' expression? (';' expressionList?)?)?
  492. | expressionList? (';' expression? (';' expressionList?)?)?
  493. {recoverWhile="for_loops_parts_recover"}
  494.  
  495. forInPart ::= (varAccessDeclaration | componentName) 'in' expression
  496.  
  497. private for_loops_parts_recover ::= !')'
  498.  
  499. ifStatement ::= 'if' '(' expressionWithRecoverUntilParen ')' statement ('else' statement)? {pin=1}
  500. switchStatement ::= 'switch' '(' expressionWithRecoverUntilParen ')' '{' switchCase* defaultCase? '}' {pin=1}
  501.  
  502. switchCase ::= label* 'case' expression ':' statements {pin=2}
  503. defaultCase::= label* 'default' ':' statements {pin = 2}
  504.  
  505. tryStatement ::= 'try' block (onPart+ finallyPart? | finallyPart) {pin=1}
  506. onPart ::= catchPart block | 'on' type catchPart? block {pin=1}
  507. catchPart ::= 'catch' '(' componentName (',' componentName)? ')' {pin=1}
  508. finallyPart::= 'finally' block {pin=1}
  509.  
  510. varInit ::= '=' expression {pin=1}
  511.  
  512. expressionList ::= expression (','? expression)*
  513. arguments ::= '(' argumentList? ')'
  514.  
  515. argumentList ::= argumentListPart (',' argumentListPart)* ','? {recoverWhile="argument_list_recover"}
  516. private argument_list_recover ::= !(')')
  517. private argumentListPart ::= namedArgument | expression {recoverWhile="argument_list_part_recover"}
  518. private argument_list_part_recover ::= !(')' | ',')
  519.  
  520. namedArgument ::= parameterNameReferenceExpression ':' expression {
  521. methods = [
  522. getParameterReferenceExpression
  523. getExpression
  524. ]
  525. }
  526.  
  527. parameterNameReferenceExpression ::= << nonStrictID >>
  528. {mixin="com.jetbrains.lang.dart.psi.impl.DartReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  529.  
  530. expression ::= assignExpressionWrapper {recoverWhile="expression_recover"}
  531. private expression_recover ::= !(<<nonStrictID>> | <<parenthesizedExpressionWrapper>> | '!' | '!=' | '%' | '%=' |
  532. '&&' | '&&=' | '&' | '&=' | '(' | ')' | '*' | '*=' | '+' | '++' | '+=' | ',' | '-' | '--' | '-=' | '.' | '..' | '?..' | '...' | '...?' | '/' |
  533. '/=' | ':' | ';' | '<' | '<<' | '<<=' | '<=' | '=' | '==' | '=>' | '>' | <<gtGt>> | <<gtEq>> | <<gtGtEq>> |
  534. '@' | '[' | ']' | '^' | '^=' | '?.' | '??=' | '??' | '?' |
  535. 'abstract' | 'as' | 'assert' | 'async' | 'break' | 'case' | 'catch' | 'class' | 'const' |
  536. 'continue' | 'default' | 'deferred' | 'do' | 'else' | 'export' | 'external' | 'factory' | 'final' | 'finally' | 'for' |
  537. 'get' | 'hide' | 'if' | 'import' | 'is' | 'library' | 'native' | 'new' | 'on' | 'operator' | 'part' |
  538. 'rethrow' | 'return' | 'set' | 'show' | 'static' | 'super' | 'switch' | 'sync' | 'this' | 'throw' | 'try' |
  539. 'typedef' | 'var' | 'void' | 'while' | '{' | '|' | '|=' | '||' | '||=' | '}' | '~' | '~/' | '~/=' | CLOSING_QUOTE |
  540. FALSE | HEX_NUMBER | LONG_TEMPLATE_ENTRY_END | LONG_TEMPLATE_ENTRY_START | NULL | NUMBER |
  541. OPEN_QUOTE | RAW_SINGLE_QUOTED_STRING | RAW_TRIPLE_QUOTED_STRING | REGULAR_STRING_PART |
  542. SHORT_TEMPLATE_ENTRY_START | TRUE)
  543.  
  544. private assignExpressionWrapper ::= ternaryExpressionWrapper assignExpression*
  545. left assignExpression ::= assignmentOperator ternaryExpressionWrapper {pin=1} // todo right associate
  546.  
  547. private ternaryExpressionWrapper ::= ifNullExpressionWrapper ternaryExpression?
  548. left ternaryExpression ::= '?' expression ':' ternaryExpressionWrapper {pin=1}
  549.  
  550. private ifNullExpressionWrapper ::= logicOrExpressionWrapper ifNullExpression*
  551. left ifNullExpression ::= '??' logicOrExpressionWrapper
  552. {mixin="com.jetbrains.lang.dart.psi.impl.DartOperatorExpressionImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  553.  
  554. private logicOrExpressionWrapper ::= logicAndExpressionWrapper logicOrExpression*
  555. left logicOrExpression ::= '||' logicAndExpressionWrapper
  556. {mixin="com.jetbrains.lang.dart.psi.impl.DartOperatorExpressionImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  557.  
  558. private logicAndExpressionWrapper ::= compareExpressionWrapper logicAndExpression*
  559. left logicAndExpression ::= '&&' compareExpressionWrapper
  560. {mixin="com.jetbrains.lang.dart.psi.impl.DartOperatorExpressionImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  561.  
  562. private compareExpressionWrapper ::= bitwiseExpressionWrapper compareExpression*
  563. left compareExpression ::= (relationalOperator | equalityOperator) bitwiseExpressionWrapper
  564. {mixin="com.jetbrains.lang.dart.psi.impl.DartOperatorExpressionImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  565.  
  566. private bitwiseExpressionWrapper ::= shiftExpressionWrapper bitwiseExpression*
  567. left bitwiseExpression ::= bitwiseOperator shiftExpressionWrapper
  568. {mixin="com.jetbrains.lang.dart.psi.impl.DartOperatorExpressionImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  569.  
  570. private shiftExpressionWrapper ::= additiveExpressionWrapper shiftExpression*
  571. left shiftExpression ::= shiftOperator additiveExpressionWrapper
  572. {mixin="com.jetbrains.lang.dart.psi.impl.DartOperatorExpressionImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  573.  
  574. private additiveExpressionWrapper ::= multiplicativeExpressionWrapper additiveExpression*
  575. left additiveExpression ::= additiveOperator multiplicativeExpressionWrapper
  576. {mixin="com.jetbrains.lang.dart.psi.impl.DartOperatorExpressionImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  577.  
  578. private multiplicativeExpressionWrapper ::= prefixExpression multiplicativeExpression*
  579. left multiplicativeExpression ::= multiplicativeOperator prefixExpression
  580. {mixin="com.jetbrains.lang.dart.psi.impl.DartOperatorExpressionImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  581.  
  582. prefixExpression ::= (prefixOperator prefixExpression) | awaitExpression | suffixExpressionWrapper
  583. {mixin="com.jetbrains.lang.dart.psi.impl.DartOperatorExpressionImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  584. prefixOperator ::= '-' | '+' | '--' | '++' | '!' | '~'
  585.  
  586. awaitExpression ::= <<isInsideSyncOrAsyncFunction>> 'await' prefixExpression
  587. {mixin="com.jetbrains.lang.dart.psi.impl.DartReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  588.  
  589. private suffixExpressionWrapper ::= valueExpression suffixExpression*
  590. left suffixExpression ::= ('--' | '++')
  591. {mixin="com.jetbrains.lang.dart.psi.impl.DartOperatorExpressionImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  592.  
  593. valueExpression ::= primary callOrArrayAccessOrQualifiedRefExpression (isExpression | asExpression)? cascadeReferenceExpression*
  594. left isExpression ::= 'is' '!'? type
  595. left asExpression ::= 'as' type
  596. {mixin="com.jetbrains.lang.dart.psi.impl.DartClassReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  597.  
  598. private primary ::= literalExpression |
  599. functionExpression |
  600. newExpression | // constant object expression is also parsed as newExpression
  601. refOrThisOrSuperOrParenExpression |
  602. throwExpression
  603.  
  604. parenthesizedExpression ::= '(' expressionInParentheses ')'
  605. {pin=1 mixin="com.jetbrains.lang.dart.psi.impl.DartClassReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  606. private expressionInParentheses ::= expression | statement {recoverWhile=parenthesesRecovery}
  607. private parenthesesRecovery ::= !')'
  608.  
  609. private callOrArrayAccessOrQualifiedRefExpression ::= (callExpression | arrayAccessExpression | qualifiedReferenceExpression | '!')*
  610.  
  611. private refOrThisOrSuperOrParenExpression ::= (referenceExpression | thisExpression | superExpression | << parenthesizedExpressionWrapper >>)
  612.  
  613. left callExpression ::= typeArguments? <<argumentsWrapper>>
  614. {mixin="com.jetbrains.lang.dart.psi.impl.DartReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference" methods = [getArguments]}
  615. left arrayAccessExpression ::= arrayAccess
  616. {mixin="com.jetbrains.lang.dart.psi.impl.DartClassReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  617.  
  618. private arrayAccess ::= '?.'? '[' expression? ']' {pin=2}
  619.  
  620. libraryComponentReferenceExpression ::= << nonStrictID >>
  621. {mixin="com.jetbrains.lang.dart.psi.impl.DartLibraryComponentReferenceExpressionBase" implements="com.jetbrains.lang.dart.psi.DartReference"}
  622.  
  623. referenceExpression ::= << nonStrictID >>
  624. {mixin="com.jetbrains.lang.dart.psi.impl.DartReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  625.  
  626. left qualifiedReferenceExpression ::= '.' referenceExpression | '?.' referenceExpression {elementType="referenceExpression"}
  627. cascadeReferenceExpression ::= ('?..' | '..') << cascadeStopper >> (arrayAccess | refOrThisOrSuperOrParenExpression callOrArrayAccessOrQualifiedRefExpression) << varInitWrapper >>
  628. {mixin="com.jetbrains.lang.dart.psi.impl.DartReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  629.  
  630. simpleQualifiedReferenceExpression ::= referenceExpression qualifiedReferenceExpression* {elementType="referenceExpression"}
  631.  
  632. thisExpression ::= 'this'
  633. {mixin="com.jetbrains.lang.dart.psi.impl.DartReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  634. superExpression ::= 'super'
  635. {mixin="com.jetbrains.lang.dart.psi.impl.DartReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  636.  
  637. newExpression ::= newExpressionWithKeyword | simpleQualifiedReferenceExpression typeArguments '.' referenceExpression <<argumentsWrapper>> {
  638. mixin="com.jetbrains.lang.dart.psi.impl.DartReferenceImpl"
  639. implements="com.jetbrains.lang.dart.psi.DartReference"
  640. methods=[isConstantObjectExpression getArguments]
  641. }
  642.  
  643. private newExpressionWithKeyword ::= ('new' | 'const') type ('.' referenceExpression)? <<argumentsWrapper>> { pin=1 }
  644.  
  645. throwExpression ::= 'throw' expression
  646.  
  647. // todo get rid of all Wrappers and WITHOUT_CASCADE user data, implement expression parsing according to the spec and Grammar-Kit docs
  648. literalExpression ::= NULL | TRUE | FALSE | NUMBER | HEX_NUMBER | stringLiteralExpression | symbolLiteralExpression | <<setOrMapLiteralExpressionWrapper>> | <<listLiteralExpressionWrapper>>
  649. {mixin="com.jetbrains.lang.dart.psi.impl.DartClassReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  650.  
  651. symbolLiteralExpression ::= '#' ('void' | userDefinableOperator | simpleQualifiedReferenceExpression) {pin=1}
  652.  
  653. stringLiteralExpression ::= (RAW_SINGLE_QUOTED_STRING | RAW_TRIPLE_QUOTED_STRING | stringTemplate)+
  654. {mixin="com.jetbrains.lang.dart.psi.impl.DartStringLiteralExpressionBase" implements="com.jetbrains.lang.dart.psi.DartReference, com.intellij.psi.PsiLanguageInjectionHost"}
  655.  
  656. private stringTemplate ::= OPEN_QUOTE (REGULAR_STRING_PART | shortTemplateEntry | longTemplateEntry)* CLOSING_QUOTE {pin=1}
  657. shortTemplateEntry ::= SHORT_TEMPLATE_ENTRY_START (thisExpression | referenceExpression) {pin=1}
  658. longTemplateEntry ::= LONG_TEMPLATE_ENTRY_START expression LONG_TEMPLATE_ENTRY_END {pin=1}
  659.  
  660. listLiteralExpression ::= 'const'? typeArguments? '[' elements? ']'
  661. {mixin="com.jetbrains.lang.dart.psi.impl.DartClassReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  662. setOrMapLiteralExpression ::= 'const'? typeArguments? '{' elements? '}'
  663. {mixin="com.jetbrains.lang.dart.psi.impl.DartClassReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"}
  664.  
  665. private elements ::= element (','? element)* ','? ;
  666. element ::= spreadElement | ifElement | forElement | mapEntry | expression
  667.  
  668. mapEntry ::= expression ':' expression {pin=2};
  669. spreadElement ::= ('...' | '...?') expression {pin=1};
  670. ifElement ::= 'if' '(' expressionWithRecoverUntilParen ')' element ('else' element)? {pin = 1};
  671. forElement ::= 'await'? 'for' '(' forLoopParts ')' element {pin=2};
  672.  
  673. functionExpression ::= typeParameters? formalParameterList functionExpressionBody
  674. {mixin="com.jetbrains.lang.dart.psi.impl.DartFunctionExpressionBase"}
  675. functionDeclarationWithBodyOrNative ::= metadata* 'external'? (returnType componentName typeParameters? formalParameterList | componentName typeParameters? formalParameterList) ( ';' | functionBodyOrNative)
  676. {mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl" implements="com.jetbrains.lang.dart.psi.DartComponent"}
  677. functionDeclarationWithBody ::= metadata* (returnType componentName typeParameters? formalParameterList | componentName typeParameters? formalParameterList) functionBody // todo merge with functionDeclarationWithBodyOrNative
  678. {mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl" implements="com.jetbrains.lang.dart.psi.DartComponent"}
  679.  
  680. functionBody ::= arrowBodyWithSemi | <<blockBodyWrapper>> {methods=[getBlock]}
  681. private arrowBodyWithSemi ::= <<arrowBodyWrapper>> ';' {pin=1}
  682. functionExpressionBody ::= <<arrowBodyWrapper>> | <<blockBodyWrapper>>
  683.  
  684. //functionBody ::= arrowBodyWithSemi | blockBody {methods=[getBlock]}
  685. //private arrowBodyWithSemi ::= arrowBody ';' {pin=1}
  686. //functionExpressionBody ::= arrowBody | blockBody
  687.  
  688. private arrowBody ::= ('async' '*'? | 'sync' '*'?)? '=>' expression {pin=2}
  689. private blockBody ::= ('async' '*'? | 'sync' '*'?)? lazyParseableBlock
  690. private lazyParseableBlock ::= <<lazyParseableBlockImpl>>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement