[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]