[parser] Don't use potential type arguments if they came via recovery
A few places in the parser we call `computeTypeParamOrArg` and then
either use the result or not depending on whether there's a `(` after
it. That doesn't work well when `computeTypeParamOrArg` does recovery
by for instance inserting a > though.
This CL fixes that - at least in the places we know about.
Fixes #45848.
Change-Id: Id4b62b965131031f43c8ada0fe05045fc9834db3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/197360
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index 93d7a7b..ba63e91 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -6146,7 +6146,7 @@
potentialTypeArg ??= computeTypeParamOrArg(token);
afterToken ??= potentialTypeArg.skip(token).next!;
TypeParamOrArgInfo typeArg;
- if (optional('(', afterToken)) {
+ if (optional('(', afterToken) && !potentialTypeArg.recovered) {
typeArg = potentialTypeArg;
} else {
typeArg = noTypeParamOrArg;
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart b/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart
index 6f10b8a..ecacdd9 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/type_info.dart
@@ -78,6 +78,8 @@
/// Return the number of type arguments
int get typeArgumentCount;
+ bool get recovered => false;
+
/// Return the simple type associated with this simple type argument
/// or throw an exception if this is not a simple type argument.
TypeInfo get typeInfo {
@@ -346,5 +348,7 @@
/// possible other constructs will pass (e.g., 'a < C, D > 3').
TypeParamOrArgInfo computeMethodTypeArguments(Token token) {
TypeParamOrArgInfo typeArg = computeTypeParamOrArg(token);
- return optional('(', typeArg.skip(token).next!) ? typeArg : noTypeParamOrArg;
+ return optional('(', typeArg.skip(token).next!) && !typeArg.recovered
+ ? typeArg
+ : noTypeParamOrArg;
}
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 edd0af2..6c0d76a 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
@@ -923,6 +923,9 @@
/// and may not be part of the token stream.
Token? skipEnd;
+ @override
+ bool recovered = false;
+
ComplexTypeParamOrArgInfo(
Token token, this.inDeclaration, this.allowsVariance)
: assert(optional('<', token.next!)),
@@ -988,6 +991,7 @@
// Recovery
skipEnd = splitCloser(next);
if (skipEnd == null) {
+ recovered = true;
if (optional('(', next)) {
token = next.endGroup!;
next = token.next!;
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01.dart b/pkg/front_end/parser_testcases/general/issue_45848_01.dart
new file mode 100644
index 0000000..5f0897a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01.dart
@@ -0,0 +1,11 @@
+void f(bool b, int i) {
+ print('b=$b, i=$i');
+}
+
+g(int x, int y, Object o) {
+ f(x < y, (o as Function)());
+}
+
+main() {
+ g(0, 1, () => 2);
+}
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect
new file mode 100644
index 0000000..9020ccd
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect
@@ -0,0 +1,156 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(f, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(bool)
+ endMetadataStar(0)
+ beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(bool, typeReference)
+ handleNoTypeArguments(b)
+ handleType(bool, null)
+ handleIdentifier(b, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(i)
+ handleType(int, null)
+ handleIdentifier(i, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(print, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ beginLiteralString('b=)
+ handleIdentifier(b, expression)
+ handleNoTypeArguments(, i=)
+ handleNoArguments(, i=)
+ handleSend(b, , i=)
+ handleInterpolationExpression($, null)
+ handleStringPart(, i=)
+ handleIdentifier(i, expression)
+ handleNoTypeArguments(')
+ handleNoArguments(')
+ handleSend(i, ')
+ handleInterpolationExpression($, null)
+ handleStringPart(')
+ endLiteralString(2, ))
+ endArguments(1, (, ))
+ handleSend(print, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration(g)
+ beginMetadataStar(g)
+ endMetadataStar(0)
+ beginTopLevelMember(g)
+ beginTopLevelMethod(}, null)
+ handleNoType(})
+ handleIdentifier(g, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(x)
+ handleType(int, null)
+ handleIdentifier(x, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(y)
+ handleType(int, null)
+ handleIdentifier(y, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(Object)
+ endMetadataStar(0)
+ beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(Object, typeReference)
+ handleNoTypeArguments(o)
+ handleType(Object, null)
+ handleIdentifier(o, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(f, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ handleIdentifier(x, expression)
+ handleNoTypeArguments(<)
+ handleNoArguments(<)
+ handleSend(x, <)
+ beginBinaryExpression(<)
+ handleIdentifier(y, expression)
+ handleNoTypeArguments(,)
+ handleNoArguments(,)
+ handleSend(y, ,)
+ endBinaryExpression(<)
+ handleIdentifier(o, expression)
+ handleNoTypeArguments(as)
+ handleNoArguments(as)
+ handleSend(o, as)
+ beginAsOperatorType(as)
+ handleIdentifier(Function, typeReference)
+ handleNoTypeArguments())
+ handleType(Function, null)
+ endAsOperatorType(as)
+ handleAsOperator(as)
+ handleParenthesizedExpression(()
+ handleNoTypeArguments(()
+ beginArguments(()
+ endArguments(0, (, ))
+ handleSend((, ))
+ endArguments(2, (, ))
+ handleSend(f, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(g, null, })
+ endTopLevelDeclaration(main)
+ beginMetadataStar(main)
+ endMetadataStar(0)
+ beginTopLevelMember(main)
+ beginTopLevelMethod(}, null)
+ handleNoType(})
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(g, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ handleLiteralInt(0)
+ handleLiteralInt(1)
+ handleNoTypeVariables(()
+ beginFunctionExpression(()
+ beginFormalParameters((, MemberKind.Local)
+ endFormalParameters(0, (, ), MemberKind.Local)
+ handleAsyncModifier(null, null)
+ handleLiteralInt(2)
+ handleExpressionFunctionBody(=>, null)
+ endFunctionExpression((, ))
+ endArguments(3, (, ))
+ handleSend(g, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(main, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect
new file mode 100644
index 0000000..763288e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect
@@ -0,0 +1,354 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, f, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(bool)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(bool, typeReference)
+ listener: handleNoTypeArguments(b)
+ listener: handleType(bool, null)
+ ensureIdentifier(bool, formalParameterDeclaration)
+ listener: handleIdentifier(b, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(i)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(i, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, print)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(print)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(print, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(print)
+ parseArguments(print)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseLiteralString(()
+ parseSingleLiteralString(()
+ listener: beginLiteralString('b=)
+ parseIdentifierExpression($)
+ parseSend($, expression)
+ ensureIdentifier($, expression)
+ listener: handleIdentifier(b, expression)
+ listener: handleNoTypeArguments(, i=)
+ parseArgumentsOpt(b)
+ listener: handleNoArguments(, i=)
+ listener: handleSend(b, , i=)
+ listener: handleInterpolationExpression($, null)
+ parseStringPart(b)
+ listener: handleStringPart(, i=)
+ parseIdentifierExpression($)
+ parseSend($, expression)
+ ensureIdentifier($, expression)
+ listener: handleIdentifier(i, expression)
+ listener: handleNoTypeArguments(')
+ parseArgumentsOpt(i)
+ listener: handleNoArguments(')
+ listener: handleSend(i, ')
+ listener: handleInterpolationExpression($, null)
+ parseStringPart(i)
+ listener: handleStringPart(')
+ listener: endLiteralString(2, ))
+ listener: endArguments(1, (, ))
+ listener: handleSend(print, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration(g)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(g)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(g)
+ isReservedKeyword(()
+ parseTopLevelMethod(}, null, }, Instance of 'NoType', null, g, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleNoType(})
+ ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(g, topLevelFunctionDeclaration)
+ parseMethodTypeVar(g)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(g, g, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(g, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(x)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(x, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(y)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(y, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(Object)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(Object, typeReference)
+ listener: handleNoTypeArguments(o)
+ listener: handleType(Object, null)
+ ensureIdentifier(Object, formalParameterDeclaration)
+ listener: handleIdentifier(o, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, f)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(f)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(f, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(f)
+ parseArguments(f)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ looksLikeFunctionBody())
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(x, expression)
+ listener: handleNoTypeArguments(<)
+ parseArgumentsOpt(x)
+ listener: handleNoArguments(<)
+ listener: handleSend(x, <)
+ listener: beginBinaryExpression(<)
+ parsePrecedenceExpression(<, 9, true)
+ parseUnaryExpression(<, true)
+ parsePrimary(<, expression)
+ parseSendOrFunctionLiteral(<, expression)
+ parseSend(<, expression)
+ ensureIdentifier(<, expression)
+ listener: handleIdentifier(y, expression)
+ listener: handleNoTypeArguments(,)
+ parseArgumentsOpt(y)
+ listener: handleNoArguments(,)
+ listener: handleSend(y, ,)
+ listener: endBinaryExpression(<)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(,)
+ parseParenthesizedExpression(,)
+ parseExpressionInParenthesis(,)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(o, expression)
+ listener: handleNoTypeArguments(as)
+ parseArgumentsOpt(o)
+ listener: handleNoArguments(as)
+ listener: handleSend(o, as)
+ parseAsOperatorRest(o)
+ listener: beginAsOperatorType(as)
+ computeTypeAfterIsOrAs(as)
+ listener: handleIdentifier(Function, typeReference)
+ listener: handleNoTypeArguments())
+ listener: handleType(Function, null)
+ listener: endAsOperatorType(as)
+ listener: handleAsOperator(as)
+ skipChainedAsIsOperators(Function)
+ ensureCloseParen(Function, ()
+ listener: handleParenthesizedExpression(()
+ parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
+ listener: handleNoTypeArguments(()
+ parseArguments())
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ listener: endArguments(0, (, ))
+ listener: handleSend((, ))
+ listener: endArguments(2, (, ))
+ listener: handleSend(f, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(g, null, })
+ listener: endTopLevelDeclaration(main)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(main)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(main)
+ isReservedKeyword(()
+ parseTopLevelMethod(}, null, }, Instance of 'NoType', null, main, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleNoType(})
+ ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, g)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(g)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(g, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(g)
+ parseArguments(g)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseLiteralInt(()
+ listener: handleLiteralInt(0)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseLiteralInt(,)
+ listener: handleLiteralInt(1)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(,)
+ listener: handleNoTypeVariables(()
+ parseFunctionExpression(,)
+ listener: beginFunctionExpression(()
+ parseFormalParametersRequiredOpt(,, MemberKind.Local)
+ parseFormalParametersRest((, MemberKind.Local)
+ listener: beginFormalParameters((, MemberKind.Local)
+ listener: endFormalParameters(0, (, ), MemberKind.Local)
+ parseAsyncOptBody(), true, false)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), true, false)
+ parseExpressionFunctionBody(=>, true)
+ parseExpression(=>)
+ parsePrecedenceExpression(=>, 1, true)
+ parseUnaryExpression(=>, true)
+ parsePrimary(=>, expression)
+ parseLiteralInt(=>)
+ listener: handleLiteralInt(2)
+ listener: handleExpressionFunctionBody(=>, null)
+ inGenerator()
+ listener: endFunctionExpression((, ))
+ listener: endArguments(3, (, ))
+ listener: handleSend(g, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(main, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.parser.expect b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.parser.expect
new file mode 100644
index 0000000..856dbc5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.parser.expect
@@ -0,0 +1,25 @@
+void f(bool b, int i) {
+print('b=$b, i=$i');
+}
+
+g(int x, int y, Object o) {
+f(x < y, (o as Function)());
+}
+
+main() {
+g(0, 1, () => 2);
+}
+
+
+void[KeywordToken] f[StringToken]([BeginToken]bool[StringToken] b[StringToken],[SimpleToken] int[StringToken] i[StringToken])[SimpleToken] {[BeginToken]
+print[StringToken]([BeginToken]'b=[StringToken]$[SimpleToken]b[StringToken], i=[StringToken]$[SimpleToken]i[StringToken]'[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+g[StringToken]([BeginToken]int[StringToken] x[StringToken],[SimpleToken] int[StringToken] y[StringToken],[SimpleToken] Object[StringToken] o[StringToken])[SimpleToken] {[BeginToken]
+f[StringToken]([BeginToken]x[StringToken] <[BeginToken] y[StringToken],[SimpleToken] ([BeginToken]o[StringToken] as[KeywordToken] Function[KeywordToken])[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+g[StringToken]([BeginToken]0[StringToken],[SimpleToken] 1[StringToken],[SimpleToken] ([BeginToken])[SimpleToken] =>[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.scanner.expect b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.scanner.expect
new file mode 100644
index 0000000..856dbc5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.scanner.expect
@@ -0,0 +1,25 @@
+void f(bool b, int i) {
+print('b=$b, i=$i');
+}
+
+g(int x, int y, Object o) {
+f(x < y, (o as Function)());
+}
+
+main() {
+g(0, 1, () => 2);
+}
+
+
+void[KeywordToken] f[StringToken]([BeginToken]bool[StringToken] b[StringToken],[SimpleToken] int[StringToken] i[StringToken])[SimpleToken] {[BeginToken]
+print[StringToken]([BeginToken]'b=[StringToken]$[SimpleToken]b[StringToken], i=[StringToken]$[SimpleToken]i[StringToken]'[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+g[StringToken]([BeginToken]int[StringToken] x[StringToken],[SimpleToken] int[StringToken] y[StringToken],[SimpleToken] Object[StringToken] o[StringToken])[SimpleToken] {[BeginToken]
+f[StringToken]([BeginToken]x[StringToken] <[BeginToken] y[StringToken],[SimpleToken] ([BeginToken]o[StringToken] as[KeywordToken] Function[KeywordToken])[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+g[StringToken]([BeginToken]0[StringToken],[SimpleToken] 1[StringToken],[SimpleToken] ([BeginToken])[SimpleToken] =>[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart
new file mode 100644
index 0000000..b19742b
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart
@@ -0,0 +1,11 @@
+void f(bool b, int i) {
+ print('b=$b, i=$i');
+}
+
+g(int x, int y, Object o) {
+ f((x < y), (o as Function)());
+}
+
+main() {
+ g(0, 1, () => 2);
+}
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect
new file mode 100644
index 0000000..53f02db
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect
@@ -0,0 +1,157 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(f, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(bool)
+ endMetadataStar(0)
+ beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(bool, typeReference)
+ handleNoTypeArguments(b)
+ handleType(bool, null)
+ handleIdentifier(b, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(i)
+ handleType(int, null)
+ handleIdentifier(i, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(print, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ beginLiteralString('b=)
+ handleIdentifier(b, expression)
+ handleNoTypeArguments(, i=)
+ handleNoArguments(, i=)
+ handleSend(b, , i=)
+ handleInterpolationExpression($, null)
+ handleStringPart(, i=)
+ handleIdentifier(i, expression)
+ handleNoTypeArguments(')
+ handleNoArguments(')
+ handleSend(i, ')
+ handleInterpolationExpression($, null)
+ handleStringPart(')
+ endLiteralString(2, ))
+ endArguments(1, (, ))
+ handleSend(print, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration(g)
+ beginMetadataStar(g)
+ endMetadataStar(0)
+ beginTopLevelMember(g)
+ beginTopLevelMethod(}, null)
+ handleNoType(})
+ handleIdentifier(g, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(x)
+ handleType(int, null)
+ handleIdentifier(x, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(y)
+ handleType(int, null)
+ handleIdentifier(y, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(Object)
+ endMetadataStar(0)
+ beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(Object, typeReference)
+ handleNoTypeArguments(o)
+ handleType(Object, null)
+ handleIdentifier(o, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(f, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ handleIdentifier(x, expression)
+ handleNoTypeArguments(<)
+ handleNoArguments(<)
+ handleSend(x, <)
+ beginBinaryExpression(<)
+ handleIdentifier(y, expression)
+ handleNoTypeArguments())
+ handleNoArguments())
+ handleSend(y, ))
+ endBinaryExpression(<)
+ handleParenthesizedExpression(()
+ handleIdentifier(o, expression)
+ handleNoTypeArguments(as)
+ handleNoArguments(as)
+ handleSend(o, as)
+ beginAsOperatorType(as)
+ handleIdentifier(Function, typeReference)
+ handleNoTypeArguments())
+ handleType(Function, null)
+ endAsOperatorType(as)
+ handleAsOperator(as)
+ handleParenthesizedExpression(()
+ handleNoTypeArguments(()
+ beginArguments(()
+ endArguments(0, (, ))
+ handleSend((, ))
+ endArguments(2, (, ))
+ handleSend(f, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(g, null, })
+ endTopLevelDeclaration(main)
+ beginMetadataStar(main)
+ endMetadataStar(0)
+ beginTopLevelMember(main)
+ beginTopLevelMethod(}, null)
+ handleNoType(})
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(g, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ handleLiteralInt(0)
+ handleLiteralInt(1)
+ handleNoTypeVariables(()
+ beginFunctionExpression(()
+ beginFormalParameters((, MemberKind.Local)
+ endFormalParameters(0, (, ), MemberKind.Local)
+ handleAsyncModifier(null, null)
+ handleLiteralInt(2)
+ handleExpressionFunctionBody(=>, null)
+ endFunctionExpression((, ))
+ endArguments(3, (, ))
+ handleSend(g, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(main, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect
new file mode 100644
index 0000000..b59bb49
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect
@@ -0,0 +1,363 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, f, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(bool)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(bool, typeReference)
+ listener: handleNoTypeArguments(b)
+ listener: handleType(bool, null)
+ ensureIdentifier(bool, formalParameterDeclaration)
+ listener: handleIdentifier(b, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(i)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(i, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, print)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(print)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(print, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(print)
+ parseArguments(print)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseLiteralString(()
+ parseSingleLiteralString(()
+ listener: beginLiteralString('b=)
+ parseIdentifierExpression($)
+ parseSend($, expression)
+ ensureIdentifier($, expression)
+ listener: handleIdentifier(b, expression)
+ listener: handleNoTypeArguments(, i=)
+ parseArgumentsOpt(b)
+ listener: handleNoArguments(, i=)
+ listener: handleSend(b, , i=)
+ listener: handleInterpolationExpression($, null)
+ parseStringPart(b)
+ listener: handleStringPart(, i=)
+ parseIdentifierExpression($)
+ parseSend($, expression)
+ ensureIdentifier($, expression)
+ listener: handleIdentifier(i, expression)
+ listener: handleNoTypeArguments(')
+ parseArgumentsOpt(i)
+ listener: handleNoArguments(')
+ listener: handleSend(i, ')
+ listener: handleInterpolationExpression($, null)
+ parseStringPart(i)
+ listener: handleStringPart(')
+ listener: endLiteralString(2, ))
+ listener: endArguments(1, (, ))
+ listener: handleSend(print, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration(g)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(g)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(g)
+ isReservedKeyword(()
+ parseTopLevelMethod(}, null, }, Instance of 'NoType', null, g, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleNoType(})
+ ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(g, topLevelFunctionDeclaration)
+ parseMethodTypeVar(g)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(g, g, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(g, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(x)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(x, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(y)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(y, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(Object)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(Object, typeReference)
+ listener: handleNoTypeArguments(o)
+ listener: handleType(Object, null)
+ ensureIdentifier(Object, formalParameterDeclaration)
+ listener: handleIdentifier(o, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, f)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(f)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(f, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(f)
+ parseArguments(f)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(()
+ parseParenthesizedExpression(()
+ parseExpressionInParenthesis(()
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(x, expression)
+ listener: handleNoTypeArguments(<)
+ parseArgumentsOpt(x)
+ listener: handleNoArguments(<)
+ listener: handleSend(x, <)
+ listener: beginBinaryExpression(<)
+ parsePrecedenceExpression(<, 9, true)
+ parseUnaryExpression(<, true)
+ parsePrimary(<, expression)
+ parseSendOrFunctionLiteral(<, expression)
+ parseSend(<, expression)
+ ensureIdentifier(<, expression)
+ listener: handleIdentifier(y, expression)
+ listener: handleNoTypeArguments())
+ parseArgumentsOpt(y)
+ listener: handleNoArguments())
+ listener: handleSend(y, ))
+ listener: endBinaryExpression(<)
+ ensureCloseParen(y, ()
+ listener: handleParenthesizedExpression(()
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(,)
+ parseParenthesizedExpression(,)
+ parseExpressionInParenthesis(,)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(o, expression)
+ listener: handleNoTypeArguments(as)
+ parseArgumentsOpt(o)
+ listener: handleNoArguments(as)
+ listener: handleSend(o, as)
+ parseAsOperatorRest(o)
+ listener: beginAsOperatorType(as)
+ computeTypeAfterIsOrAs(as)
+ listener: handleIdentifier(Function, typeReference)
+ listener: handleNoTypeArguments())
+ listener: handleType(Function, null)
+ listener: endAsOperatorType(as)
+ listener: handleAsOperator(as)
+ skipChainedAsIsOperators(Function)
+ ensureCloseParen(Function, ()
+ listener: handleParenthesizedExpression(()
+ parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg', false)
+ listener: handleNoTypeArguments(()
+ parseArguments())
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ listener: endArguments(0, (, ))
+ listener: handleSend((, ))
+ listener: endArguments(2, (, ))
+ listener: handleSend(f, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(g, null, })
+ listener: endTopLevelDeclaration(main)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(main)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(main)
+ isReservedKeyword(()
+ parseTopLevelMethod(}, null, }, Instance of 'NoType', null, main, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleNoType(})
+ ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, g)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(g)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(g, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(g)
+ parseArguments(g)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseLiteralInt(()
+ listener: handleLiteralInt(0)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseLiteralInt(,)
+ listener: handleLiteralInt(1)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(,)
+ listener: handleNoTypeVariables(()
+ parseFunctionExpression(,)
+ listener: beginFunctionExpression(()
+ parseFormalParametersRequiredOpt(,, MemberKind.Local)
+ parseFormalParametersRest((, MemberKind.Local)
+ listener: beginFormalParameters((, MemberKind.Local)
+ listener: endFormalParameters(0, (, ), MemberKind.Local)
+ parseAsyncOptBody(), true, false)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), true, false)
+ parseExpressionFunctionBody(=>, true)
+ parseExpression(=>)
+ parsePrecedenceExpression(=>, 1, true)
+ parseUnaryExpression(=>, true)
+ parsePrimary(=>, expression)
+ parseLiteralInt(=>)
+ listener: handleLiteralInt(2)
+ listener: handleExpressionFunctionBody(=>, null)
+ inGenerator()
+ listener: endFunctionExpression((, ))
+ listener: endArguments(3, (, ))
+ listener: handleSend(g, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(main, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.parser.expect b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.parser.expect
new file mode 100644
index 0000000..e21e7ef
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.parser.expect
@@ -0,0 +1,25 @@
+void f(bool b, int i) {
+print('b=$b, i=$i');
+}
+
+g(int x, int y, Object o) {
+f((x < y), (o as Function)());
+}
+
+main() {
+g(0, 1, () => 2);
+}
+
+
+void[KeywordToken] f[StringToken]([BeginToken]bool[StringToken] b[StringToken],[SimpleToken] int[StringToken] i[StringToken])[SimpleToken] {[BeginToken]
+print[StringToken]([BeginToken]'b=[StringToken]$[SimpleToken]b[StringToken], i=[StringToken]$[SimpleToken]i[StringToken]'[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+g[StringToken]([BeginToken]int[StringToken] x[StringToken],[SimpleToken] int[StringToken] y[StringToken],[SimpleToken] Object[StringToken] o[StringToken])[SimpleToken] {[BeginToken]
+f[StringToken]([BeginToken]([BeginToken]x[StringToken] <[BeginToken] y[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]o[StringToken] as[KeywordToken] Function[KeywordToken])[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+g[StringToken]([BeginToken]0[StringToken],[SimpleToken] 1[StringToken],[SimpleToken] ([BeginToken])[SimpleToken] =>[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.scanner.expect
new file mode 100644
index 0000000..e21e7ef
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.scanner.expect
@@ -0,0 +1,25 @@
+void f(bool b, int i) {
+print('b=$b, i=$i');
+}
+
+g(int x, int y, Object o) {
+f((x < y), (o as Function)());
+}
+
+main() {
+g(0, 1, () => 2);
+}
+
+
+void[KeywordToken] f[StringToken]([BeginToken]bool[StringToken] b[StringToken],[SimpleToken] int[StringToken] i[StringToken])[SimpleToken] {[BeginToken]
+print[StringToken]([BeginToken]'b=[StringToken]$[SimpleToken]b[StringToken], i=[StringToken]$[SimpleToken]i[StringToken]'[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+g[StringToken]([BeginToken]int[StringToken] x[StringToken],[SimpleToken] int[StringToken] y[StringToken],[SimpleToken] Object[StringToken] o[StringToken])[SimpleToken] {[BeginToken]
+f[StringToken]([BeginToken]([BeginToken]x[StringToken] <[BeginToken] y[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]o[StringToken] as[KeywordToken] Function[KeywordToken])[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+g[StringToken]([BeginToken]0[StringToken],[SimpleToken] 1[StringToken],[SimpleToken] ([BeginToken])[SimpleToken] =>[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02.dart b/pkg/front_end/parser_testcases/general/issue_45848_02.dart
new file mode 100644
index 0000000..00ff9cf
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02.dart
@@ -0,0 +1,11 @@
+void f(bool b1, bool b2) {
+ print('b1=$b1, b2=$b2');
+}
+
+g(int x, int y, Object o) {
+ f(x < y, 0 > (o as int));
+}
+
+main() {
+ g(0, 1, 2);
+}
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect
new file mode 100644
index 0000000..bbefeb2
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect
@@ -0,0 +1,148 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(f, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(bool)
+ endMetadataStar(0)
+ beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(bool, typeReference)
+ handleNoTypeArguments(b1)
+ handleType(bool, null)
+ handleIdentifier(b1, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(bool)
+ endMetadataStar(0)
+ beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(bool, typeReference)
+ handleNoTypeArguments(b2)
+ handleType(bool, null)
+ handleIdentifier(b2, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(print, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ beginLiteralString('b1=)
+ handleIdentifier(b1, expression)
+ handleNoTypeArguments(, b2=)
+ handleNoArguments(, b2=)
+ handleSend(b1, , b2=)
+ handleInterpolationExpression($, null)
+ handleStringPart(, b2=)
+ handleIdentifier(b2, expression)
+ handleNoTypeArguments(')
+ handleNoArguments(')
+ handleSend(b2, ')
+ handleInterpolationExpression($, null)
+ handleStringPart(')
+ endLiteralString(2, ))
+ endArguments(1, (, ))
+ handleSend(print, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration(g)
+ beginMetadataStar(g)
+ endMetadataStar(0)
+ beginTopLevelMember(g)
+ beginTopLevelMethod(}, null)
+ handleNoType(})
+ handleIdentifier(g, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(x)
+ handleType(int, null)
+ handleIdentifier(x, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(y)
+ handleType(int, null)
+ handleIdentifier(y, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(Object)
+ endMetadataStar(0)
+ beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(Object, typeReference)
+ handleNoTypeArguments(o)
+ handleType(Object, null)
+ handleIdentifier(o, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(f, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ handleIdentifier(x, expression)
+ handleNoTypeArguments(<)
+ handleNoArguments(<)
+ handleSend(x, <)
+ beginBinaryExpression(<)
+ handleIdentifier(y, expression)
+ handleNoTypeArguments(,)
+ handleNoArguments(,)
+ handleSend(y, ,)
+ endBinaryExpression(<)
+ handleLiteralInt(0)
+ beginBinaryExpression(>)
+ handleIdentifier(o, expression)
+ handleNoTypeArguments(as)
+ handleNoArguments(as)
+ handleSend(o, as)
+ beginAsOperatorType(as)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments())
+ handleType(int, null)
+ endAsOperatorType(as)
+ handleAsOperator(as)
+ handleParenthesizedExpression(()
+ endBinaryExpression(>)
+ endArguments(2, (, ))
+ handleSend(f, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(g, null, })
+ endTopLevelDeclaration(main)
+ beginMetadataStar(main)
+ endMetadataStar(0)
+ beginTopLevelMember(main)
+ beginTopLevelMethod(}, null)
+ handleNoType(})
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(g, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ handleLiteralInt(0)
+ handleLiteralInt(1)
+ handleLiteralInt(2)
+ endArguments(3, (, ))
+ handleSend(g, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(main, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect
new file mode 100644
index 0000000..db77e3c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect
@@ -0,0 +1,333 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, f, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(bool)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(bool, typeReference)
+ listener: handleNoTypeArguments(b1)
+ listener: handleType(bool, null)
+ ensureIdentifier(bool, formalParameterDeclaration)
+ listener: handleIdentifier(b1, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(bool)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(bool, typeReference)
+ listener: handleNoTypeArguments(b2)
+ listener: handleType(bool, null)
+ ensureIdentifier(bool, formalParameterDeclaration)
+ listener: handleIdentifier(b2, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, print)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(print)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(print, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(print)
+ parseArguments(print)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseLiteralString(()
+ parseSingleLiteralString(()
+ listener: beginLiteralString('b1=)
+ parseIdentifierExpression($)
+ parseSend($, expression)
+ ensureIdentifier($, expression)
+ listener: handleIdentifier(b1, expression)
+ listener: handleNoTypeArguments(, b2=)
+ parseArgumentsOpt(b1)
+ listener: handleNoArguments(, b2=)
+ listener: handleSend(b1, , b2=)
+ listener: handleInterpolationExpression($, null)
+ parseStringPart(b1)
+ listener: handleStringPart(, b2=)
+ parseIdentifierExpression($)
+ parseSend($, expression)
+ ensureIdentifier($, expression)
+ listener: handleIdentifier(b2, expression)
+ listener: handleNoTypeArguments(')
+ parseArgumentsOpt(b2)
+ listener: handleNoArguments(')
+ listener: handleSend(b2, ')
+ listener: handleInterpolationExpression($, null)
+ parseStringPart(b2)
+ listener: handleStringPart(')
+ listener: endLiteralString(2, ))
+ listener: endArguments(1, (, ))
+ listener: handleSend(print, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration(g)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(g)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(g)
+ isReservedKeyword(()
+ parseTopLevelMethod(}, null, }, Instance of 'NoType', null, g, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleNoType(})
+ ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(g, topLevelFunctionDeclaration)
+ parseMethodTypeVar(g)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(g, g, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(g, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(x)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(x, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(y)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(y, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(Object)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(Object, typeReference)
+ listener: handleNoTypeArguments(o)
+ listener: handleType(Object, null)
+ ensureIdentifier(Object, formalParameterDeclaration)
+ listener: handleIdentifier(o, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, f)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(f)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(f, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(f)
+ parseArguments(f)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ looksLikeFunctionBody())
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(x, expression)
+ listener: handleNoTypeArguments(<)
+ parseArgumentsOpt(x)
+ listener: handleNoArguments(<)
+ listener: handleSend(x, <)
+ listener: beginBinaryExpression(<)
+ parsePrecedenceExpression(<, 9, true)
+ parseUnaryExpression(<, true)
+ parsePrimary(<, expression)
+ parseSendOrFunctionLiteral(<, expression)
+ parseSend(<, expression)
+ ensureIdentifier(<, expression)
+ listener: handleIdentifier(y, expression)
+ listener: handleNoTypeArguments(,)
+ parseArgumentsOpt(y)
+ listener: handleNoArguments(,)
+ listener: handleSend(y, ,)
+ listener: endBinaryExpression(<)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseLiteralInt(,)
+ listener: handleLiteralInt(0)
+ listener: beginBinaryExpression(>)
+ parsePrecedenceExpression(>, 9, true)
+ parseUnaryExpression(>, true)
+ parsePrimary(>, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(>)
+ parseParenthesizedExpression(>)
+ parseExpressionInParenthesis(>)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(o, expression)
+ listener: handleNoTypeArguments(as)
+ parseArgumentsOpt(o)
+ listener: handleNoArguments(as)
+ listener: handleSend(o, as)
+ parseAsOperatorRest(o)
+ listener: beginAsOperatorType(as)
+ computeTypeAfterIsOrAs(as)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments())
+ listener: handleType(int, null)
+ listener: endAsOperatorType(as)
+ listener: handleAsOperator(as)
+ skipChainedAsIsOperators(int)
+ ensureCloseParen(int, ()
+ listener: handleParenthesizedExpression(()
+ listener: endBinaryExpression(>)
+ listener: endArguments(2, (, ))
+ listener: handleSend(f, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(g, null, })
+ listener: endTopLevelDeclaration(main)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(main)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(main)
+ isReservedKeyword(()
+ parseTopLevelMethod(}, null, }, Instance of 'NoType', null, main, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleNoType(})
+ ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, g)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(g)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(g, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(g)
+ parseArguments(g)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseLiteralInt(()
+ listener: handleLiteralInt(0)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseLiteralInt(,)
+ listener: handleLiteralInt(1)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseLiteralInt(,)
+ listener: handleLiteralInt(2)
+ listener: endArguments(3, (, ))
+ listener: handleSend(g, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(main, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.parser.expect b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.parser.expect
new file mode 100644
index 0000000..57875d1
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.parser.expect
@@ -0,0 +1,25 @@
+void f(bool b1, bool b2) {
+print('b1=$b1, b2=$b2');
+}
+
+g(int x, int y, Object o) {
+f(x < y, 0 > (o as int));
+}
+
+main() {
+g(0, 1, 2);
+}
+
+
+void[KeywordToken] f[StringToken]([BeginToken]bool[StringToken] b1[StringToken],[SimpleToken] bool[StringToken] b2[StringToken])[SimpleToken] {[BeginToken]
+print[StringToken]([BeginToken]'b1=[StringToken]$[SimpleToken]b1[StringToken], b2=[StringToken]$[SimpleToken]b2[StringToken]'[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+g[StringToken]([BeginToken]int[StringToken] x[StringToken],[SimpleToken] int[StringToken] y[StringToken],[SimpleToken] Object[StringToken] o[StringToken])[SimpleToken] {[BeginToken]
+f[StringToken]([BeginToken]x[StringToken] <[BeginToken] y[StringToken],[SimpleToken] 0[StringToken] >[SimpleToken] ([BeginToken]o[StringToken] as[KeywordToken] int[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+g[StringToken]([BeginToken]0[StringToken],[SimpleToken] 1[StringToken],[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.scanner.expect b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.scanner.expect
new file mode 100644
index 0000000..57875d1
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.scanner.expect
@@ -0,0 +1,25 @@
+void f(bool b1, bool b2) {
+print('b1=$b1, b2=$b2');
+}
+
+g(int x, int y, Object o) {
+f(x < y, 0 > (o as int));
+}
+
+main() {
+g(0, 1, 2);
+}
+
+
+void[KeywordToken] f[StringToken]([BeginToken]bool[StringToken] b1[StringToken],[SimpleToken] bool[StringToken] b2[StringToken])[SimpleToken] {[BeginToken]
+print[StringToken]([BeginToken]'b1=[StringToken]$[SimpleToken]b1[StringToken], b2=[StringToken]$[SimpleToken]b2[StringToken]'[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+g[StringToken]([BeginToken]int[StringToken] x[StringToken],[SimpleToken] int[StringToken] y[StringToken],[SimpleToken] Object[StringToken] o[StringToken])[SimpleToken] {[BeginToken]
+f[StringToken]([BeginToken]x[StringToken] <[BeginToken] y[StringToken],[SimpleToken] 0[StringToken] >[SimpleToken] ([BeginToken]o[StringToken] as[KeywordToken] int[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+g[StringToken]([BeginToken]0[StringToken],[SimpleToken] 1[StringToken],[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart
new file mode 100644
index 0000000..284430ed
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart
@@ -0,0 +1,11 @@
+void f(bool b1, bool b2) {
+ print('b1=$b1, b2=$b2');
+}
+
+g(int x, int y, Object o) {
+ f((x < y), 0 > (o as int));
+}
+
+main() {
+ g(0, 1, 2);
+}
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect
new file mode 100644
index 0000000..71b505f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect
@@ -0,0 +1,149 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(f, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(bool)
+ endMetadataStar(0)
+ beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(bool, typeReference)
+ handleNoTypeArguments(b1)
+ handleType(bool, null)
+ handleIdentifier(b1, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(bool)
+ endMetadataStar(0)
+ beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(bool, typeReference)
+ handleNoTypeArguments(b2)
+ handleType(bool, null)
+ handleIdentifier(b2, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(print, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ beginLiteralString('b1=)
+ handleIdentifier(b1, expression)
+ handleNoTypeArguments(, b2=)
+ handleNoArguments(, b2=)
+ handleSend(b1, , b2=)
+ handleInterpolationExpression($, null)
+ handleStringPart(, b2=)
+ handleIdentifier(b2, expression)
+ handleNoTypeArguments(')
+ handleNoArguments(')
+ handleSend(b2, ')
+ handleInterpolationExpression($, null)
+ handleStringPart(')
+ endLiteralString(2, ))
+ endArguments(1, (, ))
+ handleSend(print, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration(g)
+ beginMetadataStar(g)
+ endMetadataStar(0)
+ beginTopLevelMember(g)
+ beginTopLevelMethod(}, null)
+ handleNoType(})
+ handleIdentifier(g, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(x)
+ handleType(int, null)
+ handleIdentifier(x, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(y)
+ handleType(int, null)
+ handleIdentifier(y, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(Object)
+ endMetadataStar(0)
+ beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(Object, typeReference)
+ handleNoTypeArguments(o)
+ handleType(Object, null)
+ handleIdentifier(o, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(f, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ handleIdentifier(x, expression)
+ handleNoTypeArguments(<)
+ handleNoArguments(<)
+ handleSend(x, <)
+ beginBinaryExpression(<)
+ handleIdentifier(y, expression)
+ handleNoTypeArguments())
+ handleNoArguments())
+ handleSend(y, ))
+ endBinaryExpression(<)
+ handleParenthesizedExpression(()
+ handleLiteralInt(0)
+ beginBinaryExpression(>)
+ handleIdentifier(o, expression)
+ handleNoTypeArguments(as)
+ handleNoArguments(as)
+ handleSend(o, as)
+ beginAsOperatorType(as)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments())
+ handleType(int, null)
+ endAsOperatorType(as)
+ handleAsOperator(as)
+ handleParenthesizedExpression(()
+ endBinaryExpression(>)
+ endArguments(2, (, ))
+ handleSend(f, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(g, null, })
+ endTopLevelDeclaration(main)
+ beginMetadataStar(main)
+ endMetadataStar(0)
+ beginTopLevelMember(main)
+ beginTopLevelMethod(}, null)
+ handleNoType(})
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(g, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ handleLiteralInt(0)
+ handleLiteralInt(1)
+ handleLiteralInt(2)
+ endArguments(3, (, ))
+ handleSend(g, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(main, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect
new file mode 100644
index 0000000..3389d26
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect
@@ -0,0 +1,342 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, f, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(bool)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(bool, typeReference)
+ listener: handleNoTypeArguments(b1)
+ listener: handleType(bool, null)
+ ensureIdentifier(bool, formalParameterDeclaration)
+ listener: handleIdentifier(b1, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(bool)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(bool, typeReference)
+ listener: handleNoTypeArguments(b2)
+ listener: handleType(bool, null)
+ ensureIdentifier(bool, formalParameterDeclaration)
+ listener: handleIdentifier(b2, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, print)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(print)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(print, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(print)
+ parseArguments(print)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseLiteralString(()
+ parseSingleLiteralString(()
+ listener: beginLiteralString('b1=)
+ parseIdentifierExpression($)
+ parseSend($, expression)
+ ensureIdentifier($, expression)
+ listener: handleIdentifier(b1, expression)
+ listener: handleNoTypeArguments(, b2=)
+ parseArgumentsOpt(b1)
+ listener: handleNoArguments(, b2=)
+ listener: handleSend(b1, , b2=)
+ listener: handleInterpolationExpression($, null)
+ parseStringPart(b1)
+ listener: handleStringPart(, b2=)
+ parseIdentifierExpression($)
+ parseSend($, expression)
+ ensureIdentifier($, expression)
+ listener: handleIdentifier(b2, expression)
+ listener: handleNoTypeArguments(')
+ parseArgumentsOpt(b2)
+ listener: handleNoArguments(')
+ listener: handleSend(b2, ')
+ listener: handleInterpolationExpression($, null)
+ parseStringPart(b2)
+ listener: handleStringPart(')
+ listener: endLiteralString(2, ))
+ listener: endArguments(1, (, ))
+ listener: handleSend(print, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration(g)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(g)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(g)
+ isReservedKeyword(()
+ parseTopLevelMethod(}, null, }, Instance of 'NoType', null, g, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleNoType(})
+ ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(g, topLevelFunctionDeclaration)
+ parseMethodTypeVar(g)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(g, g, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(g, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(x)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(x, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(y)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(y, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(Object)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(Object, typeReference)
+ listener: handleNoTypeArguments(o)
+ listener: handleType(Object, null)
+ ensureIdentifier(Object, formalParameterDeclaration)
+ listener: handleIdentifier(o, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, f)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(f)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(f, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(f)
+ parseArguments(f)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(()
+ parseParenthesizedExpression(()
+ parseExpressionInParenthesis(()
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(x, expression)
+ listener: handleNoTypeArguments(<)
+ parseArgumentsOpt(x)
+ listener: handleNoArguments(<)
+ listener: handleSend(x, <)
+ listener: beginBinaryExpression(<)
+ parsePrecedenceExpression(<, 9, true)
+ parseUnaryExpression(<, true)
+ parsePrimary(<, expression)
+ parseSendOrFunctionLiteral(<, expression)
+ parseSend(<, expression)
+ ensureIdentifier(<, expression)
+ listener: handleIdentifier(y, expression)
+ listener: handleNoTypeArguments())
+ parseArgumentsOpt(y)
+ listener: handleNoArguments())
+ listener: handleSend(y, ))
+ listener: endBinaryExpression(<)
+ ensureCloseParen(y, ()
+ listener: handleParenthesizedExpression(()
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseLiteralInt(,)
+ listener: handleLiteralInt(0)
+ listener: beginBinaryExpression(>)
+ parsePrecedenceExpression(>, 9, true)
+ parseUnaryExpression(>, true)
+ parsePrimary(>, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(>)
+ parseParenthesizedExpression(>)
+ parseExpressionInParenthesis(>)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(o, expression)
+ listener: handleNoTypeArguments(as)
+ parseArgumentsOpt(o)
+ listener: handleNoArguments(as)
+ listener: handleSend(o, as)
+ parseAsOperatorRest(o)
+ listener: beginAsOperatorType(as)
+ computeTypeAfterIsOrAs(as)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments())
+ listener: handleType(int, null)
+ listener: endAsOperatorType(as)
+ listener: handleAsOperator(as)
+ skipChainedAsIsOperators(int)
+ ensureCloseParen(int, ()
+ listener: handleParenthesizedExpression(()
+ listener: endBinaryExpression(>)
+ listener: endArguments(2, (, ))
+ listener: handleSend(f, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(g, null, })
+ listener: endTopLevelDeclaration(main)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(main)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(main)
+ isReservedKeyword(()
+ parseTopLevelMethod(}, null, }, Instance of 'NoType', null, main, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleNoType(})
+ ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, g)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(g)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(g, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(g)
+ parseArguments(g)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseLiteralInt(()
+ listener: handleLiteralInt(0)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseLiteralInt(,)
+ listener: handleLiteralInt(1)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseLiteralInt(,)
+ listener: handleLiteralInt(2)
+ listener: endArguments(3, (, ))
+ listener: handleSend(g, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(main, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.parser.expect b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.parser.expect
new file mode 100644
index 0000000..c34aac4
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.parser.expect
@@ -0,0 +1,25 @@
+void f(bool b1, bool b2) {
+print('b1=$b1, b2=$b2');
+}
+
+g(int x, int y, Object o) {
+f((x < y), 0 > (o as int));
+}
+
+main() {
+g(0, 1, 2);
+}
+
+
+void[KeywordToken] f[StringToken]([BeginToken]bool[StringToken] b1[StringToken],[SimpleToken] bool[StringToken] b2[StringToken])[SimpleToken] {[BeginToken]
+print[StringToken]([BeginToken]'b1=[StringToken]$[SimpleToken]b1[StringToken], b2=[StringToken]$[SimpleToken]b2[StringToken]'[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+g[StringToken]([BeginToken]int[StringToken] x[StringToken],[SimpleToken] int[StringToken] y[StringToken],[SimpleToken] Object[StringToken] o[StringToken])[SimpleToken] {[BeginToken]
+f[StringToken]([BeginToken]([BeginToken]x[StringToken] <[BeginToken] y[StringToken])[SimpleToken],[SimpleToken] 0[StringToken] >[SimpleToken] ([BeginToken]o[StringToken] as[KeywordToken] int[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+g[StringToken]([BeginToken]0[StringToken],[SimpleToken] 1[StringToken],[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.scanner.expect
new file mode 100644
index 0000000..c34aac4
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.scanner.expect
@@ -0,0 +1,25 @@
+void f(bool b1, bool b2) {
+print('b1=$b1, b2=$b2');
+}
+
+g(int x, int y, Object o) {
+f((x < y), 0 > (o as int));
+}
+
+main() {
+g(0, 1, 2);
+}
+
+
+void[KeywordToken] f[StringToken]([BeginToken]bool[StringToken] b1[StringToken],[SimpleToken] bool[StringToken] b2[StringToken])[SimpleToken] {[BeginToken]
+print[StringToken]([BeginToken]'b1=[StringToken]$[SimpleToken]b1[StringToken], b2=[StringToken]$[SimpleToken]b2[StringToken]'[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+g[StringToken]([BeginToken]int[StringToken] x[StringToken],[SimpleToken] int[StringToken] y[StringToken],[SimpleToken] Object[StringToken] o[StringToken])[SimpleToken] {[BeginToken]
+f[StringToken]([BeginToken]([BeginToken]x[StringToken] <[BeginToken] y[StringToken])[SimpleToken],[SimpleToken] 0[StringToken] >[SimpleToken] ([BeginToken]o[StringToken] as[KeywordToken] int[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+g[StringToken]([BeginToken]0[StringToken],[SimpleToken] 1[StringToken],[SimpleToken] 2[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03.dart b/pkg/front_end/parser_testcases/general/issue_45848_03.dart
new file mode 100644
index 0000000..a403ba2
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03.dart
@@ -0,0 +1,11 @@
+void f(bool b1, bool b2) {
+ print('b1=$b1, b2=$b2');
+}
+
+g(int x, int y, Object o, Object p) {
+ f(x < y, (o as int) > (p as int));
+}
+
+main() {
+ g(0, 1, 2, 3);
+}
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect
new file mode 100644
index 0000000..6058857
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect
@@ -0,0 +1,168 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(f, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(bool)
+ endMetadataStar(0)
+ beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(bool, typeReference)
+ handleNoTypeArguments(b1)
+ handleType(bool, null)
+ handleIdentifier(b1, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(bool)
+ endMetadataStar(0)
+ beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(bool, typeReference)
+ handleNoTypeArguments(b2)
+ handleType(bool, null)
+ handleIdentifier(b2, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(print, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ beginLiteralString('b1=)
+ handleIdentifier(b1, expression)
+ handleNoTypeArguments(, b2=)
+ handleNoArguments(, b2=)
+ handleSend(b1, , b2=)
+ handleInterpolationExpression($, null)
+ handleStringPart(, b2=)
+ handleIdentifier(b2, expression)
+ handleNoTypeArguments(')
+ handleNoArguments(')
+ handleSend(b2, ')
+ handleInterpolationExpression($, null)
+ handleStringPart(')
+ endLiteralString(2, ))
+ endArguments(1, (, ))
+ handleSend(print, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration(g)
+ beginMetadataStar(g)
+ endMetadataStar(0)
+ beginTopLevelMember(g)
+ beginTopLevelMethod(}, null)
+ handleNoType(})
+ handleIdentifier(g, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(x)
+ handleType(int, null)
+ handleIdentifier(x, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(y)
+ handleType(int, null)
+ handleIdentifier(y, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(Object)
+ endMetadataStar(0)
+ beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(Object, typeReference)
+ handleNoTypeArguments(o)
+ handleType(Object, null)
+ handleIdentifier(o, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(Object)
+ endMetadataStar(0)
+ beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(Object, typeReference)
+ handleNoTypeArguments(p)
+ handleType(Object, null)
+ handleIdentifier(p, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(4, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(f, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ handleIdentifier(x, expression)
+ handleNoTypeArguments(<)
+ handleNoArguments(<)
+ handleSend(x, <)
+ beginBinaryExpression(<)
+ handleIdentifier(y, expression)
+ handleNoTypeArguments(,)
+ handleNoArguments(,)
+ handleSend(y, ,)
+ endBinaryExpression(<)
+ handleIdentifier(o, expression)
+ handleNoTypeArguments(as)
+ handleNoArguments(as)
+ handleSend(o, as)
+ beginAsOperatorType(as)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments())
+ handleType(int, null)
+ endAsOperatorType(as)
+ handleAsOperator(as)
+ handleParenthesizedExpression(()
+ beginBinaryExpression(>)
+ handleIdentifier(p, expression)
+ handleNoTypeArguments(as)
+ handleNoArguments(as)
+ handleSend(p, as)
+ beginAsOperatorType(as)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments())
+ handleType(int, null)
+ endAsOperatorType(as)
+ handleAsOperator(as)
+ handleParenthesizedExpression(()
+ endBinaryExpression(>)
+ endArguments(2, (, ))
+ handleSend(f, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(g, null, })
+ endTopLevelDeclaration(main)
+ beginMetadataStar(main)
+ endMetadataStar(0)
+ beginTopLevelMember(main)
+ beginTopLevelMethod(}, null)
+ handleNoType(})
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(g, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ handleLiteralInt(0)
+ handleLiteralInt(1)
+ handleLiteralInt(2)
+ handleLiteralInt(3)
+ endArguments(4, (, ))
+ handleSend(g, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(main, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect
new file mode 100644
index 0000000..364051c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect
@@ -0,0 +1,376 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, f, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(bool)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(bool, typeReference)
+ listener: handleNoTypeArguments(b1)
+ listener: handleType(bool, null)
+ ensureIdentifier(bool, formalParameterDeclaration)
+ listener: handleIdentifier(b1, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(bool)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(bool, typeReference)
+ listener: handleNoTypeArguments(b2)
+ listener: handleType(bool, null)
+ ensureIdentifier(bool, formalParameterDeclaration)
+ listener: handleIdentifier(b2, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, print)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(print)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(print, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(print)
+ parseArguments(print)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseLiteralString(()
+ parseSingleLiteralString(()
+ listener: beginLiteralString('b1=)
+ parseIdentifierExpression($)
+ parseSend($, expression)
+ ensureIdentifier($, expression)
+ listener: handleIdentifier(b1, expression)
+ listener: handleNoTypeArguments(, b2=)
+ parseArgumentsOpt(b1)
+ listener: handleNoArguments(, b2=)
+ listener: handleSend(b1, , b2=)
+ listener: handleInterpolationExpression($, null)
+ parseStringPart(b1)
+ listener: handleStringPart(, b2=)
+ parseIdentifierExpression($)
+ parseSend($, expression)
+ ensureIdentifier($, expression)
+ listener: handleIdentifier(b2, expression)
+ listener: handleNoTypeArguments(')
+ parseArgumentsOpt(b2)
+ listener: handleNoArguments(')
+ listener: handleSend(b2, ')
+ listener: handleInterpolationExpression($, null)
+ parseStringPart(b2)
+ listener: handleStringPart(')
+ listener: endLiteralString(2, ))
+ listener: endArguments(1, (, ))
+ listener: handleSend(print, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration(g)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(g)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(g)
+ isReservedKeyword(()
+ parseTopLevelMethod(}, null, }, Instance of 'NoType', null, g, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleNoType(})
+ ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(g, topLevelFunctionDeclaration)
+ parseMethodTypeVar(g)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(g, g, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(g, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(x)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(x, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(y)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(y, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(Object)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(Object, typeReference)
+ listener: handleNoTypeArguments(o)
+ listener: handleType(Object, null)
+ ensureIdentifier(Object, formalParameterDeclaration)
+ listener: handleIdentifier(o, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(Object)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(Object, typeReference)
+ listener: handleNoTypeArguments(p)
+ listener: handleType(Object, null)
+ ensureIdentifier(Object, formalParameterDeclaration)
+ listener: handleIdentifier(p, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(4, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, f)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(f)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(f, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(f)
+ parseArguments(f)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ looksLikeFunctionBody())
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(x, expression)
+ listener: handleNoTypeArguments(<)
+ parseArgumentsOpt(x)
+ listener: handleNoArguments(<)
+ listener: handleSend(x, <)
+ listener: beginBinaryExpression(<)
+ parsePrecedenceExpression(<, 9, true)
+ parseUnaryExpression(<, true)
+ parsePrimary(<, expression)
+ parseSendOrFunctionLiteral(<, expression)
+ parseSend(<, expression)
+ ensureIdentifier(<, expression)
+ listener: handleIdentifier(y, expression)
+ listener: handleNoTypeArguments(,)
+ parseArgumentsOpt(y)
+ listener: handleNoArguments(,)
+ listener: handleSend(y, ,)
+ listener: endBinaryExpression(<)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(,)
+ parseParenthesizedExpression(,)
+ parseExpressionInParenthesis(,)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(o, expression)
+ listener: handleNoTypeArguments(as)
+ parseArgumentsOpt(o)
+ listener: handleNoArguments(as)
+ listener: handleSend(o, as)
+ parseAsOperatorRest(o)
+ listener: beginAsOperatorType(as)
+ computeTypeAfterIsOrAs(as)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments())
+ listener: handleType(int, null)
+ listener: endAsOperatorType(as)
+ listener: handleAsOperator(as)
+ skipChainedAsIsOperators(int)
+ ensureCloseParen(int, ()
+ listener: handleParenthesizedExpression(()
+ listener: beginBinaryExpression(>)
+ parsePrecedenceExpression(>, 9, true)
+ parseUnaryExpression(>, true)
+ parsePrimary(>, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(>)
+ parseParenthesizedExpression(>)
+ parseExpressionInParenthesis(>)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(p, expression)
+ listener: handleNoTypeArguments(as)
+ parseArgumentsOpt(p)
+ listener: handleNoArguments(as)
+ listener: handleSend(p, as)
+ parseAsOperatorRest(p)
+ listener: beginAsOperatorType(as)
+ computeTypeAfterIsOrAs(as)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments())
+ listener: handleType(int, null)
+ listener: endAsOperatorType(as)
+ listener: handleAsOperator(as)
+ skipChainedAsIsOperators(int)
+ ensureCloseParen(int, ()
+ listener: handleParenthesizedExpression(()
+ listener: endBinaryExpression(>)
+ listener: endArguments(2, (, ))
+ listener: handleSend(f, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(g, null, })
+ listener: endTopLevelDeclaration(main)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(main)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(main)
+ isReservedKeyword(()
+ parseTopLevelMethod(}, null, }, Instance of 'NoType', null, main, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleNoType(})
+ ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, g)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(g)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(g, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(g)
+ parseArguments(g)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseLiteralInt(()
+ listener: handleLiteralInt(0)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseLiteralInt(,)
+ listener: handleLiteralInt(1)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseLiteralInt(,)
+ listener: handleLiteralInt(2)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseLiteralInt(,)
+ listener: handleLiteralInt(3)
+ listener: endArguments(4, (, ))
+ listener: handleSend(g, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(main, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.parser.expect b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.parser.expect
new file mode 100644
index 0000000..7d232eb
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.parser.expect
@@ -0,0 +1,25 @@
+void f(bool b1, bool b2) {
+print('b1=$b1, b2=$b2');
+}
+
+g(int x, int y, Object o, Object p) {
+f(x < y, (o as int) > (p as int));
+}
+
+main() {
+g(0, 1, 2, 3);
+}
+
+
+void[KeywordToken] f[StringToken]([BeginToken]bool[StringToken] b1[StringToken],[SimpleToken] bool[StringToken] b2[StringToken])[SimpleToken] {[BeginToken]
+print[StringToken]([BeginToken]'b1=[StringToken]$[SimpleToken]b1[StringToken], b2=[StringToken]$[SimpleToken]b2[StringToken]'[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+g[StringToken]([BeginToken]int[StringToken] x[StringToken],[SimpleToken] int[StringToken] y[StringToken],[SimpleToken] Object[StringToken] o[StringToken],[SimpleToken] Object[StringToken] p[StringToken])[SimpleToken] {[BeginToken]
+f[StringToken]([BeginToken]x[StringToken] <[BeginToken] y[StringToken],[SimpleToken] ([BeginToken]o[StringToken] as[KeywordToken] int[StringToken])[SimpleToken] >[SimpleToken] ([BeginToken]p[StringToken] as[KeywordToken] int[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+g[StringToken]([BeginToken]0[StringToken],[SimpleToken] 1[StringToken],[SimpleToken] 2[StringToken],[SimpleToken] 3[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.scanner.expect b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.scanner.expect
new file mode 100644
index 0000000..7d232eb
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.scanner.expect
@@ -0,0 +1,25 @@
+void f(bool b1, bool b2) {
+print('b1=$b1, b2=$b2');
+}
+
+g(int x, int y, Object o, Object p) {
+f(x < y, (o as int) > (p as int));
+}
+
+main() {
+g(0, 1, 2, 3);
+}
+
+
+void[KeywordToken] f[StringToken]([BeginToken]bool[StringToken] b1[StringToken],[SimpleToken] bool[StringToken] b2[StringToken])[SimpleToken] {[BeginToken]
+print[StringToken]([BeginToken]'b1=[StringToken]$[SimpleToken]b1[StringToken], b2=[StringToken]$[SimpleToken]b2[StringToken]'[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+g[StringToken]([BeginToken]int[StringToken] x[StringToken],[SimpleToken] int[StringToken] y[StringToken],[SimpleToken] Object[StringToken] o[StringToken],[SimpleToken] Object[StringToken] p[StringToken])[SimpleToken] {[BeginToken]
+f[StringToken]([BeginToken]x[StringToken] <[BeginToken] y[StringToken],[SimpleToken] ([BeginToken]o[StringToken] as[KeywordToken] int[StringToken])[SimpleToken] >[SimpleToken] ([BeginToken]p[StringToken] as[KeywordToken] int[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+g[StringToken]([BeginToken]0[StringToken],[SimpleToken] 1[StringToken],[SimpleToken] 2[StringToken],[SimpleToken] 3[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart
new file mode 100644
index 0000000..c20b2c6
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart
@@ -0,0 +1,11 @@
+void f(bool b1, bool b2) {
+ print('b1=$b1, b2=$b2');
+}
+
+g(int x, int y, Object o, Object p) {
+ f((x < y), (o as int) > (p as int));
+}
+
+main() {
+ g(0, 1, 2, 3);
+}
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect
new file mode 100644
index 0000000..d5df020
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect
@@ -0,0 +1,169 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(f, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(bool)
+ endMetadataStar(0)
+ beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(bool, typeReference)
+ handleNoTypeArguments(b1)
+ handleType(bool, null)
+ handleIdentifier(b1, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(bool)
+ endMetadataStar(0)
+ beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(bool, typeReference)
+ handleNoTypeArguments(b2)
+ handleType(bool, null)
+ handleIdentifier(b2, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(print, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ beginLiteralString('b1=)
+ handleIdentifier(b1, expression)
+ handleNoTypeArguments(, b2=)
+ handleNoArguments(, b2=)
+ handleSend(b1, , b2=)
+ handleInterpolationExpression($, null)
+ handleStringPart(, b2=)
+ handleIdentifier(b2, expression)
+ handleNoTypeArguments(')
+ handleNoArguments(')
+ handleSend(b2, ')
+ handleInterpolationExpression($, null)
+ handleStringPart(')
+ endLiteralString(2, ))
+ endArguments(1, (, ))
+ handleSend(print, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration(g)
+ beginMetadataStar(g)
+ endMetadataStar(0)
+ beginTopLevelMember(g)
+ beginTopLevelMethod(}, null)
+ handleNoType(})
+ handleIdentifier(g, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(x)
+ handleType(int, null)
+ handleIdentifier(x, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(int)
+ endMetadataStar(0)
+ beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments(y)
+ handleType(int, null)
+ handleIdentifier(y, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(Object)
+ endMetadataStar(0)
+ beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(Object, typeReference)
+ handleNoTypeArguments(o)
+ handleType(Object, null)
+ handleIdentifier(o, formalParameterDeclaration)
+ handleFormalParameterWithoutValue(,)
+ endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ beginMetadataStar(Object)
+ endMetadataStar(0)
+ beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ handleIdentifier(Object, typeReference)
+ handleNoTypeArguments(p)
+ handleType(Object, null)
+ handleIdentifier(p, formalParameterDeclaration)
+ handleFormalParameterWithoutValue())
+ endFormalParameter(null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ endFormalParameters(4, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(f, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ handleIdentifier(x, expression)
+ handleNoTypeArguments(<)
+ handleNoArguments(<)
+ handleSend(x, <)
+ beginBinaryExpression(<)
+ handleIdentifier(y, expression)
+ handleNoTypeArguments())
+ handleNoArguments())
+ handleSend(y, ))
+ endBinaryExpression(<)
+ handleParenthesizedExpression(()
+ handleIdentifier(o, expression)
+ handleNoTypeArguments(as)
+ handleNoArguments(as)
+ handleSend(o, as)
+ beginAsOperatorType(as)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments())
+ handleType(int, null)
+ endAsOperatorType(as)
+ handleAsOperator(as)
+ handleParenthesizedExpression(()
+ beginBinaryExpression(>)
+ handleIdentifier(p, expression)
+ handleNoTypeArguments(as)
+ handleNoArguments(as)
+ handleSend(p, as)
+ beginAsOperatorType(as)
+ handleIdentifier(int, typeReference)
+ handleNoTypeArguments())
+ handleType(int, null)
+ endAsOperatorType(as)
+ handleAsOperator(as)
+ handleParenthesizedExpression(()
+ endBinaryExpression(>)
+ endArguments(2, (, ))
+ handleSend(f, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(g, null, })
+ endTopLevelDeclaration(main)
+ beginMetadataStar(main)
+ endMetadataStar(0)
+ beginTopLevelMember(main)
+ beginTopLevelMethod(}, null)
+ handleNoType(})
+ handleIdentifier(main, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(g, expression)
+ handleNoTypeArguments(()
+ beginArguments(()
+ handleLiteralInt(0)
+ handleLiteralInt(1)
+ handleLiteralInt(2)
+ handleLiteralInt(3)
+ endArguments(4, (, ))
+ handleSend(g, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(main, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect
new file mode 100644
index 0000000..e73f340
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect
@@ -0,0 +1,385 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, f, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(bool)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(bool, typeReference)
+ listener: handleNoTypeArguments(b1)
+ listener: handleType(bool, null)
+ ensureIdentifier(bool, formalParameterDeclaration)
+ listener: handleIdentifier(b1, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(bool)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(bool, typeReference)
+ listener: handleNoTypeArguments(b2)
+ listener: handleType(bool, null)
+ ensureIdentifier(bool, formalParameterDeclaration)
+ listener: handleIdentifier(b2, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, print)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(print)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(print, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(print)
+ parseArguments(print)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseLiteralString(()
+ parseSingleLiteralString(()
+ listener: beginLiteralString('b1=)
+ parseIdentifierExpression($)
+ parseSend($, expression)
+ ensureIdentifier($, expression)
+ listener: handleIdentifier(b1, expression)
+ listener: handleNoTypeArguments(, b2=)
+ parseArgumentsOpt(b1)
+ listener: handleNoArguments(, b2=)
+ listener: handleSend(b1, , b2=)
+ listener: handleInterpolationExpression($, null)
+ parseStringPart(b1)
+ listener: handleStringPart(, b2=)
+ parseIdentifierExpression($)
+ parseSend($, expression)
+ ensureIdentifier($, expression)
+ listener: handleIdentifier(b2, expression)
+ listener: handleNoTypeArguments(')
+ parseArgumentsOpt(b2)
+ listener: handleNoArguments(')
+ listener: handleSend(b2, ')
+ listener: handleInterpolationExpression($, null)
+ parseStringPart(b2)
+ listener: handleStringPart(')
+ listener: endLiteralString(2, ))
+ listener: endArguments(1, (, ))
+ listener: handleSend(print, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration(g)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(g)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(g)
+ isReservedKeyword(()
+ parseTopLevelMethod(}, null, }, Instance of 'NoType', null, g, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleNoType(})
+ ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(g, topLevelFunctionDeclaration)
+ parseMethodTypeVar(g)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(g, g, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(g, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(()
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(x)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(x, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(int)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments(y)
+ listener: handleType(int, null)
+ ensureIdentifier(int, formalParameterDeclaration)
+ listener: handleIdentifier(y, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(Object)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(Object, typeReference)
+ listener: handleNoTypeArguments(o)
+ listener: handleType(Object, null)
+ ensureIdentifier(Object, formalParameterDeclaration)
+ listener: handleIdentifier(o, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue(,)
+ listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(Object)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
+ listener: handleIdentifier(Object, typeReference)
+ listener: handleNoTypeArguments(p)
+ listener: handleType(Object, null)
+ ensureIdentifier(Object, formalParameterDeclaration)
+ listener: handleIdentifier(p, formalParameterDeclaration)
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(4, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, f)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(f)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(f, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(f)
+ parseArguments(f)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(()
+ parseParenthesizedExpression(()
+ parseExpressionInParenthesis(()
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(x, expression)
+ listener: handleNoTypeArguments(<)
+ parseArgumentsOpt(x)
+ listener: handleNoArguments(<)
+ listener: handleSend(x, <)
+ listener: beginBinaryExpression(<)
+ parsePrecedenceExpression(<, 9, true)
+ parseUnaryExpression(<, true)
+ parsePrimary(<, expression)
+ parseSendOrFunctionLiteral(<, expression)
+ parseSend(<, expression)
+ ensureIdentifier(<, expression)
+ listener: handleIdentifier(y, expression)
+ listener: handleNoTypeArguments())
+ parseArgumentsOpt(y)
+ listener: handleNoArguments())
+ listener: handleSend(y, ))
+ listener: endBinaryExpression(<)
+ ensureCloseParen(y, ()
+ listener: handleParenthesizedExpression(()
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(,)
+ parseParenthesizedExpression(,)
+ parseExpressionInParenthesis(,)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(o, expression)
+ listener: handleNoTypeArguments(as)
+ parseArgumentsOpt(o)
+ listener: handleNoArguments(as)
+ listener: handleSend(o, as)
+ parseAsOperatorRest(o)
+ listener: beginAsOperatorType(as)
+ computeTypeAfterIsOrAs(as)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments())
+ listener: handleType(int, null)
+ listener: endAsOperatorType(as)
+ listener: handleAsOperator(as)
+ skipChainedAsIsOperators(int)
+ ensureCloseParen(int, ()
+ listener: handleParenthesizedExpression(()
+ listener: beginBinaryExpression(>)
+ parsePrecedenceExpression(>, 9, true)
+ parseUnaryExpression(>, true)
+ parsePrimary(>, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(>)
+ parseParenthesizedExpression(>)
+ parseExpressionInParenthesis(>)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(p, expression)
+ listener: handleNoTypeArguments(as)
+ parseArgumentsOpt(p)
+ listener: handleNoArguments(as)
+ listener: handleSend(p, as)
+ parseAsOperatorRest(p)
+ listener: beginAsOperatorType(as)
+ computeTypeAfterIsOrAs(as)
+ listener: handleIdentifier(int, typeReference)
+ listener: handleNoTypeArguments())
+ listener: handleType(int, null)
+ listener: endAsOperatorType(as)
+ listener: handleAsOperator(as)
+ skipChainedAsIsOperators(int)
+ ensureCloseParen(int, ()
+ listener: handleParenthesizedExpression(()
+ listener: endBinaryExpression(>)
+ listener: endArguments(2, (, ))
+ listener: handleSend(f, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(g, null, })
+ listener: endTopLevelDeclaration(main)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(main)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(main)
+ isReservedKeyword(()
+ parseTopLevelMethod(}, null, }, Instance of 'NoType', null, main, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleNoType(})
+ ensureIdentifierPotentiallyRecovered(}, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, g)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(g)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(g, expression)
+ listener: handleNoTypeArguments(()
+ parseArgumentsOpt(g)
+ parseArguments(g)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseLiteralInt(()
+ listener: handleLiteralInt(0)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseLiteralInt(,)
+ listener: handleLiteralInt(1)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseLiteralInt(,)
+ listener: handleLiteralInt(2)
+ parseExpression(,)
+ parsePrecedenceExpression(,, 1, true)
+ parseUnaryExpression(,, true)
+ parsePrimary(,, expression)
+ parseLiteralInt(,)
+ listener: handleLiteralInt(3)
+ listener: endArguments(4, (, ))
+ listener: handleSend(g, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(main, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(3, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.parser.expect b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.parser.expect
new file mode 100644
index 0000000..c1efd8b
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.parser.expect
@@ -0,0 +1,25 @@
+void f(bool b1, bool b2) {
+print('b1=$b1, b2=$b2');
+}
+
+g(int x, int y, Object o, Object p) {
+f((x < y), (o as int) > (p as int));
+}
+
+main() {
+g(0, 1, 2, 3);
+}
+
+
+void[KeywordToken] f[StringToken]([BeginToken]bool[StringToken] b1[StringToken],[SimpleToken] bool[StringToken] b2[StringToken])[SimpleToken] {[BeginToken]
+print[StringToken]([BeginToken]'b1=[StringToken]$[SimpleToken]b1[StringToken], b2=[StringToken]$[SimpleToken]b2[StringToken]'[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+g[StringToken]([BeginToken]int[StringToken] x[StringToken],[SimpleToken] int[StringToken] y[StringToken],[SimpleToken] Object[StringToken] o[StringToken],[SimpleToken] Object[StringToken] p[StringToken])[SimpleToken] {[BeginToken]
+f[StringToken]([BeginToken]([BeginToken]x[StringToken] <[BeginToken] y[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]o[StringToken] as[KeywordToken] int[StringToken])[SimpleToken] >[SimpleToken] ([BeginToken]p[StringToken] as[KeywordToken] int[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+g[StringToken]([BeginToken]0[StringToken],[SimpleToken] 1[StringToken],[SimpleToken] 2[StringToken],[SimpleToken] 3[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.scanner.expect
new file mode 100644
index 0000000..c1efd8b
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.scanner.expect
@@ -0,0 +1,25 @@
+void f(bool b1, bool b2) {
+print('b1=$b1, b2=$b2');
+}
+
+g(int x, int y, Object o, Object p) {
+f((x < y), (o as int) > (p as int));
+}
+
+main() {
+g(0, 1, 2, 3);
+}
+
+
+void[KeywordToken] f[StringToken]([BeginToken]bool[StringToken] b1[StringToken],[SimpleToken] bool[StringToken] b2[StringToken])[SimpleToken] {[BeginToken]
+print[StringToken]([BeginToken]'b1=[StringToken]$[SimpleToken]b1[StringToken], b2=[StringToken]$[SimpleToken]b2[StringToken]'[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+g[StringToken]([BeginToken]int[StringToken] x[StringToken],[SimpleToken] int[StringToken] y[StringToken],[SimpleToken] Object[StringToken] o[StringToken],[SimpleToken] Object[StringToken] p[StringToken])[SimpleToken] {[BeginToken]
+f[StringToken]([BeginToken]([BeginToken]x[StringToken] <[BeginToken] y[StringToken])[SimpleToken],[SimpleToken] ([BeginToken]o[StringToken] as[KeywordToken] int[StringToken])[SimpleToken] >[SimpleToken] ([BeginToken]p[StringToken] as[KeywordToken] int[StringToken])[SimpleToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+g[StringToken]([BeginToken]0[StringToken],[SimpleToken] 1[StringToken],[SimpleToken] 2[StringToken],[SimpleToken] 3[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_04.dart b/pkg/front_end/parser_testcases/general/issue_45848_04.dart
new file mode 100644
index 0000000..267de12
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_04.dart
@@ -0,0 +1,5 @@
+void f<T>() {}
+
+void m() {
+ f<>();
+}
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_04.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_04.dart.expect
new file mode 100644
index 0000000..5804baa
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_04.dart.expect
@@ -0,0 +1,55 @@
+Problems reported:
+
+parser/general/issue_45848_04:4:5: Expected a type, but got '>'.
+ f<>();
+ ^
+
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(f, topLevelFunctionDeclaration)
+ beginTypeVariables(<)
+ beginMetadataStar(T)
+ endMetadataStar(0)
+ handleIdentifier(T, typeVariableDeclaration)
+ beginTypeVariable(T)
+ handleTypeVariablesDefined(T, 1)
+ handleNoType(T)
+ endTypeVariable(>, 0, null, null)
+ endTypeVariables(<, >)
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ endBlockFunctionBody(0, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(}, null)
+ handleVoidKeyword(void)
+ handleIdentifier(m, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(f, expression)
+ beginTypeArguments(<)
+ handleRecoverableError(Message[ExpectedType, Expected a type, but got '>'., null, {lexeme: >}], >, >)
+ handleIdentifier(, typeReference)
+ handleNoTypeArguments(>)
+ handleType(, null)
+ endTypeArguments(1, <, >)
+ beginArguments(()
+ endArguments(0, (, ))
+ handleSend(f, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_04.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_04.dart.intertwined.expect
new file mode 100644
index 0000000..7711399
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_04.dart.intertwined.expect
@@ -0,0 +1,99 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, f, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: beginTypeVariables(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ listener: handleTypeVariablesDefined(T, 1)
+ listener: handleNoType(T)
+ listener: endTypeVariable(>, 0, null, null)
+ listener: endTypeVariables(<, >)
+ parseGetterOrFormalParameters(>, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(>, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(0, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration(void)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(}, null, }, Instance of 'VoidType', null, m, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(m, topLevelFunctionDeclaration)
+ parseMethodTypeVar(m)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(m, m, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(m, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, f)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(f)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(f, expression)
+ 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, <, >)
+ parseArgumentsOpt(>)
+ parseArguments(>)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ listener: endArguments(0, (, ))
+ listener: handleSend(f, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_04.dart.parser.expect b/pkg/front_end/parser_testcases/general/issue_45848_04.dart.parser.expect
new file mode 100644
index 0000000..7ffb0fe
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_04.dart.parser.expect
@@ -0,0 +1,13 @@
+NOTICE: Stream was rewritten by parser!
+
+void f<T>() {}
+
+void m() {
+f<>();
+}
+
+void[KeywordToken] f[StringToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+
+void[KeywordToken] m[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+f[StringToken]<[BeginToken][SyntheticStringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_04.dart.scanner.expect b/pkg/front_end/parser_testcases/general/issue_45848_04.dart.scanner.expect
new file mode 100644
index 0000000..753215e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_04.dart.scanner.expect
@@ -0,0 +1,11 @@
+void f<T>() {}
+
+void m() {
+f<>();
+}
+
+void[KeywordToken] f[StringToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+
+void[KeywordToken] m[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+f[StringToken]<[BeginToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart b/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart
new file mode 100644
index 0000000..2e637e0
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart
@@ -0,0 +1,5 @@
+void f<T>() {}
+
+void m() {
+ f<x>();
+}
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart.expect
new file mode 100644
index 0000000..72c0d1a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart.expect
@@ -0,0 +1,48 @@
+beginCompilationUnit(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(, null)
+ handleVoidKeyword(void)
+ handleIdentifier(f, topLevelFunctionDeclaration)
+ beginTypeVariables(<)
+ beginMetadataStar(T)
+ endMetadataStar(0)
+ handleIdentifier(T, typeVariableDeclaration)
+ beginTypeVariable(T)
+ handleTypeVariablesDefined(T, 1)
+ handleNoType(T)
+ endTypeVariable(>, 0, null, null)
+ endTypeVariables(<, >)
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ endBlockFunctionBody(0, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration(void)
+ beginMetadataStar(void)
+ endMetadataStar(0)
+ beginTopLevelMember(void)
+ beginTopLevelMethod(}, null)
+ handleVoidKeyword(void)
+ handleIdentifier(m, topLevelFunctionDeclaration)
+ handleNoTypeVariables(()
+ beginFormalParameters((, MemberKind.TopLevelMethod)
+ endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ handleAsyncModifier(null, null)
+ beginBlockFunctionBody({)
+ handleIdentifier(f, expression)
+ beginTypeArguments(<)
+ handleIdentifier(x, typeReference)
+ handleNoTypeArguments(>)
+ handleType(x, null)
+ endTypeArguments(1, <, >)
+ beginArguments(()
+ endArguments(0, (, ))
+ handleSend(f, ;)
+ handleExpressionStatement(;)
+ endBlockFunctionBody(1, {, })
+ endTopLevelMethod(void, null, })
+ endTopLevelDeclaration()
+endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart.intertwined.expect
new file mode 100644
index 0000000..8a8a859
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart.intertwined.expect
@@ -0,0 +1,96 @@
+parseUnit(void)
+ skipErrorTokens(void)
+ listener: beginCompilationUnit(void)
+ syntheticPreviousToken(void)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(, null, , Instance of 'VoidType', null, f, false)
+ listener: beginTopLevelMethod(, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: beginTypeVariables(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ listener: handleTypeVariablesDefined(T, 1)
+ listener: handleNoType(T)
+ listener: endTypeVariable(>, 0, null, null)
+ listener: endTypeVariables(<, >)
+ parseGetterOrFormalParameters(>, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(>, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(0, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration(void)
+ parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+ parseMetadataStar(})
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(})
+ listener: beginTopLevelMember(void)
+ parseTopLevelMethod(}, null, }, Instance of 'VoidType', null, m, false)
+ listener: beginTopLevelMethod(}, null)
+ listener: handleVoidKeyword(void)
+ ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(m, topLevelFunctionDeclaration)
+ parseMethodTypeVar(m)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(m, m, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(m, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, f)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(f)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ looksLikeFunctionBody(;)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(f, expression)
+ listener: beginTypeArguments(<)
+ listener: handleIdentifier(x, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(x, null)
+ listener: endTypeArguments(1, <, >)
+ parseArgumentsOpt(>)
+ parseArguments(>)
+ parseArgumentsRest(()
+ listener: beginArguments(()
+ listener: endArguments(0, (, ))
+ listener: handleSend(f, ;)
+ ensureSemicolon())
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(void, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(void)
+ listener: endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart.parser.expect b/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart.parser.expect
new file mode 100644
index 0000000..c268ee5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart.parser.expect
@@ -0,0 +1,13 @@
+void f<T>() {}
+
+void m() {
+f<x>();
+}
+
+
+void[KeywordToken] f[StringToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+
+void[KeywordToken] m[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+f[StringToken]<[BeginToken]x[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart.scanner.expect
new file mode 100644
index 0000000..c268ee5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_04_prime.dart.scanner.expect
@@ -0,0 +1,13 @@
+void f<T>() {}
+
+void m() {
+f<x>();
+}
+
+
+void[KeywordToken] f[StringToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+
+void[KeywordToken] m[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+f[StringToken]<[BeginToken]x[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]