Version 2.14.0-282.0.dev

Merge commit '56df34c8a08bddd7db52f3da2996e9aa11a39efa' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
index b2359965..432176b 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
@@ -1145,6 +1145,8 @@
     const List<String> followingValues = const [
       '<',
       '>',
+      '>>',
+      '>>>',
       ';',
       '}',
       'extends',
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
index b1b8824..c0b7186 100644
--- 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
@@ -8,11 +8,9 @@
   Stream<List<>>
   ^^^^^^
 
-parser/error_recovery/issue_46505.crash:3:2: Expected a function body, but got ''.
+parser/error_recovery/issue_46505.crash:3:1: Expected a function body, but got '}'.
 }
- ^...
-
-WARNING: Reporting at eof --- see below for details.
+^
 
 beginCompilationUnit(class)
   beginMetadataStar(class)
@@ -42,18 +40,17 @@
                 handleNoType(List)
               endTypeVariable(<, 0, null, null)
               handleRecoverableError(Message[ExpectedAfterButGot, Expected '>' after this., null, {string: >}], List, List)
-            endTypeVariables(<, })
+            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 .
+            handleRecoverableError(Message[ExpectedFunctionBody, Expected a function body, but got '}'., null, {lexeme: }}], }, })
             handleInvalidFunctionBody({)
           endClassMethod(null, Stream, (, null, })
         endMember()
-      endClassOrMixinBody(DeclarationKind.Class, 1, {, )
-    endClassDeclaration(class, )
+      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
index efcde9a..c4e4b6a 100644
--- 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
@@ -56,8 +56,8 @@
                   ensureIdentifier(<, typeVariableDeclaration)
                     reportRecoverableErrorWithToken(>>, Instance of 'Template<(Token) => Message>')
                     rewriter()
-                  listener: endTypeVariables(<, })
-                parseGetterOrFormalParameters(}, Stream, false, MemberKind.NonStaticMethod)
+                  listener: endTypeVariables(<, >)
+                parseGetterOrFormalParameters(>, Stream, false, MemberKind.NonStaticMethod)
                   missingParameterMessage(MemberKind.NonStaticMethod)
                   reportRecoverableError(Stream, MissingMethodParameters)
                     listener: handleRecoverableError(MissingMethodParameters, Stream, Stream)
@@ -73,18 +73,17 @@
                 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 .
