Version 2.17.0-193.0.dev

Merge commit '23b1f38981f70f8dd44d6a7aafa3824401b5ae3c' into 'dev'
diff --git a/BUILD.gn b/BUILD.gn
index ad09ed8..6295280 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -39,6 +39,7 @@
     # Fuchsia has run_vm_tests marked testonly.
     testonly = true
   }
+
   deps = [
     "runtime/bin:dart",
     "runtime/bin:entrypoints_verification_test",
@@ -59,6 +60,16 @@
     ]
   }
 
+  # We do not support AOT on ia32 and should therefore cannot provide native
+  # snapshot tooling.
+  if (dart_target_arch != "ia32") {
+    if (dart_runtime_mode == "release") {
+      deps += [ "runtime/bin:analyze_snapshot_product" ]
+    } else {
+      deps += [ "runtime/bin:analyze_snapshot" ]
+    }
+  }
+
   if (is_linux || is_android) {
     deps += [ "runtime/bin:abstract_socket_test" ]
   }
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 6035330..620fd67 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -2807,16 +2807,6 @@
         r"""Try removing the factory constructor declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeEnumEntryWithTypeArgumentsWithoutArguments =
-    messageEnumEntryWithTypeArgumentsWithoutArguments;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageEnumEntryWithTypeArgumentsWithoutArguments =
-    const MessageCode("EnumEntryWithTypeArgumentsWithoutArguments",
-        problemMessage:
-            r"""Missing arguments in enum constructor invocation.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeEnumFactoryRedirectsToConstructor =
     messageEnumFactoryRedirectsToConstructor;
 
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 ff593a0..01bfc12 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -2151,10 +2151,35 @@
     Token beginToken = token;
     token = parseMetadataStar(token);
     token = ensureIdentifier(token, IdentifierContext.enumValueDeclaration);
-    token = parseConstructorReference(token, ConstructorReferenceContext.Const,
-        /* typeArg = */ null, /* isImplicitTypeName = */ true);
+    bool hasTypeArgumentsOrDot = false;
+    {
+      // This is almost a verbatim copy of [parseConstructorReference] inserted
+      // to provide better recovery.
+      Token start = token;
+      listener.handleNoTypeNameInConstructorReference(token.next!);
+      listener.beginConstructorReference(start);
+      TypeParamOrArgInfo typeArg = computeTypeParamOrArg(token);
+      if (typeArg != noTypeParamOrArg) {
+        hasTypeArgumentsOrDot = true;
+      }
+      token = typeArg.parseArguments(token, this);
+      Token? period = null;
+      if (optional('.', token.next!)) {
+        hasTypeArgumentsOrDot = true;
+        period = token.next!;
+        token = ensureIdentifier(
+            period,
+            IdentifierContext
+                .constructorReferenceContinuationAfterTypeArguments);
+      } else {
+        listener.handleNoConstructorReferenceContinuationAfterTypeArguments(
+            token.next!);
+      }
+      listener.endConstructorReference(
+          start, period, token.next!, ConstructorReferenceContext.Const);
+    }
     Token next = token.next!;
-    if (optional('(', next) || optional('<', next)) {
+    if (optional('(', next) || hasTypeArgumentsOrDot) {
       token = parseConstructorInvocationArguments(token);
     } else {
       listener.handleNoArguments(token);
@@ -4638,19 +4663,14 @@
 
   Token parseConstructorReference(
       Token token, ConstructorReferenceContext constructorReferenceContext,
-      [TypeParamOrArgInfo? typeArg, bool isImplicitTypeName = false]) {
+      [TypeParamOrArgInfo? typeArg]) {
+    // Note that there's an almost verbatim copy in [parseEnumElement] so
+    // any change here should be added there too.
     Token start;
-    if (isImplicitTypeName) {
-      listener.handleNoTypeNameInConstructorReference(token.next!);
-      start = token;
-    } else {
-      start = ensureIdentifier(token, IdentifierContext.constructorReference);
-    }
+    start = ensureIdentifier(token, IdentifierContext.constructorReference);
     listener.beginConstructorReference(start);
-    if (!isImplicitTypeName) {
-      token = parseQualifiedRestOpt(
-          start, IdentifierContext.constructorReferenceContinuation);
-    }
+    token = parseQualifiedRestOpt(
+        start, IdentifierContext.constructorReferenceContinuation);
     typeArg ??= computeTypeParamOrArg(token);
     token = typeArg.parseArguments(token, this);
     Token? period = null;
diff --git a/pkg/analyzer/test/src/fasta/ast_builder_test.dart b/pkg/analyzer/test/src/fasta/ast_builder_test.dart
index 059b211..82198f5 100644
--- a/pkg/analyzer/test/src/fasta/ast_builder_test.dart
+++ b/pkg/analyzer/test/src/fasta/ast_builder_test.dart
@@ -78,6 +78,7 @@
 ''');
     parseResult.assertErrors([
       error(ParserErrorCode.MISSING_IDENTIFIER, 14, 1),
+      error(ParserErrorCode.EXPECTED_TOKEN, 14, 1),
     ]);
 
     var node = parseResult.findNode.enumConstantDeclaration('v.');
@@ -102,7 +103,9 @@
   v.named;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertErrors([
+      error(ParserErrorCode.EXPECTED_TOKEN, 13, 5),
+    ]);
 
     var node = parseResult.findNode.enumConstantDeclaration('v.');
     assertParsedNodeText(node, r'''
@@ -127,6 +130,7 @@
 }
 ''');
     parseResult.assertErrors([
+      error(ParserErrorCode.EXPECTED_TOKEN, 13, 1),
       error(ParserErrorCode.MISSING_IDENTIFIER, 13, 1),
     ]);
 
@@ -153,9 +157,8 @@
 }
 ''');
     parseResult.assertErrors([
-      error(ParserErrorCode.ENUM_CONSTANT_WITH_TYPE_ARGUMENTS_WITHOUT_ARGUMENTS,
-          12, 5),
       error(ParserErrorCode.MISSING_IDENTIFIER, 19, 1),
+      error(ParserErrorCode.EXPECTED_TOKEN, 19, 1),
     ]);
 
     var node = parseResult.findNode.enumConstantDeclaration('v<int>.');
@@ -181,7 +184,6 @@
 ''');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/48380')
   void test_enum_constant_name_typeArguments_dot_semicolon() {
     var parseResult = parseStringWithErrors(r'''
 enum E {
@@ -189,9 +191,8 @@
 }
 ''');
     parseResult.assertErrors([
-      error(ParserErrorCode.ENUM_CONSTANT_WITH_TYPE_ARGUMENTS_WITHOUT_ARGUMENTS,
-          12, 5),
       error(ParserErrorCode.MISSING_IDENTIFIER, 18, 1),
+      error(ParserErrorCode.EXPECTED_TOKEN, 18, 1),
     ]);
 
     var node = parseResult.findNode.enumConstantDeclaration('v<int>');
@@ -199,23 +200,23 @@
         node,
         r'''
 EnumConstantDeclaration
+  name: SimpleIdentifier
+    token: v
   arguments: EnumConstantArguments
-    argumentList: ArgumentList
-      leftParenthesis: ( <synthetic>
-      rightParenthesis: ) <synthetic>
-    constructorSelector: ConstructorSelector
-      name: SimpleIdentifier
-        token: <empty> <synthetic>
-      period: .
     typeArguments: TypeArgumentList
+      leftBracket: <
       arguments
         NamedType
           name: SimpleIdentifier
             token: int
-      leftBracket: <
       rightBracket: >
-  name: SimpleIdentifier
-    token: v
+    constructorSelector: ConstructorSelector
+      period: .
+      name: SimpleIdentifier
+        token: <empty> <synthetic>
+    argumentList: ArgumentList
+      leftParenthesis: ( <synthetic>
+      rightParenthesis: ) <synthetic>
 ''',
         withCheckingLinking: true);
   }
@@ -227,8 +228,7 @@
 }
 ''');
     parseResult.assertErrors([
-      error(ParserErrorCode.ENUM_CONSTANT_WITH_TYPE_ARGUMENTS_WITHOUT_ARGUMENTS,
-          15, 5),
+      error(ParserErrorCode.EXPECTED_TOKEN, 19, 1),
     ]);
 
     var node = parseResult.findNode.enumConstantDeclaration('v<int>');
