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