+                    reportRecoverableError(}, Message[ExpectedFunctionBody, Expected a function body, but got '}'., null, {lexeme: }}])
+                      listener: handleRecoverableError(Message[ExpectedFunctionBody, Expected a function body, but got '}'., null, {lexeme: }}], }, })
                     insertBlock())
                       rewriter()
                       rewriter()
                   listener: handleInvalidFunctionBody({)
                 listener: endClassMethod(null, Stream, (, null, })
               listener: endMember()
-            notEofOrValue(}, )
-            listener: endClassOrMixinBody(DeclarationKind.Class, 1, {, )
-          listener: endClassDeclaration(class, )
+            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
index bee98c2..5329c0d 100644
--- 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
@@ -2,8 +2,8 @@
 
 class A {
 Stream<List<>>
->}(){}
+(){}}
 
 class[KeywordToken] A[StringToken] {[BeginToken]
-Stream[StringToken]<[BeginToken]List[StringToken]<[BeginToken]>>[SimpleToken]
-[SyntheticStringToken]>[SyntheticToken]}[SimpleToken]([SyntheticBeginToken])[SyntheticToken]{[SyntheticBeginToken]}[SyntheticToken][SimpleToken]
+Stream[StringToken]<[BeginToken]List[StringToken]<[BeginToken][SyntheticStringToken]>[SimpleToken]>[SimpleToken]
+([SyntheticBeginToken])[SyntheticToken]{[SyntheticBeginToken]}[SyntheticToken]}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart
new file mode 100644
index 0000000..f133e9a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart
@@ -0,0 +1,3 @@
+class A {
+  Stream<List<Set<>>>
+}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect
new file mode 100644
index 0000000..27d5686
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect
@@ -0,0 +1,56 @@
+Problems reported:
+
+parser/error_recovery/issue_46505_prime_3.crash:2:10: Expected '>' after this.
+  Stream<List<Set<>>>
+         ^^^^
+
+parser/error_recovery/issue_46505_prime_3.crash:2:3: A method declaration needs an explicit list of parameters.
+  Stream<List<Set<>>>
+  ^^^^^^
+
+parser/error_recovery/issue_46505_prime_3.crash:3:1: Expected a function body, but got '}'.
+}
+^
+
+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: }}], }, })
+            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_prime_3.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.intertwined.expect
new file mode 100644
index 0000000..147afbd
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.intertwined.expect
@@ -0,0 +1,91 @@
+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 '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)
+                  reportRecoverableError(Set, Message[ExpectedAfterButGot, Expected '>' after this., null, {string: >}])
+                  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: }}], }, })
+                    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_prime_3.crash_dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.parser.expect
new file mode 100644
index 0000000..b3d50a3
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.parser.expect
@@ -0,0 +1,9 @@
+NOTICE: Stream was rewritten by parser!
+
+class A {
+Stream<List<Set<>>>
+(){}}
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+Stream[StringToken]<[BeginToken]List[StringToken]<[BeginToken]Set[StringToken]<[BeginToken][SyntheticStringToken]>[SimpleToken]>[SimpleToken]>[SimpleToken]
+([SyntheticBeginToken])[SyntheticToken]{[SyntheticBeginToken]}[SyntheticToken]}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.scanner.expect
new file mode 100644
index 0000000..9063344
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.scanner.expect
@@ -0,0 +1,7 @@
+class A {
+Stream<List<Set<>>>
+}
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+Stream[StringToken]<[BeginToken]List[StringToken]<[BeginToken]Set[StringToken]<[BeginToken]>>>[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart
new file mode 100644
index 0000000..8c3da15
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart
@@ -0,0 +1,3 @@
+class A {
+  Stream<List<Set<List<>>>>
+}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect
new file mode 100644
index 0000000..1043bd8
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect
@@ -0,0 +1,56 @@
+Problems reported:
+
+parser/error_recovery/issue_46505_prime_4.crash:2:10: Expected '>' after this.
+  Stream<List<Set<List<>>>>
+         ^^^^
+
+parser/error_recovery/issue_46505_prime_4.crash:2:3: A method declaration needs an explicit list of parameters.
+  Stream<List<Set<List<>>>>
+  ^^^^^^
+
+parser/error_recovery/issue_46505_prime_4.crash:3:1: Expected a function body, but got '}'.
+}
+^
+
+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: }}], }, })
+            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_prime_4.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.intertwined.expect
new file mode 100644
index 0000000..50f23d1
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.intertwined.expect
@@ -0,0 +1,94 @@
+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 '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)
+                  reportRecoverableError(Set, Message[ExpectedAfterButGot, Expected '>' after this., null, {string: >}])
+                  parseMetadataStar(<)
+                  ensureIdentifier(<, typeVariableDeclaration)
+                  reportRecoverableError(List, Message[ExpectedAfterButGot, Expected '>' after this., null, {string: >}])
+                  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: }}], }, })
+                    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_prime_4.crash_dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.parser.expect
new file mode 100644
index 0000000..a2b4071
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.parser.expect
@@ -0,0 +1,9 @@
+NOTICE: Stream was rewritten by parser!
+
+class A {
+Stream<List<Set<List<>>>>
+(){}}
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+Stream[StringToken]<[BeginToken]List[StringToken]<[BeginToken]Set[StringToken]<[BeginToken]List[StringToken]<[BeginToken][SyntheticStringToken]>[SimpleToken]>[SimpleToken]>[SimpleToken]>[SimpleToken]
+([SyntheticBeginToken])[SyntheticToken]{[SyntheticBeginToken]}[SyntheticToken]}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.scanner.expect
new file mode 100644
index 0000000..f10b949
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.scanner.expect
@@ -0,0 +1,7 @@
+class A {
+Stream<List<Set<List<>>>>
+}
+
+class[KeywordToken] A[StringToken] {[BeginToken]
+Stream[StringToken]<[BeginToken]List[StringToken]<[BeginToken]Set[StringToken]<[BeginToken]List[StringToken]<[BeginToken]>>>[SimpleToken]>[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/tools/VERSION b/tools/VERSION
index b582d9b..d92be24 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 281
+PRERELEASE 282
 PRERELEASE_PATCH 0
\ No newline at end of file