diff --git a/pkg/async_helper/lib/async_helper.dart b/pkg/async_helper/lib/async_helper.dart
index d4d536f..6dd1b87 100644
--- a/pkg/async_helper/lib/async_helper.dart
+++ b/pkg/async_helper/lib/async_helper.dart
@@ -105,31 +105,38 @@
 /// failed test expectation, that error cannot be caught and accepted.
 Future<T> asyncExpectThrows<T extends Object>(Future<void> result,
     [String reason = ""]) {
-  // Handle null being passed in from legacy code while also avoiding producing
-  // an unnecessary null check warning here.
-  if ((reason as dynamic) == null) reason = "";
-
-  var type = "";
-  if (T != dynamic && T != Object) type = "<$T>";
-  var header = "asyncExpectThrows$type(${reason}):";
-
-  if ((result as dynamic) == null) {
-    Expect.testError("$header result Future must not be null.");
+  // Delay computing the header text until the test has failed.
+  // The header computation uses complicated language features,
+  // and language tests should avoid doing complicated things
+  // until after the actual test has had a chance to succeed.
+  String header() {
+    // Handle null being passed in from legacy code
+    // while also avoiding producing an unnecessary null check warning here.
+    if ((reason as dynamic) == null) reason = "";
+    // Only include the type in he message if it's not a top-type.
+    var type = Object() is! T ? "<$T>" : "";
+    return "asyncExpectThrows$type($reason):";
   }
+
+  // Unsound null-safety check.
+  if ((result as dynamic) == null) {
+    Expect.testError("${header()} result Future must not be null.");
+  }
+
   // TODO(rnystrom): It might useful to validate that T is not bound to
   // ExpectException since that won't work.
 
   asyncStart();
   return result.then<T>((_) {
-    throw ExpectException("$header Did not throw.");
+    throw ExpectException("${header()} Did not throw.");
   }, onError: (error, stack) {
-    // A test failure doesn't count as throwing.
+    // A test failure doesn't count as throwing. Rethrow it.
     if (error is ExpectException) throw error;
 
     if (error is! T) {
       // Throws something unexpected.
       throw ExpectException(
-          "$header Unexpected '${Error.safeToString(error)}'\n$stack");
+          "${header()} Unexpected '${Error.safeToString(error)}'\n$stack");
     }
 
     asyncEnd();
diff --git a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
index 7248daf..a177232 100644
--- a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
@@ -29,7 +29,6 @@
         LocatedMessage,
         Severity,
         messageEnumContainsValuesDeclaration,
-        messageEnumEntryWithTypeArgumentsWithoutArguments,
         messageEnumNonConstConstructor,
         messageNoUnnamedConstructorInObject,
         noLength,
@@ -609,13 +608,6 @@
     if (enumConstantInfos != null) {
       for (EnumConstantInfo? enumConstantInfo in enumConstantInfos!) {
         if (enumConstantInfo != null) {
-          if (enumConstantInfo.argumentsBeginToken == null &&
-              enumConstantInfo.constructorReferenceBuilder?.typeArguments !=
-                  null) {
-            addProblem(messageEnumEntryWithTypeArgumentsWithoutArguments,
-                enumConstantInfo.charOffset, noLength);
-          }
-
           String constant = enumConstantInfo.name;
           Builder declaration = firstMemberNamed(constant)!;
           SourceFieldBuilder field;
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index a4710b5..ba85304 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -223,8 +223,6 @@
 EnumDeclaresConstFactory/example: Fail
 EnumDeclaresFactory/analyzerCode: Fail
 EnumDeclaresFactory/example: Fail
-EnumEntryWithTypeArgumentsWithoutArguments/analyzerCode: Fail
-EnumEntryWithTypeArgumentsWithoutArguments/example: Fail
 EnumFactoryRedirectsToConstructor/analyzerCode: Fail
 EnumFactoryRedirectsToConstructor/example: Fail
 EnumImplementerContainsValuesDeclaration/analyzerCode: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 21e529c..b8822fa 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -5480,9 +5480,6 @@
 EnumSupertypeOfNonAbstractClass:
   problemMessage: "Non-abstract class '#name' has 'Enum' as a superinterface."
 
-EnumEntryWithTypeArgumentsWithoutArguments:
-  problemMessage: "Missing arguments in enum constructor invocation."
-
 EnumNonConstConstructor:
   problemMessage: "Generative enum constructors must be marked as 'const'."
 
diff --git a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.intertwined.expect b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.intertwined.expect
index 7d106ee..6ea8819 100644
--- a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.intertwined.expect
@@ -43,19 +43,18 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(one, enumValueDeclaration)
-          parseConstructorReference(one, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(<)
-            listener: beginConstructorReference(one)
-            listener: beginTypeArguments(<)
-            listener: handleIdentifier(int, typeReference)
-            listener: handleNoTypeArguments(,)
-            listener: handleType(int, null)
-            listener: handleIdentifier(String, typeReference)
-            listener: handleNoTypeArguments(>)
-            listener: handleType(String, null)
-            listener: endTypeArguments(2, <, >)
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(()
-            listener: endConstructorReference(one, null, (, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(one)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(,)
+          listener: handleType(int, null)
+          listener: handleIdentifier(String, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(String, null)
+          listener: endTypeArguments(2, <, >)
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(()
+          listener: endConstructorReference(one, null, (, ConstructorReferenceContext.Const)
           parseConstructorInvocationArguments(>)
             parseArgumentsRest(()
               listener: beginArguments(()
@@ -67,19 +66,18 @@
             listener: endMetadataStar(0)
           ensureIdentifier(,, enumValueDeclaration)
             listener: handleIdentifier(two, enumValueDeclaration)
-          parseConstructorReference(two, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(<)
-            listener: beginConstructorReference(two)
-            listener: beginTypeArguments(<)
-            listener: handleIdentifier(double, typeReference)
-            listener: handleNoTypeArguments(,)
-            listener: handleType(double, null)
-            listener: handleIdentifier(num, typeReference)
-            listener: handleNoTypeArguments(>)
-            listener: handleType(num, null)
-            listener: endTypeArguments(2, <, >)
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(()
-            listener: endConstructorReference(two, null, (, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(two)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(double, typeReference)
+          listener: handleNoTypeArguments(,)
+          listener: handleType(double, null)
+          listener: handleIdentifier(num, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(num, null)
+          listener: endTypeArguments(2, <, >)
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(()
+          listener: endConstructorReference(two, null, (, ConstructorReferenceContext.Const)
           parseConstructorInvocationArguments(>)
             parseArgumentsRest(()
               listener: beginArguments(()
@@ -91,20 +89,19 @@
             listener: endMetadataStar(0)
           ensureIdentifier(,, enumValueDeclaration)
             listener: handleIdentifier(three, enumValueDeclaration)
-          parseConstructorReference(three, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(<)
-            listener: beginConstructorReference(three)
-            listener: beginTypeArguments(<)
-            listener: handleIdentifier(int, typeReference)
-            listener: handleNoTypeArguments(,)
-            listener: handleType(int, null)
-            listener: handleIdentifier(int, typeReference)
-            listener: handleNoTypeArguments(>)
-            listener: handleType(int, null)
-            listener: endTypeArguments(2, <, >)
-            ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
-              listener: handleIdentifier(named, constructorReferenceContinuationAfterTypeArguments)
-            listener: endConstructorReference(three, ., (, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(three)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(,)
+          listener: handleType(int, null)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(int, null)
+          listener: endTypeArguments(2, <, >)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            listener: handleIdentifier(named, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(three, ., (, ConstructorReferenceContext.Const)
           parseConstructorInvocationArguments(named)
             parseArgumentsRest(()
               listener: beginArguments(()
diff --git a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_06.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_06.dart.intertwined.expect
index c02d432..050a0b9 100644
--- a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_06.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_06.dart.intertwined.expect
@@ -40,7 +40,7 @@
                             parseNewExpression({)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(C, constructorReference)
                                 listener: beginConstructorReference(C)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.intertwined.expect
index fd5d902..ef38c2b 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.intertwined.expect
@@ -200,7 +200,7 @@
                             parseNewExpression(=>)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(A, constructorReference)
                                 listener: beginConstructorReference(A)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect
index 41f0d2a..3a10de3 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect
@@ -190,7 +190,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo', false)
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo')
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
@@ -246,7 +246,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg', false)
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg')
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.intertwined.expect
index 0e6be26..9980e62 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.intertwined.expect
@@ -177,7 +177,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo', false)
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo')
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
@@ -226,7 +226,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg', false)
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg')
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.intertwined.expect
index 888082a..7756662 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.intertwined.expect
@@ -180,7 +180,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo', false)
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo')
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
@@ -230,7 +230,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg', false)
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg')
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect
index 6d378b0..2157ccf 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect
@@ -193,7 +193,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo', false)
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo')
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
@@ -250,7 +250,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg', false)
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg')
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.intertwined.expect
index 8285289..c74ab8a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.intertwined.expect
@@ -168,7 +168,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo', false)
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo')
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
@@ -217,7 +217,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg', false)
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg')
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.intertwined.expect
index 77797c9..d7e246f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.intertwined.expect
@@ -171,7 +171,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo', false)
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo')
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
@@ -221,7 +221,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg', false)
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg')
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48371.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48371.dart.intertwined.expect
index 98d94b2..97bd6bb 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_48371.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48371.dart.intertwined.expect
@@ -28,12 +28,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
@@ -68,12 +67,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
@@ -110,12 +108,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
@@ -157,12 +154,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
@@ -194,12 +190,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
@@ -231,12 +226,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
@@ -273,12 +267,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
@@ -316,12 +309,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
@@ -356,12 +348,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
@@ -399,12 +390,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
@@ -441,12 +431,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
@@ -491,12 +480,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
@@ -541,12 +529,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
@@ -604,12 +591,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
@@ -666,12 +652,11 @@
             listener: endMetadataStar(0)
           ensureIdentifier({, enumValueDeclaration)
             listener: handleIdentifier(v, enumValueDeclaration)
-          parseConstructorReference(v, ConstructorReferenceContext.Const, null, true)
-            listener: handleNoTypeNameInConstructorReference(})
-            listener: beginConstructorReference(v)
-            listener: handleNoTypeArguments(})
-            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
-            listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
+          listener: handleNoTypeNameInConstructorReference(})
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(})
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(})
+          listener: endConstructorReference(v, null, }, ConstructorReferenceContext.Const)
           listener: handleNoArguments(v)
           listener: handleEnumElement({)
         listener: handleEnumElements(}, 1)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart
new file mode 100644
index 0000000..648f203
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart
@@ -0,0 +1,6 @@
+enum E<F> {
+  v<int>./*about to write foo()*/;
+
+  const E();
+  const E.foo();
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart.expect
new file mode 100644
index 0000000..d03460d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart.expect
@@ -0,0 +1,79 @@
+Problems reported:
+
+parser/error_recovery/issue_48380_1:2:34: Expected an identifier, but got ';'.
+  v<int>./*about to write foo()*/;
+                                 ^
+
+parser/error_recovery/issue_48380_1:2:34: Expected '(' after this.
+  v<int>./*about to write foo()*/;
+                                 ^
+
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      beginTypeVariables(<)
+        beginMetadataStar(F)
+        endMetadataStar(0)
+        handleIdentifier(F, typeVariableDeclaration)
+        beginTypeVariable(F)
+          handleTypeVariablesDefined(F, 1)
+          handleNoType(F)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(v)
+      endMetadataStar(0)
+      handleIdentifier(v, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(v)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(1, <, >)
+        handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ';'., Try inserting an identifier before ';'., {lexeme: ;}], ;, ;)
+        handleIdentifier(, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(v, ., ;, ConstructorReferenceContext.Const)
+      handleRecoverableError(Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}], ;, ;)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      handleEnumElements(;, 1)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(foo, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+    endEnum(enum, {, 2)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart.intertwined.expect
new file mode 100644
index 0000000..d9be036
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart.intertwined.expect
@@ -0,0 +1,125 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, null, Instance of 'DirectiveContext')
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: beginTypeVariables(<)
+          listener: beginMetadataStar(F)
+          listener: endMetadataStar(0)
+          listener: handleIdentifier(F, typeVariableDeclaration)
+          listener: beginTypeVariable(F)
+          listener: handleTypeVariablesDefined(F, 1)
+          listener: handleNoType(F)
+          listener: endTypeVariable(>, 0, null, null)
+          listener: endTypeVariables(<, >)
+          parseEnumWithClauseOpt(>)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(>)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(v)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(v, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(v)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(int, null)
+          listener: endTypeArguments(1, <, >)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            insertSyntheticIdentifier(., constructorReferenceContinuationAfterTypeArguments, message: Message[ExpectedIdentifier, Expected an identifier, but got ';'., Try inserting an identifier before ';'., {lexeme: ;}], messageOnToken: null)
+              reportRecoverableError(;, Message[ExpectedIdentifier, Expected an identifier, but got ';'., Try inserting an identifier before ';'., {lexeme: ;}])
+                listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ';'., Try inserting an identifier before ';'., {lexeme: ;}], ;, ;)
+              rewriter()
+            listener: handleIdentifier(, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(v, ., ;, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments()
+            reportRecoverableError(, Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}])
+              listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}], ;, ;)
+            rewriter()
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        listener: handleEnumElements(;, 1)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+            parseMethodTypeVar(E)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(E, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(E, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+              parseQualifiedRest(E, methodDeclarationContinuation)
+                ensureIdentifier(., methodDeclarationContinuation)
+                  listener: handleIdentifier(foo, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(foo)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(foo, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(foo, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 2)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart.parser.expect
new file mode 100644
index 0000000..b09b0bb
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart.parser.expect
@@ -0,0 +1,17 @@
+NOTICE: Stream was rewritten by parser!
+
+enum E<F> {
+v<int>. *synthetic*();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken] [SyntheticStringToken]([SyntheticBeginToken])[SyntheticToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart.scanner.expect
new file mode 100644
index 0000000..077fb17
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.dart.scanner.expect
@@ -0,0 +1,15 @@
+enum E<F> {
+v<int>. ;
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken] ;[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.equivalence_info b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.equivalence_info
new file mode 100644
index 0000000..65d02ba
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1.equivalence_info
@@ -0,0 +1,7 @@
+files:
+  - issue_48380_1.dart
+  - issue_48380_1_ok.dart
+filters:
+  - ignoreListenerArguments
+ignored:
+  - handleRecoverableError
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart
new file mode 100644
index 0000000..f7645f0
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart
@@ -0,0 +1,7 @@
+enum E<F> {
+  v1<int>./*about to write foo()*/,
+  v2<int>.foo();
+
+  const E();
+  const E.foo();
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart.expect
new file mode 100644
index 0000000..a476264
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart.expect
@@ -0,0 +1,94 @@
+Problems reported:
+
+parser/error_recovery/issue_48380_1_comma:2:35: Expected an identifier, but got ','.
+  v1<int>./*about to write foo()*/,
+                                  ^
+
+parser/error_recovery/issue_48380_1_comma:2:35: Expected '(' after this.
+  v1<int>./*about to write foo()*/,
+                                  ^
+
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      beginTypeVariables(<)
+        beginMetadataStar(F)
+        endMetadataStar(0)
+        handleIdentifier(F, typeVariableDeclaration)
+        beginTypeVariable(F)
+          handleTypeVariablesDefined(F, 1)
+          handleNoType(F)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(v1)
+      endMetadataStar(0)
+      handleIdentifier(v1, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(v1)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(1, <, >)
+        handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ','., Try inserting an identifier before ','., {lexeme: ,}], ,, ,)
+        handleIdentifier(, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(v1, ., ,, ConstructorReferenceContext.Const)
+      handleRecoverableError(Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}], ,, ,)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      beginMetadataStar(v2)
+      endMetadataStar(0)
+      handleIdentifier(v2, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(v2)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(1, <, >)
+        handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(v2, ., (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement(,)
+      handleEnumElements(;, 2)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(foo, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+    endEnum(enum, {, 2)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart.intertwined.expect
new file mode 100644
index 0000000..5b66e82
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart.intertwined.expect
@@ -0,0 +1,146 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, null, Instance of 'DirectiveContext')
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: beginTypeVariables(<)
+          listener: beginMetadataStar(F)
+          listener: endMetadataStar(0)
+          listener: handleIdentifier(F, typeVariableDeclaration)
+          listener: beginTypeVariable(F)
+          listener: handleTypeVariablesDefined(F, 1)
+          listener: handleNoType(F)
+          listener: endTypeVariable(>, 0, null, null)
+          listener: endTypeVariables(<, >)
+          parseEnumWithClauseOpt(>)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(>)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(v1)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(v1, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(v1)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(int, null)
+          listener: endTypeArguments(1, <, >)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            insertSyntheticIdentifier(., constructorReferenceContinuationAfterTypeArguments, message: Message[ExpectedIdentifier, Expected an identifier, but got ','., Try inserting an identifier before ','., {lexeme: ,}], messageOnToken: null)
+              reportRecoverableError(,, Message[ExpectedIdentifier, Expected an identifier, but got ','., Try inserting an identifier before ','., {lexeme: ,}])
+                listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ','., Try inserting an identifier before ','., {lexeme: ,}], ,, ,)
+              rewriter()
+            listener: handleIdentifier(, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(v1, ., ,, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments()
+            reportRecoverableError(, Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}])
+              listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}], ,, ,)
+            rewriter()
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        parseEnumElement(,)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(v2)
+            listener: endMetadataStar(0)
+          ensureIdentifier(,, enumValueDeclaration)
+            listener: handleIdentifier(v2, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(v2)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(int, null)
+          listener: endTypeArguments(1, <, >)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            listener: handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(v2, ., (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(foo)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement(,)
+        listener: handleEnumElements(;, 2)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+            parseMethodTypeVar(E)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(E, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(E, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+              parseQualifiedRest(E, methodDeclarationContinuation)
+                ensureIdentifier(., methodDeclarationContinuation)
+                  listener: handleIdentifier(foo, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(foo)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(foo, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(foo, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 2)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart.parser.expect
new file mode 100644
index 0000000..6808052
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart.parser.expect
@@ -0,0 +1,19 @@
+NOTICE: Stream was rewritten by parser!
+
+enum E<F> {
+v1<int>. *synthetic*(),
+v2<int>.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v1[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken] [SyntheticStringToken]([SyntheticBeginToken])[SyntheticToken],[SimpleToken]
+v2[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart.scanner.expect
new file mode 100644
index 0000000..c29b1ae
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.dart.scanner.expect
@@ -0,0 +1,17 @@
+enum E<F> {
+v1<int>. ,
+v2<int>.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v1[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken] ,[SimpleToken]
+v2[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.equivalence_info b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.equivalence_info
new file mode 100644
index 0000000..d57b2dd
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma.equivalence_info
@@ -0,0 +1,7 @@
+files:
+  - issue_48380_1_comma.dart
+  - issue_48380_1_comma_ok.dart
+filters:
+  - ignoreListenerArguments
+ignored:
+  - handleRecoverableError
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart
new file mode 100644
index 0000000..091bd9d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart
@@ -0,0 +1,7 @@
+enum E<F> {
+  v1<int>.foo(),
+  v2<int>.foo();
+
+  const E();
+  const E.foo();
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart.expect
new file mode 100644
index 0000000..02ff85c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart.expect
@@ -0,0 +1,82 @@
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      beginTypeVariables(<)
+        beginMetadataStar(F)
+        endMetadataStar(0)
+        handleIdentifier(F, typeVariableDeclaration)
+        beginTypeVariable(F)
+          handleTypeVariablesDefined(F, 1)
+          handleNoType(F)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(v1)
+      endMetadataStar(0)
+      handleIdentifier(v1, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(v1)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(1, <, >)
+        handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(v1, ., (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      beginMetadataStar(v2)
+      endMetadataStar(0)
+      handleIdentifier(v2, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(v2)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(1, <, >)
+        handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(v2, ., (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement(,)
+      handleEnumElements(;, 2)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(foo, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+    endEnum(enum, {, 2)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart.intertwined.expect
new file mode 100644
index 0000000..2b675de
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart.intertwined.expect
@@ -0,0 +1,139 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, null, Instance of 'DirectiveContext')
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: beginTypeVariables(<)
+          listener: beginMetadataStar(F)
+          listener: endMetadataStar(0)
+          listener: handleIdentifier(F, typeVariableDeclaration)
+          listener: beginTypeVariable(F)
+          listener: handleTypeVariablesDefined(F, 1)
+          listener: handleNoType(F)
+          listener: endTypeVariable(>, 0, null, null)
+          listener: endTypeVariables(<, >)
+          parseEnumWithClauseOpt(>)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(>)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(v1)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(v1, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(v1)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(int, null)
+          listener: endTypeArguments(1, <, >)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            listener: handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(v1, ., (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(foo)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        parseEnumElement(,)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(v2)
+            listener: endMetadataStar(0)
+          ensureIdentifier(,, enumValueDeclaration)
+            listener: handleIdentifier(v2, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(v2)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(int, null)
+          listener: endTypeArguments(1, <, >)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            listener: handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(v2, ., (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(foo)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement(,)
+        listener: handleEnumElements(;, 2)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+            parseMethodTypeVar(E)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(E, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(E, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+              parseQualifiedRest(E, methodDeclarationContinuation)
+                ensureIdentifier(., methodDeclarationContinuation)
+                  listener: handleIdentifier(foo, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(foo)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(foo, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(foo, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 2)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart.parser.expect
new file mode 100644
index 0000000..587bf4c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart.parser.expect
@@ -0,0 +1,17 @@
+enum E<F> {
+v1<int>.foo(),
+v2<int>.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v1[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken],[SimpleToken]
+v2[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart.scanner.expect
new file mode 100644
index 0000000..587bf4c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_comma_ok.dart.scanner.expect
@@ -0,0 +1,17 @@
+enum E<F> {
+v1<int>.foo(),
+v2<int>.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v1[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken],[SimpleToken]
+v2[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart
new file mode 100644
index 0000000..f99ff5a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart
@@ -0,0 +1,6 @@
+enum E<F> {
+  v<int>.foo();
+
+  const E();
+  const E.foo();
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart.expect
new file mode 100644
index 0000000..f07eb68
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart.expect
@@ -0,0 +1,67 @@
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      beginTypeVariables(<)
+        beginMetadataStar(F)
+        endMetadataStar(0)
+        handleIdentifier(F, typeVariableDeclaration)
+        beginTypeVariable(F)
+          handleTypeVariablesDefined(F, 1)
+          handleNoType(F)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(v)
+      endMetadataStar(0)
+      handleIdentifier(v, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(v)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(1, <, >)
+        handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      handleEnumElements(;, 1)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(foo, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+    endEnum(enum, {, 2)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart.intertwined.expect
new file mode 100644
index 0000000..5140820
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart.intertwined.expect
@@ -0,0 +1,118 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, null, Instance of 'DirectiveContext')
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: beginTypeVariables(<)
+          listener: beginMetadataStar(F)
+          listener: endMetadataStar(0)
+          listener: handleIdentifier(F, typeVariableDeclaration)
+          listener: beginTypeVariable(F)
+          listener: handleTypeVariablesDefined(F, 1)
+          listener: handleNoType(F)
+          listener: endTypeVariable(>, 0, null, null)
+          listener: endTypeVariables(<, >)
+          parseEnumWithClauseOpt(>)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(>)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(v)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(v, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(v)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(int, null)
+          listener: endTypeArguments(1, <, >)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            listener: handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(foo)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        listener: handleEnumElements(;, 1)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+            parseMethodTypeVar(E)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(E, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(E, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+              parseQualifiedRest(E, methodDeclarationContinuation)
+                ensureIdentifier(., methodDeclarationContinuation)
+                  listener: handleIdentifier(foo, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(foo)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(foo, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(foo, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 2)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart.parser.expect
new file mode 100644
index 0000000..7c3acbb
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart.parser.expect
@@ -0,0 +1,15 @@
+enum E<F> {
+v<int>.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart.scanner.expect
new file mode 100644
index 0000000..7c3acbb
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_1_ok.dart.scanner.expect
@@ -0,0 +1,15 @@
+enum E<F> {
+v<int>.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart
new file mode 100644
index 0000000..e5e57c1
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart
@@ -0,0 +1,6 @@
+enum E<F> {
+  v<int>/*about to write () or .foo()*/;
+
+  const E();
+  const E.foo();
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart.expect
new file mode 100644
index 0000000..3059da9
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart.expect
@@ -0,0 +1,74 @@
+Problems reported:
+
+parser/error_recovery/issue_48380_2:2:8: Expected '(' after this.
+  v<int>/*about to write () or .foo()*/;
+       ^
+
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      beginTypeVariables(<)
+        beginMetadataStar(F)
+        endMetadataStar(0)
+        handleIdentifier(F, typeVariableDeclaration)
+        beginTypeVariable(F)
+          handleTypeVariablesDefined(F, 1)
+          handleNoType(F)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(v)
+      endMetadataStar(0)
+      handleIdentifier(v, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(v)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(1, <, >)
+        handleNoConstructorReferenceContinuationAfterTypeArguments(;)
+      endConstructorReference(v, null, ;, ConstructorReferenceContext.Const)
+      handleRecoverableError(Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}], >, >)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      handleEnumElements(;, 1)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(foo, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+    endEnum(enum, {, 2)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart.intertwined.expect
new file mode 100644
index 0000000..aa66271
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart.intertwined.expect
@@ -0,0 +1,120 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, null, Instance of 'DirectiveContext')
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: beginTypeVariables(<)
+          listener: beginMetadataStar(F)
+          listener: endMetadataStar(0)
+          listener: handleIdentifier(F, typeVariableDeclaration)
+          listener: beginTypeVariable(F)
+          listener: handleTypeVariablesDefined(F, 1)
+          listener: handleNoType(F)
+          listener: endTypeVariable(>, 0, null, null)
+          listener: endTypeVariables(<, >)
+          parseEnumWithClauseOpt(>)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(>)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(v)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(v, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(v)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(int, null)
+          listener: endTypeArguments(1, <, >)
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(;)
+          listener: endConstructorReference(v, null, ;, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(>)
+            reportRecoverableError(>, Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}])
+              listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}], >, >)
+            rewriter()
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        listener: handleEnumElements(;, 1)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+            parseMethodTypeVar(E)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(E, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(E, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+              parseQualifiedRest(E, methodDeclarationContinuation)
+                ensureIdentifier(., methodDeclarationContinuation)
+                  listener: handleIdentifier(foo, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(foo)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(foo, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(foo, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 2)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart.parser.expect
new file mode 100644
index 0000000..84679d8
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart.parser.expect
@@ -0,0 +1,17 @@
+NOTICE: Stream was rewritten by parser!
+
+enum E<F> {
+v<int> ();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] ([SyntheticBeginToken])[SyntheticToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart.scanner.expect
new file mode 100644
index 0000000..4e2d701
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.dart.scanner.expect
@@ -0,0 +1,15 @@
+enum E<F> {
+v<int> ;
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] ;[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.equivalence_info b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.equivalence_info
new file mode 100644
index 0000000..0e5ddd3
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2.equivalence_info
@@ -0,0 +1,7 @@
+files:
+  - issue_48380_2.dart
+  - issue_48380_2_ok.dart
+filters:
+  - ignoreListenerArguments
+ignored:
+  - handleRecoverableError
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart
new file mode 100644
index 0000000..cd77dcf
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart
@@ -0,0 +1,7 @@
+enum E<F> {
+  v<int>/*about to write () or .foo()*/,
+  v<int>.foo();
+
+  const E();
+  const E.foo();
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart.expect
new file mode 100644
index 0000000..de6c892
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart.expect
@@ -0,0 +1,89 @@
+Problems reported:
+
+parser/error_recovery/issue_48380_2_comma:2:8: Expected '(' after this.
+  v<int>/*about to write () or .foo()*/,
+       ^
+
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      beginTypeVariables(<)
+        beginMetadataStar(F)
+        endMetadataStar(0)
+        handleIdentifier(F, typeVariableDeclaration)
+        beginTypeVariable(F)
+          handleTypeVariablesDefined(F, 1)
+          handleNoType(F)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(v)
+      endMetadataStar(0)
+      handleIdentifier(v, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(v)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(1, <, >)
+        handleNoConstructorReferenceContinuationAfterTypeArguments(,)
+      endConstructorReference(v, null, ,, ConstructorReferenceContext.Const)
+      handleRecoverableError(Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}], >, >)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      beginMetadataStar(v)
+      endMetadataStar(0)
+      handleIdentifier(v, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(v)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(1, <, >)
+        handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement(,)
+      handleEnumElements(;, 2)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(foo, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+    endEnum(enum, {, 2)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart.intertwined.expect
new file mode 100644
index 0000000..7886f23
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart.intertwined.expect
@@ -0,0 +1,141 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, null, Instance of 'DirectiveContext')
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: beginTypeVariables(<)
+          listener: beginMetadataStar(F)
+          listener: endMetadataStar(0)
+          listener: handleIdentifier(F, typeVariableDeclaration)
+          listener: beginTypeVariable(F)
+          listener: handleTypeVariablesDefined(F, 1)
+          listener: handleNoType(F)
+          listener: endTypeVariable(>, 0, null, null)
+          listener: endTypeVariables(<, >)
+          parseEnumWithClauseOpt(>)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(>)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(v)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(v, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(v)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(int, null)
+          listener: endTypeArguments(1, <, >)
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(,)
+          listener: endConstructorReference(v, null, ,, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(>)
+            reportRecoverableError(>, Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}])
+              listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}], >, >)
+            rewriter()
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        parseEnumElement(,)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(v)
+            listener: endMetadataStar(0)
+          ensureIdentifier(,, enumValueDeclaration)
+            listener: handleIdentifier(v, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(v)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(int, null)
+          listener: endTypeArguments(1, <, >)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            listener: handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(foo)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement(,)
+        listener: handleEnumElements(;, 2)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+            parseMethodTypeVar(E)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(E, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(E, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+              parseQualifiedRest(E, methodDeclarationContinuation)
+                ensureIdentifier(., methodDeclarationContinuation)
+                  listener: handleIdentifier(foo, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(foo)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(foo, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(foo, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 2)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart.parser.expect
new file mode 100644
index 0000000..dbc0185
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart.parser.expect
@@ -0,0 +1,19 @@
+NOTICE: Stream was rewritten by parser!
+
+enum E<F> {
+v<int> (),
+v<int>.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] ([SyntheticBeginToken])[SyntheticToken],[SimpleToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart.scanner.expect
new file mode 100644
index 0000000..b01cb81
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.dart.scanner.expect
@@ -0,0 +1,17 @@
+enum E<F> {
+v<int> ,
+v<int>.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken] ,[SimpleToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.equivalence_info b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.equivalence_info
new file mode 100644
index 0000000..7a6d9e1
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma.equivalence_info
@@ -0,0 +1,7 @@
+files:
+  - issue_48380_2_comma.dart
+  - issue_48380_2_comma_ok.dart
+filters:
+  - ignoreListenerArguments
+ignored:
+  - handleRecoverableError
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart
new file mode 100644
index 0000000..fa5b1ba
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart
@@ -0,0 +1,7 @@
+enum E<F> {
+  v<int>(),
+  v<int>.foo();
+
+  const E();
+  const E.foo();
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart.expect
new file mode 100644
index 0000000..04bf2ea
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart.expect
@@ -0,0 +1,82 @@
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      beginTypeVariables(<)
+        beginMetadataStar(F)
+        endMetadataStar(0)
+        handleIdentifier(F, typeVariableDeclaration)
+        beginTypeVariable(F)
+          handleTypeVariablesDefined(F, 1)
+          handleNoType(F)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(v)
+      endMetadataStar(0)
+      handleIdentifier(v, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(v)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(1, <, >)
+        handleNoConstructorReferenceContinuationAfterTypeArguments(()
+      endConstructorReference(v, null, (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      beginMetadataStar(v)
+      endMetadataStar(0)
+      handleIdentifier(v, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(v)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(1, <, >)
+        handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement(,)
+      handleEnumElements(;, 2)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(foo, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+    endEnum(enum, {, 2)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart.intertwined.expect
new file mode 100644
index 0000000..da8382e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart.intertwined.expect
@@ -0,0 +1,138 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, null, Instance of 'DirectiveContext')
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: beginTypeVariables(<)
+          listener: beginMetadataStar(F)
+          listener: endMetadataStar(0)
+          listener: handleIdentifier(F, typeVariableDeclaration)
+          listener: beginTypeVariable(F)
+          listener: handleTypeVariablesDefined(F, 1)
+          listener: handleNoType(F)
+          listener: endTypeVariable(>, 0, null, null)
+          listener: endTypeVariables(<, >)
+          parseEnumWithClauseOpt(>)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(>)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(v)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(v, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(v)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(int, null)
+          listener: endTypeArguments(1, <, >)
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(()
+          listener: endConstructorReference(v, null, (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(>)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        parseEnumElement(,)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(v)
+            listener: endMetadataStar(0)
+          ensureIdentifier(,, enumValueDeclaration)
+            listener: handleIdentifier(v, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(v)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(int, null)
+          listener: endTypeArguments(1, <, >)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            listener: handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(foo)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement(,)
+        listener: handleEnumElements(;, 2)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+            parseMethodTypeVar(E)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(E, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(E, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+              parseQualifiedRest(E, methodDeclarationContinuation)
+                ensureIdentifier(., methodDeclarationContinuation)
+                  listener: handleIdentifier(foo, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(foo)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(foo, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(foo, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 2)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart.parser.expect
new file mode 100644
index 0000000..c224e0f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart.parser.expect
@@ -0,0 +1,17 @@
+enum E<F> {
+v<int>(),
+v<int>.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken])[SimpleToken],[SimpleToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart.scanner.expect
new file mode 100644
index 0000000..c224e0f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_comma_ok.dart.scanner.expect
@@ -0,0 +1,17 @@
+enum E<F> {
+v<int>(),
+v<int>.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken])[SimpleToken],[SimpleToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart
new file mode 100644
index 0000000..99fb1cb
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart
@@ -0,0 +1,6 @@
+enum E<F> {
+  v<int>();
+
+  const E();
+  const E.foo();
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart.expect
new file mode 100644
index 0000000..682bbe8
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart.expect
@@ -0,0 +1,67 @@
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      beginTypeVariables(<)
+        beginMetadataStar(F)
+        endMetadataStar(0)
+        handleIdentifier(F, typeVariableDeclaration)
+        beginTypeVariable(F)
+          handleTypeVariablesDefined(F, 1)
+          handleNoType(F)
+        endTypeVariable(>, 0, null, null)
+      endTypeVariables(<, >)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(v)
+      endMetadataStar(0)
+      handleIdentifier(v, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(v)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(1, <, >)
+        handleNoConstructorReferenceContinuationAfterTypeArguments(()
+      endConstructorReference(v, null, (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      handleEnumElements(;, 1)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(foo, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+    endEnum(enum, {, 2)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart.intertwined.expect
new file mode 100644
index 0000000..9e712d2
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart.intertwined.expect
@@ -0,0 +1,117 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, null, Instance of 'DirectiveContext')
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: beginTypeVariables(<)
+          listener: beginMetadataStar(F)
+          listener: endMetadataStar(0)
+          listener: handleIdentifier(F, typeVariableDeclaration)
+          listener: beginTypeVariable(F)
+          listener: handleTypeVariablesDefined(F, 1)
+          listener: handleNoType(F)
+          listener: endTypeVariable(>, 0, null, null)
+          listener: endTypeVariables(<, >)
+          parseEnumWithClauseOpt(>)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(>)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(v)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(v, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(<)
+          listener: beginConstructorReference(v)
+          listener: beginTypeArguments(<)
+          listener: handleIdentifier(int, typeReference)
+          listener: handleNoTypeArguments(>)
+          listener: handleType(int, null)
+          listener: endTypeArguments(1, <, >)
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(()
+          listener: endConstructorReference(v, null, (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(>)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        listener: handleEnumElements(;, 1)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+            parseMethodTypeVar(E)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(E, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(E, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+              parseQualifiedRest(E, methodDeclarationContinuation)
+                ensureIdentifier(., methodDeclarationContinuation)
+                  listener: handleIdentifier(foo, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(foo)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(foo, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(foo, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 2)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart.parser.expect
new file mode 100644
index 0000000..03de71a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart.parser.expect
@@ -0,0 +1,15 @@
+enum E<F> {
+v<int>();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart.scanner.expect
new file mode 100644
index 0000000..03de71a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_2_ok.dart.scanner.expect
@@ -0,0 +1,15 @@
+enum E<F> {
+v<int>();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]F[StringToken]>[SimpleToken] {[BeginToken]
+v[StringToken]<[BeginToken]int[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart
new file mode 100644
index 0000000..7b0a907
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart
@@ -0,0 +1,6 @@
+enum E {
+  v./* about to write foo()*/;
+
+  const E();
+  const E.foo();
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart.expect
new file mode 100644
index 0000000..3816ec8
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart.expect
@@ -0,0 +1,67 @@
+Problems reported:
+
+parser/error_recovery/issue_48380_3:2:30: Expected an identifier, but got ';'.
+  v./* about to write foo()*/;
+                             ^
+
+parser/error_recovery/issue_48380_3:2:30: Expected '(' after this.
+  v./* about to write foo()*/;
+                             ^
+
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      handleNoTypeVariables({)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(v)
+      endMetadataStar(0)
+      handleIdentifier(v, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(.)
+      beginConstructorReference(v)
+        handleNoTypeArguments(.)
+        handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ';'., Try inserting an identifier before ';'., {lexeme: ;}], ;, ;)
+        handleIdentifier(, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(v, ., ;, ConstructorReferenceContext.Const)
+      handleRecoverableError(Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}], ;, ;)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      handleEnumElements(;, 1)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(foo, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+    endEnum(enum, {, 2)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart.intertwined.expect
new file mode 100644
index 0000000..180f9ab
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart.intertwined.expect
@@ -0,0 +1,113 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, null, Instance of 'DirectiveContext')
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: handleNoTypeVariables({)
+          parseEnumWithClauseOpt(E)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(E)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(v)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(v, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(.)
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(.)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            insertSyntheticIdentifier(., constructorReferenceContinuationAfterTypeArguments, message: Message[ExpectedIdentifier, Expected an identifier, but got ';'., Try inserting an identifier before ';'., {lexeme: ;}], messageOnToken: null)
+              reportRecoverableError(;, Message[ExpectedIdentifier, Expected an identifier, but got ';'., Try inserting an identifier before ';'., {lexeme: ;}])
+                listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ';'., Try inserting an identifier before ';'., {lexeme: ;}], ;, ;)
+              rewriter()
+            listener: handleIdentifier(, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(v, ., ;, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments()
+            reportRecoverableError(, Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}])
+              listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}], ;, ;)
+            rewriter()
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        listener: handleEnumElements(;, 1)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+            parseMethodTypeVar(E)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(E, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(E, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+              parseQualifiedRest(E, methodDeclarationContinuation)
+                ensureIdentifier(., methodDeclarationContinuation)
+                  listener: handleIdentifier(foo, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(foo)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(foo, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(foo, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 2)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart.parser.expect
new file mode 100644
index 0000000..88ce45f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart.parser.expect
@@ -0,0 +1,17 @@
+NOTICE: Stream was rewritten by parser!
+
+enum E {
+v. *synthetic*();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken] {[BeginToken]
+v[StringToken].[SimpleToken] [SyntheticStringToken]([SyntheticBeginToken])[SyntheticToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart.scanner.expect
new file mode 100644
index 0000000..2124d41
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.dart.scanner.expect
@@ -0,0 +1,15 @@
+enum E {
+v. ;
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken] {[BeginToken]
+v[StringToken].[SimpleToken] ;[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.equivalence_info b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.equivalence_info
new file mode 100644
index 0000000..9d49e0d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3.equivalence_info
@@ -0,0 +1,7 @@
+files:
+  - issue_48380_3.dart
+  - issue_48380_3_ok.dart
+filters:
+  - ignoreListenerArguments
+ignored:
+  - handleRecoverableError
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart
new file mode 100644
index 0000000..745f4d0
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart
@@ -0,0 +1,7 @@
+enum E {
+  v./* about to write foo()*/,
+  v.foo();
+
+  const E();
+  const E.foo();
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart.expect
new file mode 100644
index 0000000..c79dcad
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart.expect
@@ -0,0 +1,78 @@
+Problems reported:
+
+parser/error_recovery/issue_48380_3_comma:2:30: Expected an identifier, but got ','.
+  v./* about to write foo()*/,
+                             ^
+
+parser/error_recovery/issue_48380_3_comma:2:30: Expected '(' after this.
+  v./* about to write foo()*/,
+                             ^
+
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      handleNoTypeVariables({)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(v)
+      endMetadataStar(0)
+      handleIdentifier(v, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(.)
+      beginConstructorReference(v)
+        handleNoTypeArguments(.)
+        handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ','., Try inserting an identifier before ','., {lexeme: ,}], ,, ,)
+        handleIdentifier(, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(v, ., ,, ConstructorReferenceContext.Const)
+      handleRecoverableError(Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}], ,, ,)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      beginMetadataStar(v)
+      endMetadataStar(0)
+      handleIdentifier(v, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(.)
+      beginConstructorReference(v)
+        handleNoTypeArguments(.)
+        handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement(,)
+      handleEnumElements(;, 2)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(foo, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+    endEnum(enum, {, 2)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart.intertwined.expect
new file mode 100644
index 0000000..fcabf24
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart.intertwined.expect
@@ -0,0 +1,130 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, null, Instance of 'DirectiveContext')
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: handleNoTypeVariables({)
+          parseEnumWithClauseOpt(E)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(E)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(v)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(v, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(.)
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(.)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            insertSyntheticIdentifier(., constructorReferenceContinuationAfterTypeArguments, message: Message[ExpectedIdentifier, Expected an identifier, but got ','., Try inserting an identifier before ','., {lexeme: ,}], messageOnToken: null)
+              reportRecoverableError(,, Message[ExpectedIdentifier, Expected an identifier, but got ','., Try inserting an identifier before ','., {lexeme: ,}])
+                listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ','., Try inserting an identifier before ','., {lexeme: ,}], ,, ,)
+              rewriter()
+            listener: handleIdentifier(, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(v, ., ,, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments()
+            reportRecoverableError(, Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}])
+              listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected '(' after this., null, {string: (}], ,, ,)
+            rewriter()
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        parseEnumElement(,)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(v)
+            listener: endMetadataStar(0)
+          ensureIdentifier(,, enumValueDeclaration)
+            listener: handleIdentifier(v, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(.)
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(.)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            listener: handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(foo)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement(,)
+        listener: handleEnumElements(;, 2)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+            parseMethodTypeVar(E)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(E, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(E, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+              parseQualifiedRest(E, methodDeclarationContinuation)
+                ensureIdentifier(., methodDeclarationContinuation)
+                  listener: handleIdentifier(foo, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(foo)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(foo, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(foo, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 2)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart.parser.expect
new file mode 100644
index 0000000..c1c5a98
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart.parser.expect
@@ -0,0 +1,19 @@
+NOTICE: Stream was rewritten by parser!
+
+enum E {
+v. *synthetic*(),
+v.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken] {[BeginToken]
+v[StringToken].[SimpleToken] [SyntheticStringToken]([SyntheticBeginToken])[SyntheticToken],[SimpleToken]
+v[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart.scanner.expect
new file mode 100644
index 0000000..76bf22f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.dart.scanner.expect
@@ -0,0 +1,17 @@
+enum E {
+v. ,
+v.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken] {[BeginToken]
+v[StringToken].[SimpleToken] ,[SimpleToken]
+v[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.equivalence_info b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.equivalence_info
new file mode 100644
index 0000000..c70a57e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma.equivalence_info
@@ -0,0 +1,7 @@
+files:
+  - issue_48380_3_comma.dart
+  - issue_48380_3_comma_ok.dart
+filters:
+  - ignoreListenerArguments
+ignored:
+  - handleRecoverableError
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart
new file mode 100644
index 0000000..9012b7a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart
@@ -0,0 +1,7 @@
+enum E {
+  v.foo(),
+  v.foo();
+
+  const E();
+  const E.foo();
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart.expect
new file mode 100644
index 0000000..2059af9
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart.expect
@@ -0,0 +1,66 @@
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      handleNoTypeVariables({)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(v)
+      endMetadataStar(0)
+      handleIdentifier(v, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(.)
+      beginConstructorReference(v)
+        handleNoTypeArguments(.)
+        handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      beginMetadataStar(v)
+      endMetadataStar(0)
+      handleIdentifier(v, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(.)
+      beginConstructorReference(v)
+        handleNoTypeArguments(.)
+        handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement(,)
+      handleEnumElements(;, 2)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(foo, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+    endEnum(enum, {, 2)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart.intertwined.expect
new file mode 100644
index 0000000..2c0722c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart.intertwined.expect
@@ -0,0 +1,123 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, null, Instance of 'DirectiveContext')
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: handleNoTypeVariables({)
+          parseEnumWithClauseOpt(E)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(E)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(v)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(v, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(.)
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(.)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            listener: handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(foo)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        parseEnumElement(,)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(v)
+            listener: endMetadataStar(0)
+          ensureIdentifier(,, enumValueDeclaration)
+            listener: handleIdentifier(v, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(.)
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(.)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            listener: handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(foo)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement(,)
+        listener: handleEnumElements(;, 2)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+            parseMethodTypeVar(E)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(E, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(E, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+              parseQualifiedRest(E, methodDeclarationContinuation)
+                ensureIdentifier(., methodDeclarationContinuation)
+                  listener: handleIdentifier(foo, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(foo)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(foo, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(foo, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 2)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart.parser.expect
new file mode 100644
index 0000000..8f655c0
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart.parser.expect
@@ -0,0 +1,17 @@
+enum E {
+v.foo(),
+v.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken] {[BeginToken]
+v[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken],[SimpleToken]
+v[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart.scanner.expect
new file mode 100644
index 0000000..8f655c0
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_comma_ok.dart.scanner.expect
@@ -0,0 +1,17 @@
+enum E {
+v.foo(),
+v.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken] {[BeginToken]
+v[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken],[SimpleToken]
+v[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart
new file mode 100644
index 0000000..0552cb6
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart
@@ -0,0 +1,6 @@
+enum E {
+  v.foo();
+
+  const E();
+  const E.foo();
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart.expect
new file mode 100644
index 0000000..e71a4ea
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart.expect
@@ -0,0 +1,55 @@
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      handleNoTypeVariables({)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(v)
+      endMetadataStar(0)
+      handleIdentifier(v, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(.)
+      beginConstructorReference(v)
+        handleNoTypeArguments(.)
+        handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      handleEnumElements(;, 1)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(foo, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+    endEnum(enum, {, 2)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart.intertwined.expect
new file mode 100644
index 0000000..b443f1f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart.intertwined.expect
@@ -0,0 +1,106 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, null, Instance of 'DirectiveContext')
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: handleNoTypeVariables({)
+          parseEnumWithClauseOpt(E)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(E)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(v)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(v, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(.)
+          listener: beginConstructorReference(v)
+          listener: handleNoTypeArguments(.)
+          ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+            listener: handleIdentifier(foo, constructorReferenceContinuationAfterTypeArguments)
+          listener: endConstructorReference(v, ., (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(foo)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        listener: handleEnumElements(;, 1)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+            parseMethodTypeVar(E)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(E, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(E, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+              parseQualifiedRest(E, methodDeclarationContinuation)
+                ensureIdentifier(., methodDeclarationContinuation)
+                  listener: handleIdentifier(foo, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(foo)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(foo, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(foo, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 2)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart.parser.expect
new file mode 100644
index 0000000..9de11dd
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart.parser.expect
@@ -0,0 +1,15 @@
+enum E {
+v.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken] {[BeginToken]
+v[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart.scanner.expect
new file mode 100644
index 0000000..9de11dd
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_3_ok.dart.scanner.expect
@@ -0,0 +1,15 @@
+enum E {
+v.foo();
+
+const E();
+const E.foo();
+}
+
+
+enum[KeywordToken] E[StringToken] {[BeginToken]
+v[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]foo[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart b/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart
new file mode 100644
index 0000000..120cb97
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart
@@ -0,0 +1,8 @@
+enum E {
+  x;
+
+  String hello() {
+    print("hello");
+    return "hello";
+  }
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart.expect
new file mode 100644
index 0000000..f0af6df
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart.expect
@@ -0,0 +1,53 @@
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      handleNoTypeVariables({)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(x)
+      endMetadataStar(0)
+      handleIdentifier(x, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(;)
+      beginConstructorReference(x)
+        handleNoTypeArguments(;)
+        handleNoConstructorReferenceContinuationAfterTypeArguments(;)
+      endConstructorReference(x, null, ;, ConstructorReferenceContext.Const)
+      handleNoArguments(x)
+      handleEnumElement({)
+      handleEnumElements(;, 1)
+      beginMetadataStar(String)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, null, null, null, hello)
+          handleIdentifier(String, typeReference)
+          handleNoTypeArguments(hello)
+          handleType(String, null)
+          handleIdentifier(hello, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          beginBlockFunctionBody({)
+            handleIdentifier(print, expression)
+            handleNoTypeArguments(()
+            beginArguments(()
+              beginLiteralString("hello")
+              endLiteralString(0, ))
+            endArguments(1, (, ))
+            handleSend(print, ;)
+            handleExpressionStatement(;)
+            beginReturnStatement(return)
+              beginLiteralString("hello")
+              endLiteralString(0, ;)
+            endReturnStatement(true, return, ;)
+          endBlockFunctionBody(2, {, })
+        endEnumMethod(null, String, (, null, })
+      endMember()
+    endEnum(enum, {, 1)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart.intertwined.expect
new file mode 100644
index 0000000..0a13135
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart.intertwined.expect
@@ -0,0 +1,122 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, null, Instance of 'DirectiveContext')
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: handleNoTypeVariables({)
+          parseEnumWithClauseOpt(E)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(E)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(x)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(x, enumValueDeclaration)
+          listener: handleNoTypeNameInConstructorReference(;)
+          listener: beginConstructorReference(x)
+          listener: handleNoTypeArguments(;)
+          listener: handleNoConstructorReferenceContinuationAfterTypeArguments(;)
+          listener: endConstructorReference(x, null, ;, ConstructorReferenceContext.Const)
+          listener: handleNoArguments(x)
+          listener: handleEnumElement({)
+        listener: handleEnumElements(;, 1)
+        notEofOrValue(}, String)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(String)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, null, null, ;, Instance of 'SimpleType', null, hello, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, null, null, null, hello)
+            listener: handleIdentifier(String, typeReference)
+            listener: handleNoTypeArguments(hello)
+            listener: handleType(String, null)
+            ensureIdentifierPotentiallyRecovered(String, methodDeclaration, false)
+              listener: handleIdentifier(hello, methodDeclaration)
+            parseQualifiedRestOpt(hello, methodDeclarationContinuation)
+            parseMethodTypeVar(hello)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(hello, hello, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(hello, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: beginBlockFunctionBody({)
+              notEofOrValue(}, print)
+              parseStatement({)
+                parseStatementX({)
+                  parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+                    looksLikeLocalFunction(print)
+                    parseExpressionStatement({)
+                      parseExpression({)
+                        parsePrecedenceExpression({, 1, true)
+                          parseUnaryExpression({, true)
+                            parsePrimary({, expression)
+                              parseSendOrFunctionLiteral({, expression)
+                                looksLikeFunctionBody(;)
+                                parseSend({, expression)
+                                  isNextIdentifier({)
+                                  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("hello")
+                                                    listener: endLiteralString(0, ))
+                                        listener: endArguments(1, (, ))
+                                  listener: handleSend(print, ;)
+                      ensureSemicolon())
+                      listener: handleExpressionStatement(;)
+              notEofOrValue(}, return)
+              parseStatement(;)
+                parseStatementX(;)
+                  parseReturnStatement(;)
+                    listener: beginReturnStatement(return)
+                    parseExpression(return)
+                      parsePrecedenceExpression(return, 1, true)
+                        parseUnaryExpression(return, true)
+                          parsePrimary(return, expression)
+                            parseLiteralString(return)
+                              parseSingleLiteralString(return)
+                                listener: beginLiteralString("hello")
+                                listener: endLiteralString(0, ;)
+                    ensureSemicolon("hello")
+                    listener: endReturnStatement(true, return, ;)
+                    inGenerator()
+              notEofOrValue(}, })
+              listener: endBlockFunctionBody(2, {, })
+            listener: endEnumMethod(null, String, (, null, })
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 1)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart.parser.expect
new file mode 100644
index 0000000..31f63bc
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart.parser.expect
@@ -0,0 +1,19 @@
+enum E {
+x;
+
+String hello() {
+print("hello");
+return "hello";
+}
+}
+
+
+enum[KeywordToken] E[StringToken] {[BeginToken]
+x[StringToken];[SimpleToken]
+
+String[StringToken] hello[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+print[StringToken]([BeginToken]"hello"[StringToken])[SimpleToken];[SimpleToken]
+return[KeywordToken] "hello"[StringToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart.scanner.expect
new file mode 100644
index 0000000..31f63bc
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48380_4.dart.scanner.expect
@@ -0,0 +1,19 @@
+enum E {
+x;
+
+String hello() {
+print("hello");
+return "hello";
+}
+}
+
+
+enum[KeywordToken] E[StringToken] {[BeginToken]
+x[StringToken];[SimpleToken]
+
+String[StringToken] hello[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+print[StringToken]([BeginToken]"hello"[StringToken])[SimpleToken];[SimpleToken]
+return[KeywordToken] "hello"[StringToken];[SimpleToken]
+}[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_48411_prime_1.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_48411_prime_1.dart.intertwined.expect
index 0c60901..0e04d97 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_48411_prime_1.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_48411_prime_1.dart.intertwined.expect
@@ -78,7 +78,7 @@
                   listener: handleRecoverableError(RedirectionInNonFactory, =, =)
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
                     ensureIdentifier(=, constructorReference)
                       insertSyntheticIdentifier(=, constructorReference, message: Message[ExpectedIdentifier, Expected an identifier, but got '0'., Try inserting an identifier before '0'., {lexeme: 0}], messageOnToken: null)
                         reportRecoverableError(0, Message[ExpectedIdentifier, Expected an identifier, but got '0'., Try inserting an identifier before '0'., {lexeme: 0}])
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect
index 2b9a2c3..04c0792 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect
@@ -1464,7 +1464,7 @@
                               parsePrimary(return, expression)
                                 parseConstExpression(return)
                                   listener: beginConstExpression(const)
-                                  parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
+                                  parseConstructorReference(const, ConstructorReferenceContext.Const, null)
                                     ensureIdentifier(const, constructorReference)
                                       insertSyntheticIdentifier(const, constructorReference, message: Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], messageOnToken: null)
                                         reportRecoverableError((, Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}])
@@ -6483,7 +6483,7 @@
                                 parseNewExpression(return)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                     ensureIdentifier(new, constructorReference)
                                       insertSyntheticIdentifier(new, constructorReference, message: Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], messageOnToken: null)
                                         reportRecoverableError((, Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}])
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect
index 21af54c..91af5fa 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect
@@ -1401,7 +1401,7 @@
                       parsePrimary(return, expression)
                         parseConstExpression(return)
                           listener: beginConstExpression(const)
-                          parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
+                          parseConstructorReference(const, ConstructorReferenceContext.Const, null)
                             ensureIdentifier(const, constructorReference)
                               insertSyntheticIdentifier(const, constructorReference, message: Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], messageOnToken: null)
                                 reportRecoverableError((, Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}])
@@ -6291,7 +6291,7 @@
                         parseNewExpression(return)
                           isNextIdentifier(new)
                           listener: beginNewExpression(new)
-                          parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                          parseConstructorReference(new, ConstructorReferenceContext.New, null)
                             ensureIdentifier(new, constructorReference)
                               insertSyntheticIdentifier(new, constructorReference, message: Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], messageOnToken: null)
                                 reportRecoverableError((, Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}])
diff --git a/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect b/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect
index ddf7ace..06ea190 100644
--- a/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect
@@ -138,7 +138,7 @@
                                       parseNewExpression(()
                                         isNextIdentifier(new)
                                         listener: beginNewExpression(new)
-                                        parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                                        parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                           ensureIdentifier(new, constructorReference)
                                             listener: handleIdentifier(A, constructorReference)
                                           listener: beginConstructorReference(A)
diff --git a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect
index bb3f747..918b3ca 100644
--- a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect
@@ -398,7 +398,7 @@
               parseUnaryExpression(=, true)
                 parseImplicitCreationExpression(=, <, Instance of 'ComplexTypeParamOrArgInfo')
                   listener: beginImplicitCreationExpression(f)
-                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'ComplexTypeParamOrArgInfo', false)
+                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'ComplexTypeParamOrArgInfo')
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(f, constructorReference)
                     listener: beginConstructorReference(f)
diff --git a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect
index 8c87ac4..4304e12 100644
--- a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect
@@ -329,7 +329,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(C, constructorReference)
                     listener: beginConstructorReference(C)
@@ -374,7 +374,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(C, constructorReference)
                     listener: beginConstructorReference(C)
@@ -420,7 +420,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(prefix, constructorReference)
                     listener: beginConstructorReference(prefix)
@@ -466,7 +466,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(prefix, constructorReference)
                     listener: beginConstructorReference(prefix)
@@ -637,7 +637,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -678,7 +678,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -720,7 +720,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -762,7 +762,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -809,7 +809,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -851,7 +851,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -894,7 +894,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -937,7 +937,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -1028,7 +1028,7 @@
               parseUnaryExpression(=, true)
                 parseImplicitCreationExpression(=, <, Instance of 'SimpleTypeArgument1')
                   listener: beginImplicitCreationExpression(C)
-                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1', false)
+                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1')
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(C, constructorReference)
                     listener: beginConstructorReference(C)
@@ -1126,7 +1126,7 @@
               parseUnaryExpression(=, true)
                 parseImplicitCreationExpression(=, <, Instance of 'SimpleTypeArgument1')
                   listener: beginImplicitCreationExpression(prefix)
-                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1', false)
+                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1')
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(prefix, constructorReference)
                     listener: beginConstructorReference(prefix)
diff --git a/pkg/front_end/parser_testcases/nnbd/late_member.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/late_member.dart.intertwined.expect
index d52f8d6..85eedbd 100644
--- a/pkg/front_end/parser_testcases/nnbd/late_member.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/late_member.dart.intertwined.expect
@@ -52,7 +52,7 @@
                                 parseNewExpression(=)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                     ensureIdentifier(new, constructorReference)
                                       listener: handleIdentifier(X, constructorReference)
                                     listener: beginConstructorReference(X)
@@ -182,7 +182,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(X, constructorReference)
                                 listener: beginConstructorReference(X)
@@ -228,7 +228,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
diff --git a/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.intertwined.expect
index 779ed57..b8370c4 100644
--- a/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.intertwined.expect
@@ -52,7 +52,7 @@
                                 parseNewExpression(=)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                     ensureIdentifier(new, constructorReference)
                                       listener: handleIdentifier(X, constructorReference)
                                     listener: beginConstructorReference(X)
@@ -182,7 +182,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(X, constructorReference)
                                 listener: beginConstructorReference(X)
@@ -228,7 +228,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
diff --git a/pkg/front_end/parser_testcases/nnbd/required_member.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/required_member.dart.intertwined.expect
index 1339faa..5d6b7f5 100644
--- a/pkg/front_end/parser_testcases/nnbd/required_member.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/required_member.dart.intertwined.expect
@@ -52,7 +52,7 @@
                                 parseNewExpression(=)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                     ensureIdentifier(new, constructorReference)
                                       listener: handleIdentifier(X, constructorReference)
                                     listener: beginConstructorReference(X)
@@ -182,7 +182,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(X, constructorReference)
                                 listener: beginConstructorReference(X)
@@ -228,7 +228,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
diff --git a/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.intertwined.expect
index 9e00462..f1840da 100644
--- a/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.intertwined.expect
@@ -52,7 +52,7 @@
                                 parseNewExpression(=)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                     ensureIdentifier(new, constructorReference)
                                       listener: handleIdentifier(X, constructorReference)
                                     listener: beginConstructorReference(X)
@@ -182,7 +182,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(X, constructorReference)
                                 listener: beginConstructorReference(X)
@@ -228,7 +228,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect
index bb151a0..57d90c7 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect
@@ -130,7 +130,7 @@
                               parseNewExpression(=)
                                 isNextIdentifier(new)
                                 listener: beginNewExpression(new)
-                                parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                                parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                   ensureIdentifier(new, constructorReference)
                                     listener: handleIdentifier(Foo, constructorReference)
                                   listener: beginConstructorReference(Foo)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect
index d083d95..2bdab43 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect
@@ -127,7 +127,7 @@
                               parseNewExpression(=)
                                 isNextIdentifier(new)
                                 listener: beginNewExpression(new)
-                                parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
+                                parseConstructorReference(new, ConstructorReferenceContext.New, null)
                                   ensureIdentifier(new, constructorReference)
                                     listener: handleIdentifier(Foo, constructorReference)
                                   listener: beginConstructorReference(Foo)
diff --git a/pkg/front_end/test/parser_test_parser.dart b/pkg/front_end/test/parser_test_parser.dart
index 3c015f1..0e24107 100644
--- a/pkg/front_end/test/parser_test_parser.dart
+++ b/pkg/front_end/test/parser_test_parser.dart
@@ -1321,15 +1321,14 @@
   @override
   Token parseConstructorReference(
       Token token, ConstructorReferenceContext constructorReferenceContext,
-      [TypeParamOrArgInfo? typeArg, bool isImplicitTypeName = false]) {
+      [TypeParamOrArgInfo? typeArg]) {
     doPrint('parseConstructorReference('
         '$token, '
         '$constructorReferenceContext, '
-        '$typeArg, '
-        '$isImplicitTypeName)');
+        '$typeArg)');
     indent++;
-    var result = super.parseConstructorReference(
-        token, constructorReferenceContext, typeArg, isImplicitTypeName);
+    var result = super
+        .parseConstructorReference(token, constructorReferenceContext, typeArg);
     indent--;
     return result;
   }
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index f1532f1..bd9f6ed 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -1429,6 +1429,7 @@
 vb
 vector
 vegorov
+verbatim
 verbosity
 versa
 versus
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
index cc27a95..56b28c4 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:3: Error: Missing arguments in enum constructor invocation.
+// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:17: Error: Expected '(' after this.
 //   four<num, bool>; // Error.
-//   ^
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
index cc27a95..56b28c4 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:3: Error: Missing arguments in enum constructor invocation.
+// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:17: Error: Expected '(' after this.
 //   four<num, bool>; // Error.
-//   ^
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.textual_outline.expect
index c2d1e7f..22e587f 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.textual_outline.expect
@@ -1,2 +1,11 @@
-enum E<X, Y> { one<int, String>(), two<double, num>(), three<int, int>.named(42), four<num, bool>; const E(); const E.named(int value); }
+enum E<X, Y> {
+  one<int, String>(),
+  two<double, num>(),
+  three<int, int>.named(42),
+  four<num, bool>();
+
+  const E();
+  const E.named(int value);
+}
+
 main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..22e587f
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+enum E<X, Y> {
+  one<int, String>(),
+  two<double, num>(),
+  three<int, int>.named(42),
+  four<num, bool>();
+
+  const E();
+  const E.named(int value);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
index 5838648..174339c 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:3: Error: Missing arguments in enum constructor invocation.
+// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:17: Error: Expected '(' after this.
 //   four<num, bool>; // Error.
-//   ^
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect
index 5838648..174339c 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:3: Error: Missing arguments in enum constructor invocation.
+// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:17: Error: Expected '(' after this.
 //   four<num, bool>; // Error.
-//   ^
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
index d5da873..326acaf 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:3: Error: Missing arguments in enum constructor invocation.
+// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:17: Error: Expected '(' after this.
 //   four<num, bool>; // Error.
-//   ^
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
index 5838648..174339c 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:3: Error: Missing arguments in enum constructor invocation.
+// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:17: Error: Expected '(' after this.
 //   four<num, bool>; // Error.
-//   ^
+//                 ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 0bca12b..d4c50c6 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -28,7 +28,6 @@
 constructor_tearoffs/new_as_selector: FormatterCrash
 dart2js/late_fields: FormatterCrash
 dart2js/late_statics: FormatterCrash
-enhanced_enums/entries_with_type_arguments: FormatterCrash
 enhanced_enums/recovery_in_elements: FormatterCrash
 extension_types/basic_show: FormatterCrash
 extension_types/call_not_get: FormatterCrash
diff --git a/runtime/BUILD.gn b/runtime/BUILD.gn
index a4c477a..12d3dfb 100644
--- a/runtime/BUILD.gn
+++ b/runtime/BUILD.gn
@@ -242,6 +242,7 @@
 source_set("dart_api") {
   public_configs = [ ":dart_public_config" ]
   sources = [
+    "include/analyze_snapshot_api.h",
     "include/dart_api.h",
     "include/dart_api_dl.c",
     "include/dart_api_dl.h",
@@ -289,9 +290,11 @@
   public_configs = [ ":dart_public_config" ]
   sources = [
     "$target_gen_dir/version.cc",
+    "include/analyze_snapshot_api.h",
     "include/dart_api.h",
     "include/dart_native_api.h",
     "include/dart_tools_api.h",
+    "vm/analyze_snapshot_api_impl.cc",
     "vm/dart_api_impl.cc",
     "vm/native_api_impl.cc",
     "vm/version.h",
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index ea7d40d..04e73a2 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -880,6 +880,45 @@
   extra_deps += [ ":elf_loader_product" ]
 }
 
+dart_executable("analyze_snapshot") {
+  extra_configs = [ "..:dart_precompiled_runtime_config" ]
+  extra_deps = [
+    "..:libdart_precompiled_runtime",
+    "../platform:libdart_platform_precompiled_runtime",
+  ]
+
+  extra_sources = [
+    "analyze_snapshot.cc",
+    "builtin.cc",
+    "loader.cc",
+    "loader.h",
+  ]
+
+  if (dart_runtime_mode == "release") {
+    extra_deps += [ ":elf_loader_product" ]
+  } else {
+    extra_deps += [ ":elf_loader" ]
+  }
+}
+
+dart_executable("analyze_snapshot_product") {
+  use_product_mode = true
+  extra_configs = [ "..:dart_precompiled_runtime_config" ]
+  extra_deps = [
+    "..:libdart_precompiled_runtime_product",
+    "../platform:libdart_platform_precompiled_runtime_product",
+  ]
+
+  extra_sources = [
+    "analyze_snapshot.cc",
+    "builtin.cc",
+    "loader.cc",
+    "loader.h",
+  ]
+
+  extra_deps += [ ":elf_loader_product" ]
+}
+
 executable("process_test") {
   sources = [ "process_test.cc" ]
 }
diff --git a/runtime/bin/analyze_snapshot.cc b/runtime/bin/analyze_snapshot.cc
new file mode 100644
index 0000000..1eb4c14c
--- /dev/null
+++ b/runtime/bin/analyze_snapshot.cc
@@ -0,0 +1,262 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "bin/elf_loader.h"
+#include "bin/error_exit.h"
+#include "bin/file.h"
+
+#include "bin/options.h"
+#include "bin/platform.h"
+
+#if !defined(DART_HOST_OS_FUCHSIA)
+#include "include/analyze_snapshot_api.h"
+#endif
+
+namespace dart {
+namespace bin {
+#if !defined(DART_HOST_OS_FUCHSIA)
+
+#define STRING_OPTIONS_LIST(V) V(out, out_path)
+
+#define BOOL_OPTIONS_LIST(V)                                                   \
+  V(help, help)                                                                \
+  V(version, version)
+
+#define STRING_OPTION_DEFINITION(flag, variable)                               \
+  static const char* variable = nullptr;                                       \
+  DEFINE_STRING_OPTION(flag, variable)
+STRING_OPTIONS_LIST(STRING_OPTION_DEFINITION)
+#undef STRING_OPTION_DEFINITION
+
+#define BOOL_OPTION_DEFINITION(flag, variable)                                 \
+  static bool variable = false;                                                \
+  DEFINE_BOOL_OPTION(flag, variable)
+BOOL_OPTIONS_LIST(BOOL_OPTION_DEFINITION)
+#undef BOOL_OPTION_DEFINITION
+
+// clang-format off
+static void PrintUsage() {
+  Syslog::PrintErr(
+"Usage: analyze_snapshot [<vm-flags>] [<options>] <snapshot_data>            \n"
+"                                                                            \n"
+"Common options:                                                             \n"
+"--help                                                                      \n"
+"  Display this message.                                                     \n"
+"--version                                                                   \n"
+"  Print the SDK version.                                                    \n"
+"--out                                                                       \n"
+"  Path to generate the analysis results JSON.                               \n"
+"                                                                            \n"
+"If omitting [<vm-flags>] the VM parsing the snapshot is created with the    \n"
+"following default flags:                                                    \n"
+"--enable_mirrors=false                                                      \n"
+"--background_compilation                                                    \n"
+"--lazy_async_stacks                                                         \n"
+"--precompilation                                                            \n"
+"                                                                            \n"
+"\n");
+}
+// clang-format on
+
+const uint8_t* vm_snapshot_data = nullptr;
+const uint8_t* vm_snapshot_instructions = nullptr;
+const uint8_t* vm_isolate_data = nullptr;
+const uint8_t* vm_isolate_instructions = nullptr;
+
+// Parse out the command line arguments. Returns -1 if the arguments
+// are incorrect, 0 otherwise.
+static int ParseArguments(int argc,
+                          char** argv,
+                          CommandLineOptions* vm_options,
+                          CommandLineOptions* inputs) {
+  // Skip the binary name.
+  int i = 1;
+
+  // Parse out the vm options.
+  while ((i < argc) && OptionProcessor::IsValidShortFlag(argv[i])) {
+    if (OptionProcessor::TryProcess(argv[i], vm_options)) {
+      i += 1;
+      continue;
+    }
+    vm_options->AddArgument(argv[i]);
+    i += 1;
+  }
+
+  // Parse out the kernel inputs.
+  while (i < argc) {
+    inputs->AddArgument(argv[i]);
+    i++;
+  }
+
+  if (help) {
+    PrintUsage();
+    Platform::Exit(0);
+  } else if (version) {
+    Syslog::PrintErr("Dart SDK version: %s\n", Dart_VersionString());
+    Platform::Exit(0);
+  }
+
+  // Verify consistency of arguments.
+  if (inputs->count() < 1) {
+    Syslog::PrintErr("At least one input is required\n");
+    return -1;
+  }
+
+  if (out_path == nullptr) {
+    Syslog::PrintErr(
+        "Please specify an output path for analysis with the --out flag.\n\n");
+    return -1;
+  }
+
+  return 0;
+}
+
+PRINTF_ATTRIBUTE(1, 2) static void PrintErrAndExit(const char* format, ...) {
+  va_list args;
+  va_start(args, format);
+  Syslog::VPrintErr(format, args);
+  va_end(args);
+
+  Dart_ExitScope();
+  Dart_ShutdownIsolate();
+  exit(kErrorExitCode);
+}
+
+static File* OpenFile(const char* filename) {
+  File* file = File::Open(nullptr, filename, File::kWriteTruncate);
+  if (file == nullptr) {
+    PrintErrAndExit("Error: Unable to write file: %s\n\n", filename);
+  }
+  return file;
+}
+
+static void WriteFile(const char* filename,
+                      const char* buffer,
+                      const intptr_t size) {
+  File* file = OpenFile(filename);
+  RefCntReleaseScope<File> rs(file);
+  if (!file->WriteFully(buffer, size)) {
+    PrintErrAndExit("Error: Unable to write file: %s\n\n", filename);
+  }
+}
+
+int RunAnalyzer(int argc, char** argv) {
+  // Constant mirrors gen_snapshot binary, subject to change.
+  const int EXTRA_VM_ARGUMENTS = 7;
+  CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS);
+  CommandLineOptions inputs(argc);
+  // Parse command line arguments.
+  if (ParseArguments(argc, argv, &vm_options, &inputs) < 0) {
+    PrintUsage();
+    return kErrorExitCode;
+  }
+
+  // Initialize VM with default flags if none are provided.
+  // TODO(#47924): Implement auto-parsing of flags from the snapshot file.
+  if (vm_options.count() == 0) {
+    vm_options.AddArgument("--enable_mirrors=false");
+    vm_options.AddArgument("--background_compilation");
+    vm_options.AddArgument("--lazy_async_stacks");
+    vm_options.AddArgument("--precompilation");
+  }
+
+  char* error = Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
+  if (error != nullptr) {
+    Syslog::PrintErr("Setting VM flags failed: %s\n", error);
+    free(error);
+    return kErrorExitCode;
+  }
+
+  const char* script_name = nullptr;
+  script_name = inputs.GetArgument(0);
+
+  // Dart_LoadELF will crash on nonexistant file non-gracefully
+  // even though it should return `nullptr`.
+  File* const file = File::Open(/*namespc=*/nullptr, script_name, File::kRead);
+  if (file == nullptr) {
+    Syslog::PrintErr("Snapshot file does not exist\n");
+    return kErrorExitCode;
+  }
+  file->Release();
+
+  const char* loader_error = nullptr;
+  Dart_LoadedElf* loaded_elf = Dart_LoadELF(
+      script_name, 0, &loader_error, &vm_snapshot_data,
+      &vm_snapshot_instructions, &vm_isolate_data, &vm_isolate_instructions);
+
+  if (loaded_elf == nullptr) {
+    Syslog::PrintErr("Failure calling Dart_LoadELF:\n%s\n", loader_error);
+    return kErrorExitCode;
+  }
+
+  // Begin initialization
+  Dart_InitializeParams init_params = {};
+  memset(&init_params, 0, sizeof(init_params));
+  init_params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION;
+  init_params.vm_snapshot_data = vm_snapshot_data;
+  init_params.vm_snapshot_instructions = vm_snapshot_instructions;
+
+  init_params.file_open = DartUtils::OpenFile;
+  init_params.file_read = DartUtils::ReadFile;
+  init_params.file_write = DartUtils::WriteFile;
+  init_params.file_close = DartUtils::CloseFile;
+  init_params.entropy_source = DartUtils::EntropySource;
+
+  error = Dart_Initialize(&init_params);
+  if (error != nullptr) {
+    Syslog::PrintErr("VM initialization failed: %s\n", error);
+    free(error);
+    return kErrorExitCode;
+  }
+
+  auto isolate_group_data = std::unique_ptr<IsolateGroupData>(
+      new IsolateGroupData(nullptr, nullptr, nullptr, false));
+
+  Dart_IsolateFlags isolate_flags;
+  Dart_IsolateFlagsInitialize(&isolate_flags);
+  // Null safety can be determined from the snapshot itself
+  isolate_flags.null_safety =
+      Dart_DetectNullSafety(nullptr, nullptr, nullptr, vm_snapshot_data,
+                            vm_snapshot_instructions, nullptr, -1);
+
+  Dart_CreateIsolateGroup(nullptr, nullptr, vm_isolate_data,
+                          vm_isolate_instructions, &isolate_flags,
+                          isolate_group_data.get(),
+                          /*isolate_data=*/nullptr, &error);
+
+  if (error != nullptr) {
+    Syslog::PrintErr("Dart_CreateIsolateGroup Error: %s\n", error);
+    free(error);
+    return kErrorExitCode;
+  }
+
+  dart::snapshot_analyzer::Dart_SnapshotAnalyzerInformation info = {
+      vm_snapshot_data, vm_snapshot_instructions, vm_isolate_data,
+      vm_isolate_instructions};
+
+  char* out = NULL;
+  intptr_t out_len = 0;
+
+  Dart_EnterScope();
+  Dart_DumpSnapshotInformationAsJson(&out, &out_len, &info);
+  WriteFile(out_path, out, out_len);
+  // Since ownership of the JSON buffer is ours, free before we exit.
+  free(out);
+  Dart_ExitScope();
+  Dart_ShutdownIsolate();
+  // Unload our DartELF to avoid leaks
+  Dart_UnloadELF(loaded_elf);
+  return 0;
+}
+#endif
+}  // namespace bin
+}  // namespace dart
+
+int main(int argc, char** argv) {
+#if !defined(DART_HOST_OS_FUCHSIA)
+  return dart::bin::RunAnalyzer(argc, argv);
+#endif
+  dart::Syslog::PrintErr("Cannot run on Fuchsia.\n");
+  return dart::bin::kErrorExitCode;
+}
diff --git a/runtime/include/analyze_snapshot_api.h b/runtime/include/analyze_snapshot_api.h
new file mode 100644
index 0000000..e02f461
--- /dev/null
+++ b/runtime/include/analyze_snapshot_api.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+ * for details. All rights reserved. Use of this source code is governed by a
+ * BSD-style license that can be found in the LICENSE file.
+ */
+
+#ifndef RUNTIME_INCLUDE_ANALYZE_SNAPSHOT_API_H_
+#define RUNTIME_INCLUDE_ANALYZE_SNAPSHOT_API_H_
+
+#include <stdint.h>
+
+namespace dart {
+namespace snapshot_analyzer {
+typedef struct {
+  const uint8_t* vm_snapshot_data;
+  const uint8_t* vm_snapshot_instructions;
+  const uint8_t* vm_isolate_data;
+  const uint8_t* vm_isolate_instructions;
+} Dart_SnapshotAnalyzerInformation;
+
+void Dart_DumpSnapshotInformationAsJson(char** buffer,
+                                        intptr_t* buffer_length,
+                                        Dart_SnapshotAnalyzerInformation* info);
+}  // namespace snapshot_analyzer
+}  // namespace dart
+
+#endif  // RUNTIME_INCLUDE_ANALYZE_SNAPSHOT_API_H_
diff --git a/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart b/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart
new file mode 100644
index 0000000..6b735fd
--- /dev/null
+++ b/runtime/tests/vm/dart/analyze_snapshot_binary_test.dart
@@ -0,0 +1,214 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+import 'dart:io';
+import 'dart:async';
+
+import 'package:expect/expect.dart';
+import 'package:native_stack_traces/elf.dart';
+import 'package:path/path.dart' as path;
+
+import 'use_flag_test_helper.dart';
+
+// Used to ensure we don't have multiple equivalent calls to test.
+final _seenDescriptions = <String>{};
+
+Future<void> testAOT(String dillPath,
+    {bool useAsm = false,
+    bool forceDrops = false,
+    bool stripUtil = false, // Note: forced true if useAsm.
+    bool stripFlag = false,
+    bool disassemble = false}) async {
+  if (const bool.fromEnvironment('dart.vm.product') && disassemble) {
+    Expect.isFalse(disassemble, 'no use of disassembler in PRODUCT mode');
+  }
+
+  final analyzeSnapshot = path.join(
+      buildDir,
+      bool.fromEnvironment('dart.vm.product')
+          ? 'analyze_snapshot_product'
+          : 'analyze_snapshot');
+
+  // For assembly, we can't test the sizes of the snapshot sections, since we
+  // don't have a Mach-O reader for Mac snapshots and for ELF, the assembler
+  // merges the text/data sections and the VM/isolate section symbols may not
+  // have length information. Thus, we force external stripping so we can test
+  // the approximate size of the stripped snapshot.
+  if (useAsm) {
+    stripUtil = true;
+  }
+
+  final descriptionBuilder = StringBuffer()..write(useAsm ? 'assembly' : 'elf');
+  if (forceDrops) {
+    descriptionBuilder.write('-dropped');
+  }
+  if (stripFlag) {
+    descriptionBuilder.write('-intstrip');
+  }
+  if (stripUtil) {
+    descriptionBuilder.write('-extstrip');
+  }
+  if (disassemble) {
+    descriptionBuilder.write('-disassembled');
+  }
+
+  final description = descriptionBuilder.toString();
+  Expect.isTrue(_seenDescriptions.add(description),
+      "test configuration $description would be run multiple times");
+
+  await withTempDir('analyze_snapshot_binary-$description',
+      (String tempDir) async {
+    // Generate the snapshot
+    final snapshotPath = path.join(tempDir, 'test.snap');
+    final commonSnapshotArgs = [
+      if (stripFlag) '--strip', //  gen_snapshot specific and not a VM flag.
+      if (forceDrops) ...[
+        '--dwarf-stack-traces',
+        '--no-retain-function-objects',
+        '--no-retain-code-objects'
+      ],
+      if (disassemble) '--disassemble', // Not defined in PRODUCT mode.
+      dillPath,
+    ];
+
+    if (useAsm) {
+      final assemblyPath = path.join(tempDir, 'test.S');
+
+      await run(genSnapshot, <String>[
+        '--snapshot-kind=app-aot-assembly',
+        '--assembly=$assemblyPath',
+        ...commonSnapshotArgs,
+      ]);
+
+      await assembleSnapshot(assemblyPath, snapshotPath);
+    } else {
+      await run(genSnapshot, <String>[
+        '--snapshot-kind=app-aot-elf',
+        '--elf=$snapshotPath',
+        ...commonSnapshotArgs,
+      ]);
+    }
+
+    print("Snapshot generated at $snapshotPath.");
+
+    // May not be ELF, but another format.
+    final elf = Elf.fromFile(snapshotPath);
+    if (!useAsm) {
+      Expect.isNotNull(elf);
+    }
+
+    if (elf != null) {
+      // Verify some ELF file format parameters.
+      final textSections = elf.namedSections(".text");
+      Expect.isNotEmpty(textSections);
+      Expect.isTrue(
+          textSections.length <= 2, "More text sections than expected");
+      final dataSections = elf.namedSections(".rodata");
+      Expect.isNotEmpty(dataSections);
+      Expect.isTrue(
+          dataSections.length <= 2, "More data sections than expected");
+    }
+
+    final analyzerOutputPath = path.join(tempDir, 'analyze_test.json');
+
+    // This will throw if exit code is not 0.
+    await run(analyzeSnapshot, <String>[
+      '--out=$analyzerOutputPath',
+      '$snapshotPath',
+    ]);
+
+    final analyzerJsonBytes = await readFile(analyzerOutputPath);
+    final analyzerJson = json.decode(analyzerJsonBytes);
+    Expect.isFalse(analyzerJson.isEmpty);
+    Expect.isTrue(analyzerJson.keys
+        .toSet()
+        .containsAll(['snapshot_data', 'class_table', 'object_pool']));
+  });
+}
+
+main() async {
+  void printSkip(String description) =>
+      print('Skipping $description for ${path.basename(buildDir)} '
+              'on ${Platform.operatingSystem}' +
+          (clangBuildToolsDir == null ? ' without //buildtools' : ''));
+
+  // We don't have access to the SDK on Android.
+  if (Platform.isAndroid) {
+    printSkip('all tests');
+    return;
+  }
+
+  await withTempDir('analyze_snapshot_binary', (String tempDir) async {
+    // We only need to generate the dill file once for all JIT tests.
+    final _thisTestPath = path.join(sdkDir, 'runtime', 'tests', 'vm', 'dart',
+        'analyze_snapshot_binary_test.dart');
+
+    // We only need to generate the dill file once for all AOT tests.
+    final aotDillPath = path.join(tempDir, 'aot_test.dill');
+    await run(genKernel, <String>[
+      '--aot',
+      '--platform',
+      platformDill,
+      ...Platform.executableArguments.where((arg) =>
+          arg.startsWith('--enable-experiment=') ||
+          arg == '--sound-null-safety' ||
+          arg == '--no-sound-null-safety'),
+      '-o',
+      aotDillPath,
+      _thisTestPath
+    ]);
+
+    // Just as a reminder for AOT tests:
+    // * If useAsm is true, then stripUtil is forced (as the assembler may add
+    //   extra information that needs stripping), so no need to specify
+    //   stripUtil for useAsm tests.
+
+    // Test unstripped ELF generation directly.
+    await testAOT(aotDillPath);
+    await testAOT(aotDillPath, forceDrops: true);
+
+    // Test flag-stripped ELF generation.
+    await testAOT(aotDillPath, stripFlag: true);
+
+    // Since we can't force disassembler support after the fact when running
+    // in PRODUCT mode, skip any --disassemble tests. Do these tests last as
+    // they have lots of output and so the log will be truncated.
+    if (!const bool.fromEnvironment('dart.vm.product')) {
+      // Regression test for dartbug.com/41149.
+      await testAOT(aotDillPath, disassemble: true);
+    }
+
+    // We neither generate assembly nor have a stripping utility on Windows.
+    if (Platform.isWindows) {
+      printSkip('external stripping and assembly tests');
+      return;
+    }
+
+    // The native strip utility on Mac OS X doesn't recognize ELF files.
+    if (Platform.isMacOS && clangBuildToolsDir == null) {
+      printSkip('ELF external stripping test');
+    } else {
+      // Test unstripped ELF generation that is then externally stripped.
+      await testAOT(aotDillPath, stripUtil: true);
+    }
+
+    // TODO(sstrickl): Currently we can't assemble for SIMARM64 on MacOSX.
+    // For example, the test runner still uses blobs for
+    // dartkp-mac-*-simarm64. Change assembleSnapshot and remove this check
+    // when we can.
+    if (Platform.isMacOS && buildDir.endsWith('SIMARM64')) {
+      printSkip('assembly tests');
+      return;
+    }
+    // Test unstripped assembly generation that is then externally stripped.
+    await testAOT(aotDillPath, useAsm: true);
+    // Test stripped assembly generation that is then externally stripped.
+    await testAOT(aotDillPath, useAsm: true, stripFlag: true);
+  });
+}
+
+Future<String> readFile(String file) {
+  return new File(file).readAsString();
+}
diff --git a/runtime/tests/vm/dart_2/analyze_snapshot_binary_test.dart b/runtime/tests/vm/dart_2/analyze_snapshot_binary_test.dart
new file mode 100644
index 0000000..3299251
--- /dev/null
+++ b/runtime/tests/vm/dart_2/analyze_snapshot_binary_test.dart
@@ -0,0 +1,212 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+import 'dart:convert';
+import 'dart:io';
+import 'dart:async';
+
+import 'package:expect/expect.dart';
+import 'package:native_stack_traces/elf.dart';
+import 'package:path/path.dart' as path;
+
+import 'use_flag_test_helper.dart';
+
+// Used to ensure we don't have multiple equivalent calls to test.
+final _seenDescriptions = <String>{};
+
+Future<void> testAOT(String dillPath,
+    {bool useAsm = false,
+    bool forceDrops = false,
+    bool stripUtil = false, // Note: forced true if useAsm.
+    bool stripFlag = false,
+    bool disassemble = false}) async {
+  if (const bool.fromEnvironment('dart.vm.product') && disassemble) {
+    Expect.isFalse(disassemble, 'no use of disassembler in PRODUCT mode');
+  }
+
+  final analyzeSnapshot = path.join(
+      buildDir,
+      bool.fromEnvironment('dart.vm.product')
+          ? 'analyze_snapshot_product'
+          : 'analyze_snapshot');
+
+  // For assembly, we can't test the sizes of the snapshot sections, since we
+  // don't have a Mach-O reader for Mac snapshots and for ELF, the assembler
+  // merges the text/data sections and the VM/isolate section symbols may not
+  // have length information. Thus, we force external stripping so we can test
+  // the approximate size of the stripped snapshot.
+  if (useAsm) {
+    stripUtil = true;
+  }
+
+  final descriptionBuilder = StringBuffer()..write(useAsm ? 'assembly' : 'elf');
+  if (forceDrops) {
+    descriptionBuilder.write('-dropped');
+  }
+  if (stripFlag) {
+    descriptionBuilder.write('-intstrip');
+  }
+  if (stripUtil) {
+    descriptionBuilder.write('-extstrip');
+  }
+  if (disassemble) {
+    descriptionBuilder.write('-disassembled');
+  }
+
+  final description = descriptionBuilder.toString();
+  Expect.isTrue(_seenDescriptions.add(description),
+      "test configuration $description would be run multiple times");
+
+  await withTempDir('analyze_snapshot_binary-$description',
+      (String tempDir) async {
+    // Generate the snapshot
+    final snapshotPath = path.join(tempDir, 'test.snap');
+    final commonSnapshotArgs = [
+      if (stripFlag) '--strip', //  gen_snapshot specific and not a VM flag.
+      if (forceDrops) ...[
+        '--dwarf-stack-traces',
+        '--no-retain-function-objects',
+        '--no-retain-code-objects'
+      ],
+      if (disassemble) '--disassemble', // Not defined in PRODUCT mode.
+      dillPath,
+    ];
+
+    if (useAsm) {
+      final assemblyPath = path.join(tempDir, 'test.S');
+
+      await run(genSnapshot, <String>[
+        '--snapshot-kind=app-aot-assembly',
+        '--assembly=$assemblyPath',
+        ...commonSnapshotArgs,
+      ]);
+
+      await assembleSnapshot(assemblyPath, snapshotPath);
+    } else {
+      await run(genSnapshot, <String>[
+        '--snapshot-kind=app-aot-elf',
+        '--elf=$snapshotPath',
+        ...commonSnapshotArgs,
+      ]);
+    }
+
+    print("Snapshot generated at $snapshotPath.");
+
+    // May not be ELF, but another format.
+    final elf = Elf.fromFile(snapshotPath);
+    if (!useAsm) {
+      Expect.isNotNull(elf);
+    }
+
+    if (elf != null) {
+      // Verify some ELF file format parameters.
+      final textSections = elf.namedSections(".text");
+      Expect.isNotEmpty(textSections);
+      Expect.isTrue(
+          textSections.length <= 2, "More text sections than expected");
+      final dataSections = elf.namedSections(".rodata");
+      Expect.isNotEmpty(dataSections);
+      Expect.isTrue(
+          dataSections.length <= 2, "More data sections than expected");
+    }
+
+    final analyzerOutputPath = path.join(tempDir, 'analyze_test.json');
+
+    // This will throw if exit code is not 0.
+    await run(analyzeSnapshot, <String>[
+      '--out=$analyzerOutputPath',
+      '$snapshotPath',
+    ]);
+
+    final analyzerJsonBytes = await readFile(analyzerOutputPath);
+    final analyzerJson = json.decode(analyzerJsonBytes);
+    Expect.isFalse(analyzerJson.isEmpty);
+    Expect.isTrue(analyzerJson.keys
+        .toSet()
+        .containsAll(['snapshot_data', 'class_table', 'object_pool']));
+  });
+}
+
+main() async {
+  void printSkip(String description) =>
+      print('Skipping $description for ${path.basename(buildDir)} '
+              'on ${Platform.operatingSystem}' +
+          (clangBuildToolsDir == null ? ' without //buildtools' : ''));
+
+  // We don't have access to the SDK on Android.
+  if (Platform.isAndroid) {
+    printSkip('all tests');
+    return;
+  }
+
+  await withTempDir('analyze_snapshot_binary', (String tempDir) async {
+    // We only need to generate the dill file once for all JIT tests.
+    final _thisTestPath = path.join(sdkDir, 'runtime', 'tests', 'vm', 'dart_2',
+        'analyze_snapshot_binary_test.dart');
+
+    // We only need to generate the dill file once for all AOT tests.
+    final aotDillPath = path.join(tempDir, 'aot_test.dill');
+    await run(genKernel, <String>[
+      '--aot',
+      '--platform',
+      platformDill,
+      '-o',
+      aotDillPath,
+      _thisTestPath
+    ]);
+
+    // Just as a reminder for AOT tests:
+    // * If useAsm is true, then stripUtil is forced (as the assembler may add
+    //   extra information that needs stripping), so no need to specify
+    //   stripUtil for useAsm tests.
+
+    // Test unstripped ELF generation directly.
+    await testAOT(aotDillPath);
+    await testAOT(aotDillPath, forceDrops: true);
+
+    // Test flag-stripped ELF generation.
+    await testAOT(aotDillPath, stripFlag: true);
+
+    // Since we can't force disassembler support after the fact when running
+    // in PRODUCT mode, skip any --disassemble tests. Do these tests last as
+    // they have lots of output and so the log will be truncated.
+    if (!const bool.fromEnvironment('dart.vm.product')) {
+      // Regression test for dartbug.com/41149.
+      await testAOT(aotDillPath, disassemble: true);
+    }
+
+    // We neither generate assembly nor have a stripping utility on Windows.
+    if (Platform.isWindows) {
+      printSkip('external stripping and assembly tests');
+      return;
+    }
+
+    // The native strip utility on Mac OS X doesn't recognize ELF files.
+    if (Platform.isMacOS && clangBuildToolsDir == null) {
+      printSkip('ELF external stripping test');
+    } else {
+      // Test unstripped ELF generation that is then externally stripped.
+      await testAOT(aotDillPath, stripUtil: true);
+    }
+
+    // TODO(sstrickl): Currently we can't assemble for SIMARM64 on MacOSX.
+    // For example, the test runner still uses blobs for
+    // dartkp-mac-*-simarm64. Change assembleSnapshot and remove this check
+    // when we can.
+    if (Platform.isMacOS && buildDir.endsWith('SIMARM64')) {
+      printSkip('assembly tests');
+      return;
+    }
+    // Test unstripped assembly generation that is then externally stripped.
+    await testAOT(aotDillPath, useAsm: true);
+    // Test stripped assembly generation that is then externally stripped.
+    await testAOT(aotDillPath, useAsm: true, stripFlag: true);
+  });
+}
+
+Future<String> readFile(String file) {
+  return new File(file).readAsString();
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 5fe1fbf..a9e0d13 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -65,6 +65,7 @@
 dart_2/null_safety_autodetection_in_kernel_compiler_test: SkipSlow # gen_kernel is too slow with optimization_counter_threshold
 
 [ $builder_tag == tsan ]
+dart/analyze_snapshot_binary_test: SkipSlow
 dart/appjit_cha_deopt_test: SkipSlow
 dart/hash_map_probes_limit_test: SkipSlow # Test includes large program compilation.
 dart/regress_40462_test: SkipSlow
@@ -72,6 +73,7 @@
 dart/trigger_gc_in_native_test: Skip # This test crashes on the bot, but not locally, and infrastructure repeatly fails to locate its coredump.
 dart/use_strip_flag_test: Pass, Slow # This test can take a longer time to complete.
 dart/v8_snapshot_profile_writer_test: SkipSlow
+dart_2/analyze_snapshot_binary_test: SkipSlow
 dart_2/appjit_cha_deopt_test: SkipSlow
 dart_2/hash_map_probes_limit_test: SkipSlow # Test includes large program compilation.
 dart_2/regress_40462_test: SkipSlow
@@ -325,6 +327,11 @@
 dart/v8_snapshot_profile_writer_test: SkipByDesign # Only relevant for AOT. Doesn't work in cross-compilation (has to run on the host). On Linux/simarm64 and Linux/simarm this test requires buildtools/clang which is not always available on testing shards.
 dart_2/v8_snapshot_profile_writer_test: SkipByDesign # Only relevant for AOT. Doesn't work in cross-compilation (has to run on the host). On Linux/simarm64 and Linux/simarm this test requires buildtools/clang which is not always available on testing shards.
 
+# Currently this is only supported on 64-bit linux systems with precompilation
+[ $arch == ia32 || $arch == simarm || $arch == simarm64 || $arch == simarm64c || $arch == simriscv32 || $arch == simriscv64 || $compiler != dartk || $system == fuchsia || $system != linux ]
+dart/analyze_snapshot_binary_test: SkipByDesign # Only run on 64bit AOT on standard architectures
+dart_2/analyze_snapshot_binary_test: SkipByDesign # Only run on 64bit AOT on standard architectures
+
 # On the simluator stack traces produced by the Profiler do not match
 # up with the real Dart stack trace and hence we don't get correct
 # symbol names.
diff --git a/runtime/vm/analyze_snapshot_api_impl.cc b/runtime/vm/analyze_snapshot_api_impl.cc
new file mode 100644
index 0000000..ef73e76
--- /dev/null
+++ b/runtime/vm/analyze_snapshot_api_impl.cc
@@ -0,0 +1,202 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "include/analyze_snapshot_api.h"
+#include "vm/dart_api_impl.h"
+#include "vm/json_writer.h"
+#include "vm/object.h"
+#include "vm/object_store.h"
+#include "vm/thread.h"
+
+namespace dart {
+namespace snapshot_analyzer {
+void DumpClassTable(Thread* thread, dart::JSONWriter* js) {
+  auto class_table = thread->isolate_group()->class_table();
+
+  Class& cls = Class::Handle();
+  String& name = String::Handle();
+  js->OpenArray("class_table");
+
+  for (intptr_t i = 1; i < class_table->NumCids(); i++) {
+    if (!class_table->HasValidClassAt(i)) {
+      continue;
+    }
+    cls = class_table->At(i);
+    if (!cls.IsNull()) {
+      name = cls.Name();
+      js->OpenObject();
+      js->PrintProperty("id", i);
+      js->PrintProperty("name", name.ToCString());
+
+      // Note: Some meta info is stripped from the snapshot, it's important
+      // to check every field for NULL to avoid segfaults.
+      const Library& library = Library::Handle(cls.library());
+      if (!library.IsNull()) {
+        String& lib_name = String::Handle();
+        lib_name = String::NewFormatted(
+            Heap::kOld, "%s%s", String::Handle(library.url()).ToCString(),
+            String::Handle(library.private_key()).ToCString());
+        js->PrintProperty("library", lib_name.ToCString());
+      }
+
+      const AbstractType& super_type = AbstractType::Handle(cls.super_type());
+      if (super_type.IsNull()) {
+      } else {
+        const String& super_name = String::Handle(super_type.Name());
+        js->PrintProperty("super_class", super_name.ToCString());
+      }
+
+      const Array& interfaces_array = Array::Handle(cls.interfaces());
+      if (!interfaces_array.IsNull()) {
+        if (interfaces_array.Length() > 0) {
+          js->OpenArray("interfaces");
+          AbstractType& interface = AbstractType::Handle();
+          intptr_t len = interfaces_array.Length();
+          for (intptr_t i = 0; i < len; i++) {
+            interface ^= interfaces_array.At(i);
+            js->PrintValue(interface.ToCString());
+          }
+          js->CloseArray();
+        }
+      }
+      const Array& functions_array = Array::Handle(cls.functions());
+      if (!functions_array.IsNull()) {
+        if (functions_array.Length() > 0) {
+          js->OpenArray("functions");
+          Function& function = Function::Handle();
+          intptr_t len = functions_array.Length();
+          for (intptr_t i = 0; i < len; i++) {
+            function ^= functions_array.At(i);
+            if (function.IsNull() || !function.HasCode()) {
+              continue;
+            }
+            const Code& code = Code::Handle(function.CurrentCode());
+            intptr_t size = code.Size();
+
+            // Note: Some entry points here will be pointing to the VM
+            // instructions buffer.
+
+            // Note: code_entry will contain the address in the memory
+            // In order to resolve it to a relative offset in the instructions
+            // buffer we need to pick the base address and substract it from
+            // the entry point address.
+            auto code_entry = code.EntryPoint();
+            // On different architectures the type of the underlying
+            // dart::uword can result in an unsigned long long vs unsigned long
+            // mismatch.
+            uint64_t code_addr = static_cast<uint64_t>(code_entry);
+            js->OpenObject();
+            js->PrintProperty("name", function.ToCString());
+            js->PrintfProperty("code_entry", "0x%" PRIx64 "", code_addr);
+            js->PrintProperty("size", size);
+            js->CloseObject();
+          }
+          js->CloseArray();
+        }
+      }
+      const Array& fields_array = Array::Handle(cls.fields());
+      if (fields_array.IsNull()) {
+      } else {
+        if (fields_array.Length() > 0) {
+          js->OpenArray("fields");
+          Field& field = Field::Handle();
+          for (intptr_t i = 0; i < fields_array.Length(); i++) {
+            field ^= fields_array.At(i);
+            js->PrintValue(field.ToCString());
+          }
+          js->CloseArray();
+        }
+      }
+    }
+    js->CloseObject();
+  }
+  js->CloseArray();
+}
+void DumpObjectPool(Thread* thread, dart::JSONWriter* js) {
+  js->OpenArray("object_pool");
+
+  auto pool_ptr = thread->isolate_group()->object_store()->global_object_pool();
+  const auto& pool = ObjectPool::Handle(ObjectPool::RawCast(pool_ptr));
+  for (intptr_t i = 0; i < pool.Length(); i++) {
+    auto type = pool.TypeAt(i);
+    // Only interested in tagged objects.
+    // All these checks are required otherwise ToCString() will segfault.
+    if (type != ObjectPool::EntryType::kTaggedObject) {
+      continue;
+    }
+
+    auto entry = pool.ObjectAt(i);
+    if (!entry.IsHeapObject()) {
+      continue;
+    }
+
+    intptr_t cid = entry.GetClassId();
+
+    switch (cid) {
+      case kOneByteStringCid: {
+        js->OpenObject();
+        js->PrintProperty("type", "kOneByteString");
+        js->PrintProperty("id", i);
+        js->PrintProperty("offset", pool.element_offset(i));
+        js->PrintProperty("value", Object::Handle(entry).ToCString());
+        js->CloseObject();
+        break;
+      }
+      case kTwoByteStringCid: {
+        // TODO(#47924): Add support.
+        break;
+      }
+      default:
+        // TODO(#47924): Investigate other types of objects to parse.
+        break;
+    }
+  }
+  js->CloseArray();
+}
+// TODO(#47924): Add processing of the entires in the dispatch table.
+// Below is an example skeleton
+// void DumpDispatchTable(dart::Thread* thread) {
+//   auto dispatch = thread->isolate_group()->dispatch_table();
+//   auto length = dispatch->length();
+// We must unbias the array entries so we don't crash on null access.
+//   auto entries = dispatch->ArrayOrigin() - DispatchTable::OriginElement();
+//   for (intptr_t i = 0; i < length; i++) {
+//     OS::Print("0x%lx at %ld\n", entries[i], i);
+//   }
+// }
+
+void Dart_DumpSnapshotInformationAsJson(
+    char** buffer,
+    intptr_t* buffer_length,
+    Dart_SnapshotAnalyzerInformation* info) {
+  Thread* thread = Thread::Current();
+  DARTSCOPE(thread);
+  JSONWriter js;
+  // Open empty object so output is valid/parsable JSON.
+  js.OpenObject();
+  js.OpenObject("snapshot_data");
+  // Base addreses of the snapshot data, useful to calculate relative offsets.
+  js.PrintfProperty("vm_data", "%p", info->vm_snapshot_data);
+  js.PrintfProperty("vm_instructions", "%p", info->vm_snapshot_instructions);
+  js.PrintfProperty("isolate_data", "%p", info->vm_isolate_data);
+  js.PrintfProperty("isolate_instructions", "%p",
+                    info->vm_isolate_instructions);
+  js.CloseObject();
+
+  {
+    // Debug builds assert that our thread has a lock before accessing
+    // vm internal fields.
+    SafepointReadRwLocker ml(thread, thread->isolate_group()->program_lock());
+    DumpClassTable(thread, &js);
+    DumpObjectPool(thread, &js);
+  }
+
+  // Close our empty object.
+  js.CloseObject();
+
+  // Give ownership to caller.
+  js.Steal(buffer, buffer_length);
+}
+}  // namespace snapshot_analyzer
+}  // namespace dart
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 8e6a103..1241607 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -26,6 +26,7 @@
   dart_stripped_binary = "dart"
   dart_precompiled_runtime_stripped_binary = "dart_precompiled_runtime_product"
   gen_snapshot_stripped_binary = "gen_snapshot_product"
+  analyze_snapshot_binary = "analyze_snapshot_product"
 }
 
 # The directory layout of the SDK is as follows:
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 517beee..96ef3e5 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -235,9 +235,16 @@
               onExit: resultPort.sendPort,
               errorsAreFatal: true,
               debugName: debugName)
-          .then<void>((_) {}, onError: result.completeError);
+          .then<void>((_) {}, onError: (error, stack) {
+        // Sending the computation failed asynchronously.
+        // Do not expect a response, report the error asynchronously.
+        resultPort.close();
+        result.completeError(error, stack);
+      });
     } on Object {
-      // Sending the computation failed.
+      // Sending the computation failed synchronously.
+      // This is not expected to happen, but if it does,
+      // the synchronous error is respected and rethrown synchronously.
       resultPort.close();
       rethrow;
     }
@@ -938,7 +945,7 @@
       if (potentiallyAsyncResult is Future<R>) {
         result = await potentiallyAsyncResult;
       } else {
-        result = potentiallyAsyncResult as R;
+        result = potentiallyAsyncResult;
       }
     } catch (e, s) {
       // If sending fails, the error becomes an uncaught error.
diff --git a/tests/lib/isolate/isolate_run_test.dart b/tests/lib/isolate/isolate_run_test.dart
index 27312b8..b598029 100644
--- a/tests/lib/isolate/isolate_run_test.dart
+++ b/tests/lib/isolate/isolate_run_test.dart
@@ -21,6 +21,8 @@
   await testIsolateHangs();
   await testIsolateKilled();
   await testIsolateExits();
+  // Failing to start.
+  await testInvalidMessage();
   asyncEnd();
 }
 
@@ -113,3 +115,11 @@
   Expect.equals("Computation ended without result", e.toString());
   Expect.equals(0, variable);
 }
+
+Future<void> testInvalidMessage() async {
+  // Regression test for http://dartbug.com/48516
+  var unsendable = RawReceivePort();
+  await asyncExpectThrows<Error>(Isolate.run<void>(() => unsendable));
+  unsendable.close();
+  // Test should not hang.
+}
diff --git a/tests/lib_2/isolate/isolate_run_test.dart b/tests/lib_2/isolate/isolate_run_test.dart
index d39c83d..cad8d04 100644
--- a/tests/lib_2/isolate/isolate_run_test.dart
+++ b/tests/lib_2/isolate/isolate_run_test.dart
@@ -23,6 +23,8 @@
   await testIsolateHangs();
   await testIsolateKilled();
   await testIsolateExits();
+  // Failing to start.
+  await testInvalidMessage();
   asyncEnd();
 }
 
@@ -115,3 +117,11 @@
   Expect.equals("Computation ended without result", e.toString());
   Expect.equals(0, variable);
 }
+
+Future<void> testInvalidMessage() async {
+  // Regression test for http://dartbug.com/48516
+  var unsendable = RawReceivePort();
+  await asyncExpectThrows<Error>(Isolate.run<void>(() => unsendable));
+  unsendable.close();
+  // Test should not hang.
+}
diff --git a/tools/VERSION b/tools/VERSION
index 5d4cdea..424d0dd 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 192
+PRERELEASE 193
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/gn.py b/tools/gn.py
index 2b43717..e54c331 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -282,6 +282,8 @@
             'exe.stripped/dart_precompiled_runtime_product')
         gn_args['gen_snapshot_stripped_binary'] = (
             'exe.stripped/gen_snapshot_product')
+        gn_args['analyze_snapshot_binary'] = (
+            'exe.stripped/analyze_snapshot_product')
 
     # Setup the user-defined sysroot.
     if UseSysroot(args, gn_args):