Version 2.14.0-74.0.dev
Merge commit '9ff5ac12c6efec99b8d6580c7a7154bb5e265add' into 'dev'
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/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 7b6cb5f..7292d9a 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -460,7 +460,9 @@
for (var path in watched.paths) {
bazelWatcherService!.stopWatching(watched.workspace, path);
}
+ _stopWatchingBazelBinPaths(watched);
}
+ bazelSearchSubscriptions.remove(rootFolder)?.cancel();
driverMap.remove(rootFolder);
}
@@ -474,6 +476,11 @@
}
}
+ List<String> _getPossibelBazelBinPaths(_BazelWatchedFiles watched) => [
+ pathContext.join(watched.workspace, 'bazel-bin'),
+ pathContext.join(watched.workspace, 'blaze-bin'),
+ ];
+
/// Establishes watch(es) for the Bazel generated files provided in
/// [notification].
///
@@ -493,10 +500,23 @@
}
/// Notifies the drivers that a generated Bazel file has changed.
- void _handleBazelWatchEvents(List<WatchEvent> events) {
+ void _handleBazelWatchEvents(List<WatchEvent> allEvents) {
+ // First check if we have any changes to the bazel-*/blaze-* paths. If
+ // we do, we'll simply recreate all contexts to make sure that we follow the
+ // correct paths.
+ var bazelSymlinkPaths = bazelWatchedPathsPerFolder.values
+ .expand((watched) => _getPossibelBazelBinPaths(watched))
+ .toSet();
+ if (allEvents.any((event) => bazelSymlinkPaths.contains(event.path))) {
+ refresh();
+ return;
+ }
+
+ var fileEvents =
+ allEvents.where((event) => !bazelSymlinkPaths.contains(event.path));
for (var driver in driverMap.values) {
var needsUriReset = false;
- for (var event in events) {
+ for (var event in fileEvents) {
if (event.type == ChangeType.ADD) {
driver.addFile(event.path);
needsUriReset = true;
@@ -599,6 +619,28 @@
existingExcludedSet.containsAll(excludedPaths);
}
+ /// Starts watching for the `bazel-bin` and `blaze-bin` symlinks.
+ ///
+ /// This is important since these symlinks might not be present when the
+ /// server starts up, in which case `BazelWorkspace` assumes by default the
+ /// Bazel ones. So we want to detect if the symlinks get created to reset
+ /// everything and repeat the search for the folders.
+ void _startWatchingBazelBinPaths(_BazelWatchedFiles watched) {
+ var watcherService = bazelWatcherService;
+ if (watcherService == null) return;
+ var paths = _getPossibelBazelBinPaths(watched);
+ watcherService.startWatching(
+ watched.workspace, BazelSearchInfo(paths[0], paths));
+ }
+
+ /// Stops watching for the `bazel-bin` and `blaze-bin` symlinks.
+ void _stopWatchingBazelBinPaths(_BazelWatchedFiles watched) {
+ var watcherService = bazelWatcherService;
+ if (watcherService == null) return;
+ var paths = _getPossibelBazelBinPaths(watched);
+ watcherService.stopWatching(watched.workspace, paths[0]);
+ }
+
/// Listens to files generated by Bazel that were found or searched for.
///
/// This is handled specially because the files are outside the package
@@ -607,13 +649,19 @@
/// Does nothing if the [driver] is not in a Bazel workspace.
void _watchBazelFilesIfNeeded(Folder folder, AnalysisDriver analysisDriver) {
if (!experimentalEnableBazelWatching) return;
+ var watcherService = bazelWatcherService;
+ if (watcherService == null) return;
+
var workspace = analysisDriver.analysisContext?.contextRoot.workspace;
if (workspace is BazelWorkspace &&
!bazelSearchSubscriptions.containsKey(folder)) {
- var searchSubscription = workspace.bazelCandidateFiles.listen(
+ bazelSearchSubscriptions[folder] = workspace.bazelCandidateFiles.listen(
(notification) =>
_handleBazelSearchInfo(folder, workspace.root, notification));
- bazelSearchSubscriptions[folder] = searchSubscription;
+
+ var watched = _BazelWatchedFiles(workspace.root);
+ bazelWatchedPathsPerFolder[folder] = watched;
+ _startWatchingBazelBinPaths(watched);
}
}
}
diff --git a/pkg/analysis_server/test/integration/server/bazel_changes_test.dart b/pkg/analysis_server/test/integration/server/bazel_changes_test.dart
index f904df3..da935af 100644
--- a/pkg/analysis_server/test/integration/server/bazel_changes_test.dart
+++ b/pkg/analysis_server/test/integration/server/bazel_changes_test.dart
@@ -35,9 +35,9 @@
late String bazelRoot;
late String tmpPath;
late String workspacePath;
- late String bazelOutPath;
- late String bazelBinPath;
- late String bazelGenfilesPath;
+ late String bazelOrBlazeOutPath;
+ late String bazelOrBlazeBinPath;
+ late String bazelOrBlazeGenfilesPath;
late Directory oldSourceDirectory;
String inTmpDir(String relative) =>
@@ -61,21 +61,19 @@
sourceDirectory = Directory(inWorkspace('third_party/dart/project'));
sourceDirectory.createSync(recursive: true);
- bazelRoot = inTmpDir('bazel_root');
+ bazelRoot = inTmpDir('bazel_or_blaze_root');
Directory(bazelRoot).createSync(recursive: true);
- bazelOutPath = '$bazelRoot/execroot/bazel_workspace/bazel-out';
- bazelBinPath = '$bazelRoot/execroot/bazel_workspace/bazel-out/bin';
- bazelGenfilesPath =
- '$bazelRoot/execroot/bazel_workspace/bazel-out/genfiles';
+ bazelOrBlazeOutPath =
+ '$bazelRoot/execroot/bazel_or_blaze_workspace/bazel_or_blaze-out';
+ bazelOrBlazeBinPath =
+ '$bazelRoot/execroot/bazel_or_blaze_workspace/bazel_or_blaze-out/bin';
+ bazelOrBlazeGenfilesPath =
+ '$bazelRoot/execroot/bazel_or_blaze_workspace/bazel_or_blaze-out/genfiles';
- Directory(inTmpDir(bazelOutPath)).createSync(recursive: true);
- Directory(inTmpDir(bazelBinPath)).createSync(recursive: true);
- Directory(inTmpDir(bazelGenfilesPath)).createSync(recursive: true);
-
- Link(inWorkspace('bazel-out')).createSync(bazelOutPath);
- Link(inWorkspace('bazel-bin')).createSync(bazelBinPath);
- Link(inWorkspace('bazel-genfiles')).createSync(bazelGenfilesPath);
+ Directory(inTmpDir(bazelOrBlazeOutPath)).createSync(recursive: true);
+ Directory(inTmpDir(bazelOrBlazeBinPath)).createSync(recursive: true);
+ Directory(inTmpDir(bazelOrBlazeGenfilesPath)).createSync(recursive: true);
commandLogPath = inTmpDir('$bazelRoot/command.log');
}
@@ -91,6 +89,17 @@
// not run from a snapshot.
@TestTimeout(Timeout.factor(2))
Future<void> test_bazelChanges() async {
+ await testChangesImpl('bazel');
+ }
+
+ // Add a bit more time -- the isolate take a while to start when the test is
+ // not run from a snapshot.
+ @TestTimeout(Timeout.factor(2))
+ Future<void> test_blazeChanges() async {
+ await testChangesImpl('blaze');
+ }
+
+ Future<void> testChangesImpl(String prefix) async {
var testFile = inWorkspace('${sourceDirectory.path}/lib/test.dart');
var errors = <AnalysisError>[];
@@ -126,8 +135,9 @@
await resetCompleterAndErrors();
var generatedFilePath = inWorkspace(
- '$bazelGenfilesPath/third_party/dart/project/lib/generated.dart');
+ '$bazelOrBlazeGenfilesPath/third_party/dart/project/lib/generated.dart');
writeFile(generatedFilePath, 'my_fun() {}');
+ _createSymlinks(prefix);
writeFile(commandLogPath, 'Build completed successfully');
await processedNotification.future;
@@ -145,6 +155,7 @@
// Now delete the file completely.
await resetCompleterAndErrors();
File(generatedFilePath).deleteSync();
+ _deleteSymlinks(prefix);
writeFile(commandLogPath, 'Build did NOT complete successfully');
await processedNotification.future;
@@ -153,9 +164,22 @@
// And finally re-add the correct file -- errors should go away once again.
await resetCompleterAndErrors();
writeFile(generatedFilePath, 'my_fun() {}');
+ _createSymlinks(prefix);
writeFile(commandLogPath, 'Build completed successfully');
await processedNotification.future;
expect(errors, isEmpty);
}
+
+ void _createSymlinks(String prefix) {
+ Link(inWorkspace('$prefix-out')).createSync(bazelOrBlazeOutPath);
+ Link(inWorkspace('$prefix-bin')).createSync(bazelOrBlazeBinPath);
+ Link(inWorkspace('$prefix-genfiles')).createSync(bazelOrBlazeGenfilesPath);
+ }
+
+ void _deleteSymlinks(String prefix) {
+ Link(inWorkspace('$prefix-out')).deleteSync();
+ Link(inWorkspace('$prefix-bin')).deleteSync();
+ Link(inWorkspace('$prefix-genfiles')).deleteSync();
+ }
}
diff --git a/pkg/analyzer/lib/src/workspace/bazel_watcher.dart b/pkg/analyzer/lib/src/workspace/bazel_watcher.dart
index 50ceb0c..05ce4a6 100644
--- a/pkg/analyzer/lib/src/workspace/bazel_watcher.dart
+++ b/pkg/analyzer/lib/src/workspace/bazel_watcher.dart
@@ -110,10 +110,21 @@
/// exist.
_TimestampAndLength? _pollOne(String path) {
try {
- var file = _provider.getFile(path);
- var timestamp = file.modificationStamp;
- var length = file.lengthSync;
- return _TimestampAndLength(timestamp, length);
+ // This might seem a bit convoluted but is necessary to deal with a
+ // symlink to a directory (e.g., `bazel-bin`).
+ var resource = _provider.getResource(
+ _provider.getResource(path).resolveSymbolicLinksSync().path);
+ if (resource is File) {
+ var timestamp = resource.modificationStamp;
+ var length = resource.lengthSync;
+ return _TimestampAndLength(timestamp, length);
+ } else if (resource is Folder) {
+ // `ResourceProvider` doesn't currently support getting timestamps of a
+ // folder, so we use a dummy value here. But it's still useful: this
+ // will correctly generate `ADD` or `REMOVE` events (we'll be just
+ // unable to generate any `CHANGE` events).
+ return _TimestampAndLength(0, 0);
+ }
} on FileSystemException catch (_) {
// File doesn't exist, so return null.
return null;
diff --git a/pkg/analyzer/test/src/workspace/bazel_watcher_test.dart b/pkg/analyzer/test/src/workspace/bazel_watcher_test.dart
index 16df3e4..84faee8 100644
--- a/pkg/analyzer/test/src/workspace/bazel_watcher_test.dart
+++ b/pkg/analyzer/test/src/workspace/bazel_watcher_test.dart
@@ -233,6 +233,47 @@
recPort.close();
}
+ void test_bazelFileWatcherWithFolder() async {
+ _addResources([
+ '/workspace/WORKSPACE',
+ ]);
+
+ // The `_addResources`/`_deleteResources` functions recognize a folder by a
+ // trailing `/`, but everywhere else we need to use normalized paths.
+ var addFolder = (path) => _addResources(['$path/']);
+ var deleteFolder = (path) => _deleteResources(['$path/']);
+
+ var candidates = [
+ convertPath('/workspace/bazel-out'),
+ convertPath('/workspace/blaze-out'),
+ ];
+ var watcher = BazelFilePoller(resourceProvider, candidates);
+
+ // First do some tests with the first candidate path.
+ addFolder(candidates[0]);
+ var event = watcher.poll()!;
+
+ expect(event.type, ChangeType.ADD);
+ expect(event.path, candidates[0]);
+
+ deleteFolder(candidates[0]);
+ event = watcher.poll()!;
+
+ expect(event.type, ChangeType.REMOVE);
+ expect(event.path, candidates[0]);
+
+ // Now check that if we add the *second* candidate, we'll get the
+ // notification for it.
+ addFolder(candidates[1]);
+ event = watcher.poll()!;
+
+ expect(event.type, ChangeType.ADD);
+ expect(event.path, candidates[1]);
+
+ // Next poll should be `null` since there were no changes.
+ expect(watcher.poll(), isNull);
+ }
+
/// Create new files and directories from [paths].
void _addResources(List<String> paths) {
for (String path in paths) {
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]
diff --git a/tools/VERSION b/tools/VERSION
index 5eccd6f..5b7eae7 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 73
+PRERELEASE 74
PRERELEASE_PATCH 0
\ No newline at end of file