[parser] Use allowCascades when calling parseThrowExpression in _parsePrecedenceExpressionLoop instead of just false
For now, see what happens.
Bug: https://github.com/dart-lang/sdk/issues/54284
Change-Id: I8e9f081ae3aa5caff7e155ef628e90547cc8afe6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/392561
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Erik Ernst <eernst@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index cbdb31f..e446b6a 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -6053,7 +6053,7 @@
operator = next;
}
token = next.next!.isA(Keyword.THROW)
- ? parseThrowExpression(next, /* allowCascades = */ false)
+ ? parseThrowExpression(next, allowCascades)
: parsePrecedenceExpression(
next, level, allowCascades, ConstantPatternContext.none);
listener.handleAssignmentExpression(operator, token);
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart b/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart
new file mode 100644
index 0000000..58ee68f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart
@@ -0,0 +1,24 @@
+var x = throw 0..isEven;
+
+void foo() {
+ var x;
+ print(x = throw 0..isEven);
+}
+
+class A {
+ var x;
+ A() : x = throw 1.isEven;
+ A() : this.x = throw 2.isEven;
+}
+
+class A {
+ var x;
+ A() : x = (throw 3..isEven);
+ A() : this.x = (throw 4..isEven);
+}
+
+class A {
+ var x;
+ A() : x = throw 5..isEven;
+ A() : this.x = throw 6..isEven;
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart.expect
new file mode 100644
index 0000000..a378a52
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart.expect
@@ -0,0 +1,328 @@
+beginCompilationUnit(var)
+ beginMetadataStar(var)
+ endMetadataStar(0)
+ beginTopLevelMember(var)
+ beginFields(DeclarationKind.TopLevel, null, null, null, null, null, null, var, )
+ handleNoType(var)
+ handleIdentifier(x, topLevelVariableDeclaration)
+ beginFieldInitializer(=)
+ handleLiteralInt(0)
+ beginCascade(..)
+ handleIdentifier(isEven, expressionContinuation)
+ handleNoTypeArguments(;)
+ handleNoArguments(;)
+ handleSend(isEven, ;)
+ handleEndingBinaryExpression(.., isEven)
+ endCascade()
+ handleThrowExpression(throw, isEven)
+ endFieldInitializer(=, isEven)
+ endTopLevelFields(null, null, null, null, null, var, 1, var, ;)
+ endTopLevelDeclaration(;)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(;, null, null)
+ handleVoidKeyword(void)
+ handleIdentifier(foo, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ beginMetadataStar(var)
+ endMetadataStar(0)
+ handleNoType(var)
+ beginVariablesDeclaration(x, null, var)
+ handleIdentifier(x, localVariableDeclaration)
+ beginInitializedIdentifier(x)
+ handleNoVariableInitializer(x)
+ endInitializedIdentifier(x)
+ endVariablesDeclaration(1, ;)
+ handleIdentifier(print, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ handleIdentifier(x, expression)
+ handleNoTypeArguments(=)
+ handleNoArguments(=)
+ handleSend(x, =)
+ handleLiteralInt(0)
+ beginCascade(..)
+ handleIdentifier(isEven, expressionContinuation)
+ handleNoTypeArguments())
+ handleNoArguments())
+ handleSend(isEven, ))
+ handleEndingBinaryExpression(.., isEven)
+ endCascade()
+ handleThrowExpression(throw, isEven)
+ handleAssignmentExpression(=, isEven)
+ endArguments(1, (, ))
+ handleSend(print, ;)
+ handleExpressionStatement(print, ;)
+ endBlockFunctionBody(2, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration(})
+ beginMetadataStar(class)
+ endMetadataStar(0)
+ beginClassOrMixinOrNamedMixinApplicationPrelude(class)
+ handleIdentifier(A, classOrMixinDeclaration)
+ handleNoTypeVariables({)
+ beginClassDeclaration(class, null, null, null, null, null, null, null, null, A)
+ handleNoType(A)
+ handleClassExtends(null, 1)
+ handleClassNoWithClause()
+ handleImplements(null, 0)
+ handleClassHeader(class, class, null)
+ beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
+ beginMetadataStar(var)
+ endMetadataStar(0)
+ beginMember()
+ beginFields(DeclarationKind.Class, null, null, null, null, null, null, var, {)
+ handleNoType(var)
+ handleIdentifier(x, fieldDeclaration)
+ handleNoFieldInitializer(;)
+ endClassFields(null, null, null, null, null, null, var, 1, var, ;)
+ endMember()
+ beginMetadataStar(A)
+ endMetadataStar(0)
+ beginMember()
+ beginMethod(DeclarationKind.Class, null, null, null, null, null, null, A, A)
+ handleNoType(;)
+ handleIdentifier(A, methodDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.NonStaticMethod)
+ endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+ beginInitializers(:)
+ beginInitializer(x)
+ handleIdentifier(x, expression)
+ handleNoTypeArguments(=)
+ handleNoArguments(=)
+ handleSend(x, =)
+ handleLiteralInt(1)
+ handleIdentifier(isEven, expressionContinuation)
+ handleNoTypeArguments(;)
+ handleNoArguments(;)
+ handleSend(isEven, ;)
+ handleEndingBinaryExpression(., isEven)
+ handleThrowExpression(throw, isEven)
+ handleAssignmentExpression(=, isEven)
+ endInitializer(isEven)
+ endInitializers(1, :, isEven)
+ handleAsyncModifier(null, null)
+ handleEmptyFunctionBody(;)
+ endClassConstructor(null, A, (, :, ;)
+ endMember()
+ beginMetadataStar(A)
+ endMetadataStar(0)
+ beginMember()
+ beginMethod(DeclarationKind.Class, null, null, null, null, null, null, A, A)
+ handleNoType(;)
+ handleIdentifier(A, methodDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.NonStaticMethod)
+ endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+ beginInitializers(:)
+ beginInitializer(this)
+ handleThisExpression(this, expression)
+ handleIdentifier(x, expressionContinuation)
+ handleNoTypeArguments(=)
+ handleNoArguments(=)
+ handleSend(x, =)
+ handleEndingBinaryExpression(., x)
+ handleLiteralInt(2)
+ handleIdentifier(isEven, expressionContinuation)
+ handleNoTypeArguments(;)
+ handleNoArguments(;)
+ handleSend(isEven, ;)
+ handleEndingBinaryExpression(., isEven)
+ handleThrowExpression(throw, isEven)
+ handleAssignmentExpression(=, isEven)
+ endInitializer(isEven)
+ endInitializers(1, :, isEven)
+ handleAsyncModifier(null, null)
+ handleEmptyFunctionBody(;)
+ endClassConstructor(null, A, (, :, ;)
+ endMember()
+ endClassOrMixinOrExtensionBody(DeclarationKind.Class, 3, {, })
+ endClassDeclaration(class, })
+ endTopLevelDeclaration(})
+ beginMetadataStar(class)
+ endMetadataStar(0)
+ beginClassOrMixinOrNamedMixinApplicationPrelude(class)
+ handleIdentifier(A, classOrMixinDeclaration)
+ handleNoTypeVariables({)
+ beginClassDeclaration(class, null, null, null, null, null, null, null, null, A)
+ handleNoType(A)
+ handleClassExtends(null, 1)
+ handleClassNoWithClause()
+ handleImplements(null, 0)
+ handleClassHeader(class, class, null)
+ beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
+ beginMetadataStar(var)
+ endMetadataStar(0)
+ beginMember()
+ beginFields(DeclarationKind.Class, null, null, null, null, null, null, var, {)
+ handleNoType(var)
+ handleIdentifier(x, fieldDeclaration)
+ handleNoFieldInitializer(;)
+ endClassFields(null, null, null, null, null, null, var, 1, var, ;)
+ endMember()
+ beginMetadataStar(A)
+ endMetadataStar(0)
+ beginMember()
+ beginMethod(DeclarationKind.Class, null, null, null, null, null, null, A, A)
+ handleNoType(;)
+ handleIdentifier(A, methodDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.NonStaticMethod)
+ endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+ beginInitializers(:)
+ beginInitializer(x)
+ handleIdentifier(x, expression)
+ handleNoTypeArguments(=)
+ handleNoArguments(=)
+ handleSend(x, =)
+ beginParenthesizedExpressionOrRecordLiteral(()
+ handleLiteralInt(3)
+ beginCascade(..)
+ handleIdentifier(isEven, expressionContinuation)
+ handleNoTypeArguments())
+ handleNoArguments())
+ handleSend(isEven, ))
+ handleEndingBinaryExpression(.., isEven)
+ endCascade()
+ handleThrowExpression(throw, isEven)
+ endParenthesizedExpression(()
+ handleAssignmentExpression(=, ))
+ endInitializer())
+ endInitializers(1, :, ))
+ handleAsyncModifier(null, null)
+ handleEmptyFunctionBody(;)
+ endClassConstructor(null, A, (, :, ;)
+ endMember()
+ beginMetadataStar(A)
+ endMetadataStar(0)
+ beginMember()
+ beginMethod(DeclarationKind.Class, null, null, null, null, null, null, A, A)
+ handleNoType(;)
+ handleIdentifier(A, methodDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.NonStaticMethod)
+ endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+ beginInitializers(:)
+ beginInitializer(this)
+ handleThisExpression(this, expression)
+ handleIdentifier(x, expressionContinuation)
+ handleNoTypeArguments(=)
+ handleNoArguments(=)
+ handleSend(x, =)
+ handleEndingBinaryExpression(., x)
+ beginParenthesizedExpressionOrRecordLiteral(()
+ handleLiteralInt(4)
+ beginCascade(..)
+ handleIdentifier(isEven, expressionContinuation)
+ handleNoTypeArguments())
+ handleNoArguments())
+ handleSend(isEven, ))
+ handleEndingBinaryExpression(.., isEven)
+ endCascade()
+ handleThrowExpression(throw, isEven)
+ endParenthesizedExpression(()
+ handleAssignmentExpression(=, ))
+ endInitializer())
+ endInitializers(1, :, ))
+ handleAsyncModifier(null, null)
+ handleEmptyFunctionBody(;)
+ endClassConstructor(null, A, (, :, ;)
+ endMember()
+ endClassOrMixinOrExtensionBody(DeclarationKind.Class, 3, {, })
+ endClassDeclaration(class, })
+ endTopLevelDeclaration(})
+ beginMetadataStar(class)
+ endMetadataStar(0)
+ beginClassOrMixinOrNamedMixinApplicationPrelude(class)
+ handleIdentifier(A, classOrMixinDeclaration)
+ handleNoTypeVariables({)
+ beginClassDeclaration(class, null, null, null, null, null, null, null, null, A)
+ handleNoType(A)
+ handleClassExtends(null, 1)
+ handleClassNoWithClause()
+ handleImplements(null, 0)
+ handleClassHeader(class, class, null)
+ beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
+ beginMetadataStar(var)
+ endMetadataStar(0)
+ beginMember()
+ beginFields(DeclarationKind.Class, null, null, null, null, null, null, var, {)
+ handleNoType(var)
+ handleIdentifier(x, fieldDeclaration)
+ handleNoFieldInitializer(;)
+ endClassFields(null, null, null, null, null, null, var, 1, var, ;)
+ endMember()
+ beginMetadataStar(A)
+ endMetadataStar(0)
+ beginMember()
+ beginMethod(DeclarationKind.Class, null, null, null, null, null, null, A, A)
+ handleNoType(;)
+ handleIdentifier(A, methodDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.NonStaticMethod)
+ endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+ beginInitializers(:)
+ beginInitializer(x)
+ handleIdentifier(x, expression)
+ handleNoTypeArguments(=)
+ handleNoArguments(=)
+ handleSend(x, =)
+ handleLiteralInt(5)
+ beginCascade(..)
+ handleIdentifier(isEven, expressionContinuation)
+ handleNoTypeArguments(;)
+ handleNoArguments(;)
+ handleSend(isEven, ;)
+ handleEndingBinaryExpression(.., isEven)
+ endCascade()
+ handleThrowExpression(throw, isEven)
+ handleAssignmentExpression(=, isEven)
+ endInitializer(isEven)
+ endInitializers(1, :, isEven)
+ handleAsyncModifier(null, null)
+ handleEmptyFunctionBody(;)
+ endClassConstructor(null, A, (, :, ;)
+ endMember()
+ beginMetadataStar(A)
+ endMetadataStar(0)
+ beginMember()
+ beginMethod(DeclarationKind.Class, null, null, null, null, null, null, A, A)
+ handleNoType(;)
+ handleIdentifier(A, methodDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.NonStaticMethod)
+ endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+ beginInitializers(:)
+ beginInitializer(this)
+ handleThisExpression(this, expression)
+ handleIdentifier(x, expressionContinuation)
+ handleNoTypeArguments(=)
+ handleNoArguments(=)
+ handleSend(x, =)
+ handleEndingBinaryExpression(., x)
+ handleLiteralInt(6)
+ beginCascade(..)
+ handleIdentifier(isEven, expressionContinuation)
+ handleNoTypeArguments(;)
+ handleNoArguments(;)
+ handleSend(isEven, ;)
+ handleEndingBinaryExpression(.., isEven)
+ endCascade()
+ handleThrowExpression(throw, isEven)
+ handleAssignmentExpression(=, isEven)
+ endInitializer(isEven)
+ endInitializers(1, :, isEven)
+ handleAsyncModifier(null, null)
+ handleEmptyFunctionBody(;)
+ endClassConstructor(null, A, (, :, ;)
+ endMember()
+ endClassOrMixinOrExtensionBody(DeclarationKind.Class, 3, {, })
+ endClassDeclaration(class, })
+ endTopLevelDeclaration(})
+endCompilationUnit(5, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart.intertwined.expect
new file mode 100644
index 0000000..3e76383
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart.intertwined.expect
@@ -0,0 +1,736 @@
+parseUnit(var)
+ skipErrorTokens(var)
+ listener: beginCompilationUnit(var)
+ syntheticPreviousToken(var)
+ parseTopLevelDeclarationImpl(, DirectiveContext(DirectiveState.Unknown))
+ parseMetadataStar()
+ listener: beginMetadataStar(var)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(var)
+ skipOuterPattern(var)
+ skipObjectPatternRest(x)
+ parseFields(, null, null, null, null, null, null, var, var, NoType(), x, DeclarationKind.TopLevel, null, false)
+ listener: beginFields(DeclarationKind.TopLevel, null, null, null, null, null, null, var, )
+ listener: handleNoType(var)
+ ensureIdentifierPotentiallyRecovered(var, topLevelVariableDeclaration, false)
+ listener: handleIdentifier(x, topLevelVariableDeclaration)
+ parseFieldInitializerOpt(x, x, null, null, null, null, var, DeclarationKind.TopLevel, null)
+ listener: beginFieldInitializer(=)
+ parseExpression(=)
+ parseThrowExpression(=, true)
+ parseExpression(throw)
+ parsePrecedenceExpression(throw, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(throw, true, ConstantPatternContext.none)
+ parsePrimary(throw, expression, ConstantPatternContext.none)
+ parseLiteralInt(throw)
+ listener: handleLiteralInt(0)
+ parseCascadeExpression(0)
+ listener: beginCascade(..)
+ parseSend(.., expressionContinuation, ConstantPatternContext.none)
+ isNextIdentifier(..)
+ ensureIdentifier(.., expressionContinuation)
+ listener: handleIdentifier(isEven, expressionContinuation)
+ listener: handleNoTypeArguments(;)
+ parseArgumentsOpt(isEven)
+ listener: handleNoArguments(;)
+ listener: handleSend(isEven, ;)
+ listener: handleEndingBinaryExpression(.., isEven)
+ parseArgumentOrIndexStar(isEven, NoTypeParamOrArg(), false)
+ listener: endCascade()
+ listener: handleThrowExpression(throw, isEven)
+ listener: endFieldInitializer(=, isEven)
+ listener: endTopLevelFields(null, null, null, null, null, var, 1, var, ;)
+ listener: endTopLevelDeclaration(;)
+ parseTopLevelDeclarationImpl(;, DirectiveContext(DirectiveState.Declarations))
+ parseMetadataStar(;)
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(;)
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(;, null, null, ;, VoidType(), null, foo, false)
+ listener: beginTopLevelMethod(;, null, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(foo, topLevelFunctionDeclaration)
+ parseMethodTypeVar(foo)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(foo, foo, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(foo, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, var)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers(var, {, null, var, null, null)
+ looksLikeLocalFunction(x)
+ listener: beginMetadataStar(var)
+ listener: endMetadataStar(0)
+ listener: handleNoType(var)
+ listener: beginVariablesDeclaration(x, null, var)
+ parseVariablesDeclarationRest(var, true)
+ parseOptionallyInitializedIdentifier(var)
+ ensureIdentifier(var, localVariableDeclaration)
+ listener: handleIdentifier(x, localVariableDeclaration)
+ listener: beginInitializedIdentifier(x)
+ parseVariableInitializerOpt(x)
+ listener: handleNoVariableInitializer(x)
+ listener: endInitializedIdentifier(x)
+ ensureSemicolon(x)
+ listener: endVariablesDeclaration(1, ;)
+ notEofOrValue(}, print)
+ parseStatement(;)
+ parseStatementX(;)
+ parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, null)
+ looksLikeLocalFunction(print)
+ parseExpressionStatement(;)
+ parseExpression(;)
+ parsePrecedenceExpression(;, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(;, true, ConstantPatternContext.none)
+ parsePrimary(;, expression, ConstantPatternContext.none)
+ parseSendOrFunctionLiteral(;, expression, ConstantPatternContext.none)
+ looksLikeFunctionBody(;)
+ parseSend(;, expression, ConstantPatternContext.none)
+ isNextIdentifier(;)
+ ensureIdentifier(;, expression)
+ listener: handleIdentifier(print, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(print)
+ parseArguments(print)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression((, true, ConstantPatternContext.none)
+ parsePrimary((, expression, ConstantPatternContext.none)
+ parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none)
+ parseSend((, expression, ConstantPatternContext.none)
+ isNextIdentifier(()
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(x, expression)
+ listener: handleNoTypeArguments(=)
+ parseArgumentsOpt(x)
+ listener: handleNoArguments(=)
+ listener: handleSend(x, =)
+ parseThrowExpression(=, true)
+ parseExpression(throw)
+ parsePrecedenceExpression(throw, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(throw, true, ConstantPatternContext.none)
+ parsePrimary(throw, expression, ConstantPatternContext.none)
+ parseLiteralInt(throw)
+ listener: handleLiteralInt(0)
+ parseCascadeExpression(0)
+ listener: beginCascade(..)
+ parseSend(.., expressionContinuation, ConstantPatternContext.none)
+ isNextIdentifier(..)
+ ensureIdentifier(.., expressionContinuation)
+ listener: handleIdentifier(isEven, expressionContinuation)
+ listener: handleNoTypeArguments())
+ parseArgumentsOpt(isEven)
+ listener: handleNoArguments())
+ listener: handleSend(isEven, ))
+ listener: handleEndingBinaryExpression(.., isEven)
+ parseArgumentOrIndexStar(isEven, NoTypeParamOrArg(), false)
+ listener: endCascade()
+ listener: handleThrowExpression(throw, isEven)
+ listener: handleAssignmentExpression(=, isEven)
+ listener: endArguments(1, (, ))
+ listener: handleSend(print, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(print, ;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(2, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration(})
+ parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations))
+ parseMetadataStar(})
+ listener: beginMetadataStar(class)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(class, }, class, null, null, null, null, DirectiveContext(DirectiveState.Declarations))
+ parseClassOrNamedMixinApplication(class, null, null, null, null, null, null, null, null, class)
+ listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
+ ensureIdentifier(class, classOrMixinDeclaration)
+ listener: handleIdentifier(A, classOrMixinDeclaration)
+ listener: handleNoTypeVariables({)
+ listener: beginClassDeclaration(class, null, null, null, null, null, null, null, null, A)
+ parseClass(A, class, class, A)
+ parseClassHeaderOpt(A, class, class)
+ parseClassExtendsOpt(A, DeclarationHeaderKind.Class)
+ listener: handleNoType(A)
+ listener: handleClassExtends(null, 1)
+ parseClassWithClauseOpt(A)
+ listener: handleClassNoWithClause()
+ parseClassOrMixinOrEnumImplementsOpt(A)
+ listener: handleImplements(null, 0)
+ listener: handleClassHeader(class, class, null)
+ parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
+ listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
+ notEofOrValue(}, var)
+ parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
+ parseMetadataStar({)
+ listener: beginMetadataStar(var)
+ listener: endMetadataStar(0)
+ listener: beginMember()
+ skipOuterPattern(var)
+ skipObjectPatternRest(x)
+ parseFields({, null, null, null, null, null, null, var, var, NoType(), x, DeclarationKind.Class, A, false)
+ listener: beginFields(DeclarationKind.Class, null, null, null, null, null, null, var, {)
+ listener: handleNoType(var)
+ ensureIdentifierPotentiallyRecovered(var, fieldDeclaration, false)
+ listener: handleIdentifier(x, fieldDeclaration)
+ parseFieldInitializerOpt(x, x, null, null, null, null, var, DeclarationKind.Class, A)
+ listener: handleNoFieldInitializer(;)
+ listener: endClassFields(null, null, null, null, null, null, var, 1, var, ;)
+ listener: endMember()
+ notEofOrValue(}, A)
+ parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, A)
+ parseMetadataStar(;)
+ listener: beginMetadataStar(A)
+ listener: endMetadataStar(0)
+ listener: beginMember()
+ isReservedKeyword(()
+ parseMethod(;, null, null, null, null, null, null, null, ;, NoType(), null, A, DeclarationKind.Class, A, false)
+ listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, A, A)
+ listener: handleNoType(;)
+ ensureIdentifierPotentiallyRecovered(;, methodDeclaration, false)
+ listener: handleIdentifier(A, methodDeclaration)
+ parseQualifiedRestOpt(A, methodDeclarationContinuation)
+ parseMethodTypeVar(A)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(A, A, false, MemberKind.NonStaticMethod)
+ parseFormalParameters(A, MemberKind.NonStaticMethod)
+ parseFormalParametersRest((, MemberKind.NonStaticMethod)
+ listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+ parseInitializersOpt())
+ parseInitializers(:)
+ listener: beginInitializers(:)
+ parseInitializer(:)
+ listener: beginInitializer(x)
+ parseInitializerExpressionRest(:)
+ parseExpression(:)
+ parsePrecedenceExpression(:, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(:, true, ConstantPatternContext.none)
+ parsePrimary(:, expression, ConstantPatternContext.none)
+ parseSendOrFunctionLiteral(:, expression, ConstantPatternContext.none)
+ parseSend(:, expression, ConstantPatternContext.none)
+ isNextIdentifier(:)
+ ensureIdentifier(:, expression)
+ listener: handleIdentifier(x, expression)
+ listener: handleNoTypeArguments(=)
+ parseArgumentsOpt(x)
+ listener: handleNoArguments(=)
+ listener: handleSend(x, =)
+ parseThrowExpression(=, true)
+ parseExpression(throw)
+ parsePrecedenceExpression(throw, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(throw, true, ConstantPatternContext.none)
+ parsePrimary(throw, expression, ConstantPatternContext.none)
+ parseLiteralInt(throw)
+ listener: handleLiteralInt(1)
+ parsePrimary(., expressionContinuation, ConstantPatternContext.none)
+ parseSendOrFunctionLiteral(., expressionContinuation, ConstantPatternContext.none)
+ parseSend(., expressionContinuation, ConstantPatternContext.none)
+ isNextIdentifier(.)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(isEven, expressionContinuation)
+ listener: handleNoTypeArguments(;)
+ parseArgumentsOpt(isEven)
+ listener: handleNoArguments(;)
+ listener: handleSend(isEven, ;)
+ listener: handleEndingBinaryExpression(., isEven)
+ listener: handleThrowExpression(throw, isEven)
+ listener: handleAssignmentExpression(=, isEven)
+ listener: endInitializer(isEven)
+ listener: endInitializers(1, :, isEven)
+ parseAsyncModifierOpt(isEven)
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ inPlainSync()
+ parseFunctionBody(isEven, false, true)
+ listener: handleEmptyFunctionBody(;)
+ listener: endClassConstructor(null, A, (, :, ;)
+ listener: endMember()
+ notEofOrValue(}, A)
+ parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, A)
+ parseMetadataStar(;)
+ listener: beginMetadataStar(A)
+ listener: endMetadataStar(0)
+ listener: beginMember()
+ isReservedKeyword(()
+ parseMethod(;, null, null, null, null, null, null, null, ;, NoType(), null, A, DeclarationKind.Class, A, false)
+ listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, A, A)
+ listener: handleNoType(;)
+ ensureIdentifierPotentiallyRecovered(;, methodDeclaration, false)
+ listener: handleIdentifier(A, methodDeclaration)
+ parseQualifiedRestOpt(A, methodDeclarationContinuation)
+ parseMethodTypeVar(A)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(A, A, false, MemberKind.NonStaticMethod)
+ parseFormalParameters(A, MemberKind.NonStaticMethod)
+ parseFormalParametersRest((, MemberKind.NonStaticMethod)
+ listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+ parseInitializersOpt())
+ parseInitializers(:)
+ listener: beginInitializers(:)
+ parseInitializer(:)
+ listener: beginInitializer(this)
+ parseInitializerExpressionRest(:)
+ parseExpression(:)
+ parsePrecedenceExpression(:, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(:, true, ConstantPatternContext.none)
+ parsePrimary(:, expression, ConstantPatternContext.none)
+ parseThisExpression(:, expression)
+ listener: handleThisExpression(this, expression)
+ parsePrimary(., expressionContinuation, ConstantPatternContext.none)
+ parseSendOrFunctionLiteral(., expressionContinuation, ConstantPatternContext.none)
+ parseSend(., expressionContinuation, ConstantPatternContext.none)
+ isNextIdentifier(.)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(x, expressionContinuation)
+ listener: handleNoTypeArguments(=)
+ parseArgumentsOpt(x)
+ listener: handleNoArguments(=)
+ listener: handleSend(x, =)
+ listener: handleEndingBinaryExpression(., x)
+ parseThrowExpression(=, true)
+ parseExpression(throw)
+ parsePrecedenceExpression(throw, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(throw, true, ConstantPatternContext.none)
+ parsePrimary(throw, expression, ConstantPatternContext.none)
+ parseLiteralInt(throw)
+ listener: handleLiteralInt(2)
+ parsePrimary(., expressionContinuation, ConstantPatternContext.none)
+ parseSendOrFunctionLiteral(., expressionContinuation, ConstantPatternContext.none)
+ parseSend(., expressionContinuation, ConstantPatternContext.none)
+ isNextIdentifier(.)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(isEven, expressionContinuation)
+ listener: handleNoTypeArguments(;)
+ parseArgumentsOpt(isEven)
+ listener: handleNoArguments(;)
+ listener: handleSend(isEven, ;)
+ listener: handleEndingBinaryExpression(., isEven)
+ listener: handleThrowExpression(throw, isEven)
+ listener: handleAssignmentExpression(=, isEven)
+ listener: endInitializer(isEven)
+ listener: endInitializers(1, :, isEven)
+ parseAsyncModifierOpt(isEven)
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ inPlainSync()
+ parseFunctionBody(isEven, false, true)
+ listener: handleEmptyFunctionBody(;)
+ listener: endClassConstructor(null, A, (, :, ;)
+ listener: endMember()
+ notEofOrValue(}, })
+ listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 3, {, })
+ listener: endClassDeclaration(class, })
+ listener: endTopLevelDeclaration(})
+ parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations))
+ parseMetadataStar(})
+ listener: beginMetadataStar(class)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(class, }, class, null, null, null, null, DirectiveContext(DirectiveState.Declarations))
+ parseClassOrNamedMixinApplication(class, null, null, null, null, null, null, null, null, class)
+ listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
+ ensureIdentifier(class, classOrMixinDeclaration)
+ listener: handleIdentifier(A, classOrMixinDeclaration)
+ listener: handleNoTypeVariables({)
+ listener: beginClassDeclaration(class, null, null, null, null, null, null, null, null, A)
+ parseClass(A, class, class, A)
+ parseClassHeaderOpt(A, class, class)
+ parseClassExtendsOpt(A, DeclarationHeaderKind.Class)
+ listener: handleNoType(A)
+ listener: handleClassExtends(null, 1)
+ parseClassWithClauseOpt(A)
+ listener: handleClassNoWithClause()
+ parseClassOrMixinOrEnumImplementsOpt(A)
+ listener: handleImplements(null, 0)
+ listener: handleClassHeader(class, class, null)
+ parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
+ listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
+ notEofOrValue(}, var)
+ parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
+ parseMetadataStar({)
+ listener: beginMetadataStar(var)
+ listener: endMetadataStar(0)
+ listener: beginMember()
+ skipOuterPattern(var)
+ skipObjectPatternRest(x)
+ parseFields({, null, null, null, null, null, null, var, var, NoType(), x, DeclarationKind.Class, A, false)
+ listener: beginFields(DeclarationKind.Class, null, null, null, null, null, null, var, {)
+ listener: handleNoType(var)
+ ensureIdentifierPotentiallyRecovered(var, fieldDeclaration, false)
+ listener: handleIdentifier(x, fieldDeclaration)
+ parseFieldInitializerOpt(x, x, null, null, null, null, var, DeclarationKind.Class, A)
+ listener: handleNoFieldInitializer(;)
+ listener: endClassFields(null, null, null, null, null, null, var, 1, var, ;)
+ listener: endMember()
+ notEofOrValue(}, A)
+ parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, A)
+ parseMetadataStar(;)
+ listener: beginMetadataStar(A)
+ listener: endMetadataStar(0)
+ listener: beginMember()
+ isReservedKeyword(()
+ parseMethod(;, null, null, null, null, null, null, null, ;, NoType(), null, A, DeclarationKind.Class, A, false)
+ listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, A, A)
+ listener: handleNoType(;)
+ ensureIdentifierPotentiallyRecovered(;, methodDeclaration, false)
+ listener: handleIdentifier(A, methodDeclaration)
+ parseQualifiedRestOpt(A, methodDeclarationContinuation)
+ parseMethodTypeVar(A)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(A, A, false, MemberKind.NonStaticMethod)
+ parseFormalParameters(A, MemberKind.NonStaticMethod)
+ parseFormalParametersRest((, MemberKind.NonStaticMethod)
+ listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+ parseInitializersOpt())
+ parseInitializers(:)
+ listener: beginInitializers(:)
+ parseInitializer(:)
+ listener: beginInitializer(x)
+ parseInitializerExpressionRest(:)
+ parseExpression(:)
+ parsePrecedenceExpression(:, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(:, true, ConstantPatternContext.none)
+ parsePrimary(:, expression, ConstantPatternContext.none)
+ parseSendOrFunctionLiteral(:, expression, ConstantPatternContext.none)
+ parseSend(:, expression, ConstantPatternContext.none)
+ isNextIdentifier(:)
+ ensureIdentifier(:, expression)
+ listener: handleIdentifier(x, expression)
+ listener: handleNoTypeArguments(=)
+ parseArgumentsOpt(x)
+ listener: handleNoArguments(=)
+ listener: handleSend(x, =)
+ parsePrecedenceExpression(=, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(=, true, ConstantPatternContext.none)
+ parsePrimary(=, expression, ConstantPatternContext.none)
+ parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=, ConstantPatternContext.none)
+ parseParenthesizedExpressionOrRecordLiteral(=, null, ConstantPatternContext.none)
+ listener: beginParenthesizedExpressionOrRecordLiteral(()
+ parseExpression(()
+ parseThrowExpression((, true)
+ parseExpression(throw)
+ parsePrecedenceExpression(throw, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(throw, true, ConstantPatternContext.none)
+ parsePrimary(throw, expression, ConstantPatternContext.none)
+ parseLiteralInt(throw)
+ listener: handleLiteralInt(3)
+ parseCascadeExpression(3)
+ listener: beginCascade(..)
+ parseSend(.., expressionContinuation, ConstantPatternContext.none)
+ isNextIdentifier(..)
+ ensureIdentifier(.., expressionContinuation)
+ listener: handleIdentifier(isEven, expressionContinuation)
+ listener: handleNoTypeArguments())
+ parseArgumentsOpt(isEven)
+ listener: handleNoArguments())
+ listener: handleSend(isEven, ))
+ listener: handleEndingBinaryExpression(.., isEven)
+ parseArgumentOrIndexStar(isEven, NoTypeParamOrArg(), false)
+ listener: endCascade()
+ listener: handleThrowExpression(throw, isEven)
+ ensureCloseParen(isEven, ()
+ listener: endParenthesizedExpression(()
+ listener: handleAssignmentExpression(=, ))
+ listener: endInitializer())
+ listener: endInitializers(1, :, ))
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ inPlainSync()
+ parseFunctionBody(), false, true)
+ listener: handleEmptyFunctionBody(;)
+ listener: endClassConstructor(null, A, (, :, ;)
+ listener: endMember()
+ notEofOrValue(}, A)
+ parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, A)
+ parseMetadataStar(;)
+ listener: beginMetadataStar(A)
+ listener: endMetadataStar(0)
+ listener: beginMember()
+ isReservedKeyword(()
+ parseMethod(;, null, null, null, null, null, null, null, ;, NoType(), null, A, DeclarationKind.Class, A, false)
+ listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, A, A)
+ listener: handleNoType(;)
+ ensureIdentifierPotentiallyRecovered(;, methodDeclaration, false)
+ listener: handleIdentifier(A, methodDeclaration)
+ parseQualifiedRestOpt(A, methodDeclarationContinuation)
+ parseMethodTypeVar(A)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(A, A, false, MemberKind.NonStaticMethod)
+ parseFormalParameters(A, MemberKind.NonStaticMethod)
+ parseFormalParametersRest((, MemberKind.NonStaticMethod)
+ listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+ parseInitializersOpt())
+ parseInitializers(:)
+ listener: beginInitializers(:)
+ parseInitializer(:)
+ listener: beginInitializer(this)
+ parseInitializerExpressionRest(:)
+ parseExpression(:)
+ parsePrecedenceExpression(:, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(:, true, ConstantPatternContext.none)
+ parsePrimary(:, expression, ConstantPatternContext.none)
+ parseThisExpression(:, expression)
+ listener: handleThisExpression(this, expression)
+ parsePrimary(., expressionContinuation, ConstantPatternContext.none)
+ parseSendOrFunctionLiteral(., expressionContinuation, ConstantPatternContext.none)
+ parseSend(., expressionContinuation, ConstantPatternContext.none)
+ isNextIdentifier(.)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(x, expressionContinuation)
+ listener: handleNoTypeArguments(=)
+ parseArgumentsOpt(x)
+ listener: handleNoArguments(=)
+ listener: handleSend(x, =)
+ listener: handleEndingBinaryExpression(., x)
+ parsePrecedenceExpression(=, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(=, true, ConstantPatternContext.none)
+ parsePrimary(=, expression, ConstantPatternContext.none)
+ parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(=, ConstantPatternContext.none)
+ parseParenthesizedExpressionOrRecordLiteral(=, null, ConstantPatternContext.none)
+ listener: beginParenthesizedExpressionOrRecordLiteral(()
+ parseExpression(()
+ parseThrowExpression((, true)
+ parseExpression(throw)
+ parsePrecedenceExpression(throw, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(throw, true, ConstantPatternContext.none)
+ parsePrimary(throw, expression, ConstantPatternContext.none)
+ parseLiteralInt(throw)
+ listener: handleLiteralInt(4)
+ parseCascadeExpression(4)
+ listener: beginCascade(..)
+ parseSend(.., expressionContinuation, ConstantPatternContext.none)
+ isNextIdentifier(..)
+ ensureIdentifier(.., expressionContinuation)
+ listener: handleIdentifier(isEven, expressionContinuation)
+ listener: handleNoTypeArguments())
+ parseArgumentsOpt(isEven)
+ listener: handleNoArguments())
+ listener: handleSend(isEven, ))
+ listener: handleEndingBinaryExpression(.., isEven)
+ parseArgumentOrIndexStar(isEven, NoTypeParamOrArg(), false)
+ listener: endCascade()
+ listener: handleThrowExpression(throw, isEven)
+ ensureCloseParen(isEven, ()
+ listener: endParenthesizedExpression(()
+ listener: handleAssignmentExpression(=, ))
+ listener: endInitializer())
+ listener: endInitializers(1, :, ))
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ inPlainSync()
+ parseFunctionBody(), false, true)
+ listener: handleEmptyFunctionBody(;)
+ listener: endClassConstructor(null, A, (, :, ;)
+ listener: endMember()
+ notEofOrValue(}, })
+ listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 3, {, })
+ listener: endClassDeclaration(class, })
+ listener: endTopLevelDeclaration(})
+ parseTopLevelDeclarationImpl(}, DirectiveContext(DirectiveState.Declarations))
+ parseMetadataStar(})
+ listener: beginMetadataStar(class)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(class, }, class, null, null, null, null, DirectiveContext(DirectiveState.Declarations))
+ parseClassOrNamedMixinApplication(class, null, null, null, null, null, null, null, null, class)
+ listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
+ ensureIdentifier(class, classOrMixinDeclaration)
+ listener: handleIdentifier(A, classOrMixinDeclaration)
+ listener: handleNoTypeVariables({)
+ listener: beginClassDeclaration(class, null, null, null, null, null, null, null, null, A)
+ parseClass(A, class, class, A)
+ parseClassHeaderOpt(A, class, class)
+ parseClassExtendsOpt(A, DeclarationHeaderKind.Class)
+ listener: handleNoType(A)
+ listener: handleClassExtends(null, 1)
+ parseClassWithClauseOpt(A)
+ listener: handleClassNoWithClause()
+ parseClassOrMixinOrEnumImplementsOpt(A)
+ listener: handleImplements(null, 0)
+ listener: handleClassHeader(class, class, null)
+ parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
+ listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
+ notEofOrValue(}, var)
+ parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
+ parseMetadataStar({)
+ listener: beginMetadataStar(var)
+ listener: endMetadataStar(0)
+ listener: beginMember()
+ skipOuterPattern(var)
+ skipObjectPatternRest(x)
+ parseFields({, null, null, null, null, null, null, var, var, NoType(), x, DeclarationKind.Class, A, false)
+ listener: beginFields(DeclarationKind.Class, null, null, null, null, null, null, var, {)
+ listener: handleNoType(var)
+ ensureIdentifierPotentiallyRecovered(var, fieldDeclaration, false)
+ listener: handleIdentifier(x, fieldDeclaration)
+ parseFieldInitializerOpt(x, x, null, null, null, null, var, DeclarationKind.Class, A)
+ listener: handleNoFieldInitializer(;)
+ listener: endClassFields(null, null, null, null, null, null, var, 1, var, ;)
+ listener: endMember()
+ notEofOrValue(}, A)
+ parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, A)
+ parseMetadataStar(;)
+ listener: beginMetadataStar(A)
+ listener: endMetadataStar(0)
+ listener: beginMember()
+ isReservedKeyword(()
+ parseMethod(;, null, null, null, null, null, null, null, ;, NoType(), null, A, DeclarationKind.Class, A, false)
+ listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, A, A)
+ listener: handleNoType(;)
+ ensureIdentifierPotentiallyRecovered(;, methodDeclaration, false)
+ listener: handleIdentifier(A, methodDeclaration)
+ parseQualifiedRestOpt(A, methodDeclarationContinuation)
+ parseMethodTypeVar(A)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(A, A, false, MemberKind.NonStaticMethod)
+ parseFormalParameters(A, MemberKind.NonStaticMethod)
+ parseFormalParametersRest((, MemberKind.NonStaticMethod)
+ listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+ parseInitializersOpt())
+ parseInitializers(:)
+ listener: beginInitializers(:)
+ parseInitializer(:)
+ listener: beginInitializer(x)
+ parseInitializerExpressionRest(:)
+ parseExpression(:)
+ parsePrecedenceExpression(:, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(:, true, ConstantPatternContext.none)
+ parsePrimary(:, expression, ConstantPatternContext.none)
+ parseSendOrFunctionLiteral(:, expression, ConstantPatternContext.none)
+ parseSend(:, expression, ConstantPatternContext.none)
+ isNextIdentifier(:)
+ ensureIdentifier(:, expression)
+ listener: handleIdentifier(x, expression)
+ listener: handleNoTypeArguments(=)
+ parseArgumentsOpt(x)
+ listener: handleNoArguments(=)
+ listener: handleSend(x, =)
+ parseThrowExpression(=, true)
+ parseExpression(throw)
+ parsePrecedenceExpression(throw, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(throw, true, ConstantPatternContext.none)
+ parsePrimary(throw, expression, ConstantPatternContext.none)
+ parseLiteralInt(throw)
+ listener: handleLiteralInt(5)
+ parseCascadeExpression(5)
+ listener: beginCascade(..)
+ parseSend(.., expressionContinuation, ConstantPatternContext.none)
+ isNextIdentifier(..)
+ ensureIdentifier(.., expressionContinuation)
+ listener: handleIdentifier(isEven, expressionContinuation)
+ listener: handleNoTypeArguments(;)
+ parseArgumentsOpt(isEven)
+ listener: handleNoArguments(;)
+ listener: handleSend(isEven, ;)
+ listener: handleEndingBinaryExpression(.., isEven)
+ parseArgumentOrIndexStar(isEven, NoTypeParamOrArg(), false)
+ listener: endCascade()
+ listener: handleThrowExpression(throw, isEven)
+ listener: handleAssignmentExpression(=, isEven)
+ listener: endInitializer(isEven)
+ listener: endInitializers(1, :, isEven)
+ parseAsyncModifierOpt(isEven)
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ inPlainSync()
+ parseFunctionBody(isEven, false, true)
+ listener: handleEmptyFunctionBody(;)
+ listener: endClassConstructor(null, A, (, :, ;)
+ listener: endMember()
+ notEofOrValue(}, A)
+ parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, A)
+ parseMetadataStar(;)
+ listener: beginMetadataStar(A)
+ listener: endMetadataStar(0)
+ listener: beginMember()
+ isReservedKeyword(()
+ parseMethod(;, null, null, null, null, null, null, null, ;, NoType(), null, A, DeclarationKind.Class, A, false)
+ listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, null, A, A)
+ listener: handleNoType(;)
+ ensureIdentifierPotentiallyRecovered(;, methodDeclaration, false)
+ listener: handleIdentifier(A, methodDeclaration)
+ parseQualifiedRestOpt(A, methodDeclarationContinuation)
+ parseMethodTypeVar(A)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(A, A, false, MemberKind.NonStaticMethod)
+ parseFormalParameters(A, MemberKind.NonStaticMethod)
+ parseFormalParametersRest((, MemberKind.NonStaticMethod)
+ listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+ parseInitializersOpt())
+ parseInitializers(:)
+ listener: beginInitializers(:)
+ parseInitializer(:)
+ listener: beginInitializer(this)
+ parseInitializerExpressionRest(:)
+ parseExpression(:)
+ parsePrecedenceExpression(:, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(:, true, ConstantPatternContext.none)
+ parsePrimary(:, expression, ConstantPatternContext.none)
+ parseThisExpression(:, expression)
+ listener: handleThisExpression(this, expression)
+ parsePrimary(., expressionContinuation, ConstantPatternContext.none)
+ parseSendOrFunctionLiteral(., expressionContinuation, ConstantPatternContext.none)
+ parseSend(., expressionContinuation, ConstantPatternContext.none)
+ isNextIdentifier(.)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(x, expressionContinuation)
+ listener: handleNoTypeArguments(=)
+ parseArgumentsOpt(x)
+ listener: handleNoArguments(=)
+ listener: handleSend(x, =)
+ listener: handleEndingBinaryExpression(., x)
+ parseThrowExpression(=, true)
+ parseExpression(throw)
+ parsePrecedenceExpression(throw, 1, true, ConstantPatternContext.none)
+ parseUnaryExpression(throw, true, ConstantPatternContext.none)
+ parsePrimary(throw, expression, ConstantPatternContext.none)
+ parseLiteralInt(throw)
+ listener: handleLiteralInt(6)
+ parseCascadeExpression(6)
+ listener: beginCascade(..)
+ parseSend(.., expressionContinuation, ConstantPatternContext.none)
+ isNextIdentifier(..)
+ ensureIdentifier(.., expressionContinuation)
+ listener: handleIdentifier(isEven, expressionContinuation)
+ listener: handleNoTypeArguments(;)
+ parseArgumentsOpt(isEven)
+ listener: handleNoArguments(;)
+ listener: handleSend(isEven, ;)
+ listener: handleEndingBinaryExpression(.., isEven)
+ parseArgumentOrIndexStar(isEven, NoTypeParamOrArg(), false)
+ listener: endCascade()
+ listener: handleThrowExpression(throw, isEven)
+ listener: handleAssignmentExpression(=, isEven)
+ listener: endInitializer(isEven)
+ listener: endInitializers(1, :, isEven)
+ parseAsyncModifierOpt(isEven)
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ inPlainSync()
+ parseFunctionBody(isEven, false, true)
+ listener: handleEmptyFunctionBody(;)
+ listener: endClassConstructor(null, A, (, :, ;)
+ listener: endMember()
+ notEofOrValue(}, })
+ listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 3, {, })
+ listener: endClassDeclaration(class, })
+ listener: endTopLevelDeclaration(})
+ reportAllErrorTokens(var)
+ listener: endCompilationUnit(5, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart.parser.expect
new file mode 100644
index 0000000..90e153e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart.parser.expect
@@ -0,0 +1,51 @@
+var x = throw 0..isEven;
+
+void foo() {
+var x;
+print(x = throw 0..isEven);
+}
+
+class A {
+var x;
+A() : x = throw 1.isEven;
+A() : this.x = throw 2.isEven;
+}
+
+class A {
+var x;
+A() : x = (throw 3..isEven);
+A() : this.x = (throw 4..isEven);
+}
+
+class A {
+var x;
+A() : x = throw 5..isEven;
+A() : this.x = throw 6..isEven;
+}
+
+
+var[KeywordToken] x[StringToken] =[SimpleToken] throw[KeywordToken] 0[StringToken]..[SimpleToken]isEven[StringToken];[SimpleToken]
+
+void[KeywordToken] foo[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+var[KeywordToken] x[StringToken];[SimpleToken]
+print[StringToken]([BeginToken]x[StringToken] =[SimpleToken] throw[KeywordToken] 0[StringToken]..[SimpleToken]isEven[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+var[KeywordToken] x[StringToken];[SimpleToken]
+A[StringToken]([BeginToken])[SimpleToken] :[SimpleToken] x[StringToken] =[SimpleToken] throw[KeywordToken] 1[StringToken].[SimpleToken]isEven[StringToken];[SimpleToken]
+A[StringToken]([BeginToken])[SimpleToken] :[SimpleToken] this[KeywordToken].[SimpleToken]x[StringToken] =[SimpleToken] throw[KeywordToken] 2[StringToken].[SimpleToken]isEven[StringToken];[SimpleToken]
+}[SimpleToken]
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+var[KeywordToken] x[StringToken];[SimpleToken]
+A[StringToken]([BeginToken])[SimpleToken] :[SimpleToken] x[StringToken] =[SimpleToken] ([BeginToken]throw[KeywordToken] 3[StringToken]..[SimpleToken]isEven[StringToken])[SimpleToken];[SimpleToken]
+A[StringToken]([BeginToken])[SimpleToken] :[SimpleToken] this[KeywordToken].[SimpleToken]x[StringToken] =[SimpleToken] ([BeginToken]throw[KeywordToken] 4[StringToken]..[SimpleToken]isEven[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+var[KeywordToken] x[StringToken];[SimpleToken]
+A[StringToken]([BeginToken])[SimpleToken] :[SimpleToken] x[StringToken] =[SimpleToken] throw[KeywordToken] 5[StringToken]..[SimpleToken]isEven[StringToken];[SimpleToken]
+A[StringToken]([BeginToken])[SimpleToken] :[SimpleToken] this[KeywordToken].[SimpleToken]x[StringToken] =[SimpleToken] throw[KeywordToken] 6[StringToken]..[SimpleToken]isEven[StringToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart.scanner.expect
new file mode 100644
index 0000000..90e153e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_54284.dart.scanner.expect
@@ -0,0 +1,51 @@
+var x = throw 0..isEven;
+
+void foo() {
+var x;
+print(x = throw 0..isEven);
+}
+
+class A {
+var x;
+A() : x = throw 1.isEven;
+A() : this.x = throw 2.isEven;
+}
+
+class A {
+var x;
+A() : x = (throw 3..isEven);
+A() : this.x = (throw 4..isEven);
+}
+
+class A {
+var x;
+A() : x = throw 5..isEven;
+A() : this.x = throw 6..isEven;
+}
+
+
+var[KeywordToken] x[StringToken] =[SimpleToken] throw[KeywordToken] 0[StringToken]..[SimpleToken]isEven[StringToken];[SimpleToken]
+
+void[KeywordToken] foo[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+var[KeywordToken] x[StringToken];[SimpleToken]
+print[StringToken]([BeginToken]x[StringToken] =[SimpleToken] throw[KeywordToken] 0[StringToken]..[SimpleToken]isEven[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+var[KeywordToken] x[StringToken];[SimpleToken]
+A[StringToken]([BeginToken])[SimpleToken] :[SimpleToken] x[StringToken] =[SimpleToken] throw[KeywordToken] 1[StringToken].[SimpleToken]isEven[StringToken];[SimpleToken]
+A[StringToken]([BeginToken])[SimpleToken] :[SimpleToken] this[KeywordToken].[SimpleToken]x[StringToken] =[SimpleToken] throw[KeywordToken] 2[StringToken].[SimpleToken]isEven[StringToken];[SimpleToken]
+}[SimpleToken]
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+var[KeywordToken] x[StringToken];[SimpleToken]
+A[StringToken]([BeginToken])[SimpleToken] :[SimpleToken] x[StringToken] =[SimpleToken] ([BeginToken]throw[KeywordToken] 3[StringToken]..[SimpleToken]isEven[StringToken])[SimpleToken];[SimpleToken]
+A[StringToken]([BeginToken])[SimpleToken] :[SimpleToken] this[KeywordToken].[SimpleToken]x[StringToken] =[SimpleToken] ([BeginToken]throw[KeywordToken] 4[StringToken]..[SimpleToken]isEven[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+var[KeywordToken] x[StringToken];[SimpleToken]
+A[StringToken]([BeginToken])[SimpleToken] :[SimpleToken] x[StringToken] =[SimpleToken] throw[KeywordToken] 5[StringToken]..[SimpleToken]isEven[StringToken];[SimpleToken]
+A[StringToken]([BeginToken])[SimpleToken] :[SimpleToken] this[KeywordToken].[SimpleToken]x[StringToken] =[SimpleToken] throw[KeywordToken] 6[StringToken]..[SimpleToken]isEven[StringToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]