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