Version 2.14.0-279.0.dev

Merge commit 'f56dd3f887a9e2b65ac2ae9df310d4152a044c5c' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
index 6c0d76a..ca6c45c 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
@@ -1265,7 +1265,9 @@
     }
     Token? endGroup = start.endGroup;
     if (endGroup != null) {
-      while (token.next != endGroup && !token.isEof) {
+      while (token.next != endGroup &&
+          !token.isEof &&
+          token.charOffset <= endGroup.charOffset) {
         token = token.next!;
       }
     } else {
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart
new file mode 100644
index 0000000..a7c3e9c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart
@@ -0,0 +1,3 @@
+class A {
+  Stream<List<>>
+}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect
new file mode 100644
index 0000000..b1b8824
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect
@@ -0,0 +1,59 @@
+Problems reported:
+
+parser/error_recovery/issue_46505.crash:2:10: Expected '>' after this.
+  Stream<List<>>
+         ^^^^
+
+parser/error_recovery/issue_46505.crash:2:3: A method declaration needs an explicit list of parameters.
+  Stream<List<>>
+  ^^^^^^
+
+parser/error_recovery/issue_46505.crash:3:2: Expected a function body, but got ''.
+}
+ ^...
+
+WARNING: Reporting at eof --- see below for details.
+
+beginCompilationUnit(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(A, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, A)
+      handleNoType(A)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+        beginMetadataStar(Stream)
+        endMetadataStar(0)
+        beginMember()
+          beginMethod(null, null, null, null, null, Stream)
+            handleNoType({)
+            handleIdentifier(Stream, methodDeclaration)
+            beginTypeVariables(<)
+              beginMetadataStar(List)
+              endMetadataStar(0)
+              handleIdentifier(List, typeVariableDeclaration)
+              beginTypeVariable(List)
+                handleTypeVariablesDefined(List, 1)
+                handleNoType(List)
+              endTypeVariable(<, 0, null, null)
+              handleRecoverableError(Message[ExpectedAfterButGot, Expected '>' after this., null, {string: >}], List, List)
+            endTypeVariables(<, })
+            handleRecoverableError(MissingMethodParameters, Stream, Stream)
+            beginFormalParameters((, MemberKind.NonStaticMethod)
+            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            handleNoInitializers()
+            handleAsyncModifier(null, null)
+            handleRecoverableError(Message[ExpectedFunctionBody, Expected a function body, but got ''., null, {lexeme: }], , )
+            // WARNING: Reporting at eof for .
+            handleInvalidFunctionBody({)
+          endClassMethod(null, Stream, (, null, })
+        endMember()
+      endClassOrMixinBody(DeclarationKind.Class, 1, {, )
+    endClassDeclaration(class, )
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect
new file mode 100644
index 0000000..efcde9a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect
@@ -0,0 +1,90 @@
+parseUnit(class)
+  skipErrorTokens(class)
+  listener: beginCompilationUnit(class)
+  syntheticPreviousToken(class)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(A, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, A)
+        parseClass(A, class, class, A)
+          parseClassHeaderOpt(A, class, class)
+            parseClassExtendsOpt(A)
+              listener: handleNoType(A)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(A)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(A)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, Stream)
+            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+              parseMetadataStar({)
+                listener: beginMetadataStar(Stream)
+                listener: endMetadataStar(0)
+              listener: beginMember()
+              isReservedKeyword(<)
+              parseMethod({, null, null, null, null, null, null, {, Instance of 'NoType', null, Stream, DeclarationKind.Class, A, false)
+                listener: beginMethod(null, null, null, null, null, Stream)
+                listener: handleNoType({)
+                ensureIdentifierPotentiallyRecovered({, methodDeclaration, false)
+                  listener: handleIdentifier(Stream, methodDeclaration)
+                parseQualifiedRestOpt(Stream, methodDeclarationContinuation)
+                parseMethodTypeVar(Stream)
+                  listener: beginTypeVariables(<)
+                  parseMetadataStar(<)
+                    listener: beginMetadataStar(List)
+                    listener: endMetadataStar(0)
+                  ensureIdentifier(<, typeVariableDeclaration)
+                    listener: handleIdentifier(List, typeVariableDeclaration)
+                  listener: beginTypeVariable(List)
+                  listener: handleTypeVariablesDefined(List, 1)
+                  listener: handleNoType(List)
+                  listener: endTypeVariable(<, 0, null, null)
+                  reportRecoverableError(List, Message[ExpectedAfterButGot, Expected '>' after this., null, {string: >}])
+                    listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected '>' after this., null, {string: >}], List, List)
+                  parseMetadataStar(<)
+                  ensureIdentifier(<, typeVariableDeclaration)
+                    reportRecoverableErrorWithToken(>>, Instance of 'Template<(Token) => Message>')
+                    rewriter()
+                  listener: endTypeVariables(<, })
+                parseGetterOrFormalParameters(}, Stream, false, MemberKind.NonStaticMethod)
+                  missingParameterMessage(MemberKind.NonStaticMethod)
+                  reportRecoverableError(Stream, MissingMethodParameters)
+                    listener: handleRecoverableError(MissingMethodParameters, Stream, Stream)
+                  rewriter()
+                  parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                    listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                    listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+                parseInitializersOpt())
+                  listener: handleNoInitializers()
+                parseAsyncModifierOpt())
+                  listener: handleAsyncModifier(null, null)
+                  inPlainSync()
+                inPlainSync()
+                parseFunctionBody(), false, true)
+                  ensureBlock(), Instance of 'Template<(Token) => Message>', null)
+                    reportRecoverableError(, Message[ExpectedFunctionBody, Expected a function body, but got ''., null, {lexeme: }])
+                      listener: handleRecoverableError(Message[ExpectedFunctionBody, Expected a function body, but got ''., null, {lexeme: }], , )
+                      listener: // WARNING: Reporting at eof for .
+                    insertBlock())
+                      rewriter()
+                      rewriter()
+                  listener: handleInvalidFunctionBody({)
+                listener: endClassMethod(null, Stream, (, null, })
+              listener: endMember()
+            notEofOrValue(}, )
+            listener: endClassOrMixinBody(DeclarationKind.Class, 1, {, )
+          listener: endClassDeclaration(class, )
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(class)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.parser.expect
new file mode 100644
index 0000000..bee98c2
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.parser.expect
@@ -0,0 +1,9 @@
+NOTICE: Stream was rewritten by parser!
+
+class A {
+Stream<List<>>
+>}(){}
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+Stream[StringToken]<[BeginToken]List[StringToken]<[BeginToken]>>[SimpleToken]
+[SyntheticStringToken]>[SyntheticToken]}[SimpleToken]([SyntheticBeginToken])[SyntheticToken]{[SyntheticBeginToken]}[SyntheticToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.scanner.expect
new file mode 100644
index 0000000..54d49e5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.scanner.expect
@@ -0,0 +1,7 @@
+class A {
+Stream<List<>>
+}
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+Stream[StringToken]<[BeginToken]List[StringToken]<[BeginToken]>>[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart
new file mode 100644
index 0000000..ce6c799
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart
@@ -0,0 +1,3 @@
+class A {
+  Stream<List<>> x() {}
+}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect
new file mode 100644
index 0000000..553647a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect
@@ -0,0 +1,49 @@
+Problems reported:
+
+parser/error_recovery/issue_46505_prime_1.crash:2:15: Expected a type, but got '>>'.
+  Stream<List<>> x() {}
+              ^^
+
+beginCompilationUnit(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(A, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, A)
+      handleNoType(A)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+        beginMetadataStar(Stream)
+        endMetadataStar(0)
+        beginMember()
+          beginMethod(null, null, null, null, null, x)
+            handleIdentifier(Stream, typeReference)
+            beginTypeArguments(<)
+              handleIdentifier(List, typeReference)
+              beginTypeArguments(<)
+                handleRecoverableError(Message[ExpectedType, Expected a type, but got '>>'., null, {lexeme: >>}], >>, >>)
+                handleIdentifier(, typeReference)
+                handleNoTypeArguments(>>)
+                handleType(, null)
+              endTypeArguments(1, <, >)
+              handleType(List, null)
+            endTypeArguments(1, <, >)
+            handleType(Stream, null)
+            handleIdentifier(x, methodDeclaration)
+            handleNoTypeVariables(()
+            beginFormalParameters((, MemberKind.NonStaticMethod)
+            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            handleNoInitializers()
+            handleAsyncModifier(null, null)
+            beginBlockFunctionBody({)
+            endBlockFunctionBody(0, {, })
+          endClassMethod(null, Stream, (, null, })
+        endMember()
+      endClassOrMixinBody(DeclarationKind.Class, 1, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect
new file mode 100644
index 0000000..4d94337
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect
@@ -0,0 +1,80 @@
+parseUnit(class)
+  skipErrorTokens(class)
+  listener: beginCompilationUnit(class)
+  syntheticPreviousToken(class)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(A, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, A)
+        parseClass(A, class, class, A)
+          parseClassHeaderOpt(A, class, class)
+            parseClassExtendsOpt(A)
+              listener: handleNoType(A)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(A)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(A)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, Stream)
+            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+              parseMetadataStar({)
+                listener: beginMetadataStar(Stream)
+                listener: endMetadataStar(0)
+              listener: beginMember()
+              parseMethod({, null, null, null, null, null, null, {, Instance of 'ComplexTypeInfo', null, x, DeclarationKind.Class, A, false)
+                listener: beginMethod(null, null, null, null, null, x)
+                ensureIdentifier({, typeReference)
+                  listener: handleIdentifier(Stream, typeReference)
+                listener: beginTypeArguments(<)
+                ensureIdentifier(<, typeReference)
+                  listener: handleIdentifier(List, typeReference)
+                listener: beginTypeArguments(<)
+                reportRecoverableErrorWithToken(>>, Instance of 'Template<(Token) => Message>')
+                  listener: handleRecoverableError(Message[ExpectedType, Expected a type, but got '>>'., null, {lexeme: >>}], >>, >>)
+                rewriter()
+                listener: handleIdentifier(, typeReference)
+                listener: handleNoTypeArguments(>>)
+                listener: handleType(, null)
+                listener: endTypeArguments(1, <, >)
+                listener: handleType(List, null)
+                listener: endTypeArguments(1, <, >)
+                listener: handleType(Stream, null)
+                ensureIdentifierPotentiallyRecovered(>, methodDeclaration, false)
+                  listener: handleIdentifier(x, methodDeclaration)
+                parseQualifiedRestOpt(x, methodDeclarationContinuation)
+                parseMethodTypeVar(x)
+                  listener: handleNoTypeVariables(()
+                parseGetterOrFormalParameters(x, x, false, MemberKind.NonStaticMethod)
+                  parseFormalParameters(x, MemberKind.NonStaticMethod)
+                    parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                      listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                      listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+                parseInitializersOpt())
+                  listener: handleNoInitializers()
+                parseAsyncModifierOpt())
+                  listener: handleAsyncModifier(null, null)
+                  inPlainSync()
+                inPlainSync()
+                parseFunctionBody(), false, true)
+                  listener: beginBlockFunctionBody({)
+                  notEofOrValue(}, })
+                  listener: endBlockFunctionBody(0, {, })
+                listener: endClassMethod(null, Stream, (, null, })
+              listener: endMember()
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 1, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(class)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.parser.expect
new file mode 100644
index 0000000..cfe5c55
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.parser.expect
@@ -0,0 +1,9 @@
+NOTICE: Stream was rewritten by parser!
+
+class A {
+Stream<List<>> x() {}
+}
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+Stream[StringToken]<[BeginToken]List[StringToken]<[BeginToken][SyntheticStringToken]>[SimpleToken]>[SimpleToken] x[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.scanner.expect
new file mode 100644
index 0000000..a7c7b88
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.scanner.expect
@@ -0,0 +1,7 @@
+class A {
+Stream<List<>> x() {}
+}
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+Stream[StringToken]<[BeginToken]List[StringToken]<[BeginToken]>>[SimpleToken] x[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart
new file mode 100644
index 0000000..5b1d62d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart
@@ -0,0 +1,3 @@
+class A {
+  Stream<List<Y>> x() {}
+}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect
new file mode 100644
index 0000000..cea3731
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect
@@ -0,0 +1,42 @@
+beginCompilationUnit(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(A, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, A)
+      handleNoType(A)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+        beginMetadataStar(Stream)
+        endMetadataStar(0)
+        beginMember()
+          beginMethod(null, null, null, null, null, x)
+            handleIdentifier(Stream, typeReference)
+            beginTypeArguments(<)
+              handleIdentifier(List, typeReference)
+              beginTypeArguments(<)
+                handleIdentifier(Y, typeReference)
+                handleNoTypeArguments(>)
+                handleType(Y, null)
+              endTypeArguments(1, <, >)
+              handleType(List, null)
+            endTypeArguments(1, <, >)
+            handleType(Stream, null)
+            handleIdentifier(x, methodDeclaration)
+            handleNoTypeVariables(()
+            beginFormalParameters((, MemberKind.NonStaticMethod)
+            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            handleNoInitializers()
+            handleAsyncModifier(null, null)
+            beginBlockFunctionBody({)
+            endBlockFunctionBody(0, {, })
+          endClassMethod(null, Stream, (, null, })
+        endMember()
+      endClassOrMixinBody(DeclarationKind.Class, 1, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect
new file mode 100644
index 0000000..c7c22cb
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect
@@ -0,0 +1,76 @@
+parseUnit(class)
+  skipErrorTokens(class)
+  listener: beginCompilationUnit(class)
+  syntheticPreviousToken(class)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(A, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, A)
+        parseClass(A, class, class, A)
+          parseClassHeaderOpt(A, class, class)
+            parseClassExtendsOpt(A)
+              listener: handleNoType(A)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(A)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(A)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, Stream)
+            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+              parseMetadataStar({)
+                listener: beginMetadataStar(Stream)
+                listener: endMetadataStar(0)
+              listener: beginMember()
+              parseMethod({, null, null, null, null, null, null, {, Instance of 'ComplexTypeInfo', null, x, DeclarationKind.Class, A, false)
+                listener: beginMethod(null, null, null, null, null, x)
+                ensureIdentifier({, typeReference)
+                  listener: handleIdentifier(Stream, typeReference)
+                listener: beginTypeArguments(<)
+                listener: handleIdentifier(List, typeReference)
+                listener: beginTypeArguments(<)
+                listener: handleIdentifier(Y, typeReference)
+                listener: handleNoTypeArguments(>)
+                listener: handleType(Y, null)
+                listener: endTypeArguments(1, <, >)
+                listener: handleType(List, null)
+                listener: endTypeArguments(1, <, >)
+                listener: handleType(Stream, null)
+                ensureIdentifierPotentiallyRecovered(>, methodDeclaration, false)
+                  listener: handleIdentifier(x, methodDeclaration)
+                parseQualifiedRestOpt(x, methodDeclarationContinuation)
+                parseMethodTypeVar(x)
+                  listener: handleNoTypeVariables(()
+                parseGetterOrFormalParameters(x, x, false, MemberKind.NonStaticMethod)
+                  parseFormalParameters(x, MemberKind.NonStaticMethod)
+                    parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                      listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                      listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+                parseInitializersOpt())
+                  listener: handleNoInitializers()
+                parseAsyncModifierOpt())
+                  listener: handleAsyncModifier(null, null)
+                  inPlainSync()
+                inPlainSync()
+                parseFunctionBody(), false, true)
+                  listener: beginBlockFunctionBody({)
+                  notEofOrValue(}, })
+                  listener: endBlockFunctionBody(0, {, })
+                listener: endClassMethod(null, Stream, (, null, })
+              listener: endMember()
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 1, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(class)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.parser.expect
new file mode 100644
index 0000000..cd7b53f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.parser.expect
@@ -0,0 +1,9 @@
+NOTICE: Stream was rewritten by parser!
+
+class A {
+Stream<List<Y>> x() {}
+}
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+Stream[StringToken]<[BeginToken]List[StringToken]<[BeginToken]Y[StringToken]>[SimpleToken]>[SimpleToken] x[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.scanner.expect
new file mode 100644
index 0000000..3f8f570
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.scanner.expect
@@ -0,0 +1,7 @@
+class A {
+Stream<List<Y>> x() {}
+}
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+Stream[StringToken]<[BeginToken]List[StringToken]<[BeginToken]Y[StringToken]>>[SimpleToken] x[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/tools/VERSION b/tools/VERSION
index 5edc9e6..ced4701 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 278
+PRERELEASE 279
 PRERELEASE_PATCH 0
\ No newline at end of file