Version 2.16.0-77.0.dev

Merge commit 'e07ff780e2ac822ed2447bce55bbbc0e482ab645' into 'dev'
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 6aaff25..7cfb915 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -2768,6 +2768,16 @@
     problemMessage: r"""An enum declaration can't be empty.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeEnumDeclaresFactory = messageEnumDeclaresFactory;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageEnumDeclaresFactory = const MessageCode(
+    "EnumDeclaresFactory",
+    problemMessage: r"""Enums can't declare factory constructors.""",
+    correctionMessage:
+        r"""Try removing the factory constructor declaration.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeEnumInClass = messageEnumInClass;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5661,6 +5671,17 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeInternalProblemOmittedTypeNameInConstructorReference =
+    messageInternalProblemOmittedTypeNameInConstructorReference;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageInternalProblemOmittedTypeNameInConstructorReference =
+    const MessageCode("InternalProblemOmittedTypeNameInConstructorReference",
+        severity: Severity.internalProblem,
+        problemMessage:
+            r"""Unsupported omission of the type name in a constructor reference outside of an enum element declaration.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInternalProblemPreviousTokenNotFound =
     messageInternalProblemPreviousTokenNotFound;
 
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/declaration_kind.dart b/pkg/_fe_analyzer_shared/lib/src/parser/declaration_kind.dart
index 7037020..1efc9da 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/declaration_kind.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/declaration_kind.dart
@@ -14,4 +14,7 @@
 
   /// An extension declaration.
   Extension,
+
+  /// An enum.
+  Enum,
 }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
index bc996d6..c60aa80 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
@@ -636,8 +636,66 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
-    listener?.endEnum(enumKeyword, leftBrace, count);
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+    listener?.endEnum(enumKeyword, leftBrace, memberCount);
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    listener?.endEnumConstructor(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
+  }
+
+  @override
+  void handleEnumElement(Token beginToken) {
+    listener?.handleEnumElement(beginToken);
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    listener?.handleEnumElements(elementsEndToken, elementsCount);
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    listener?.handleEnumHeader(enumKeyword, leftBrace);
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    listener?.endEnumFactoryMethod(beginToken, factoryKeyword, endToken);
+  }
+
+  @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    listener?.endClassFields(
+        abstractToken,
+        externalToken,
+        staticToken,
+        covariantToken,
+        lateToken,
+        varFinalOrConst,
+        count,
+        beginToken,
+        endToken);
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    listener?.endEnumMethod(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
   }
 
   @override
@@ -1173,9 +1231,13 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    listener?.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
+  void handleEnumNoWithClause() {
+    listener?.handleEnumNoWithClause();
+  }
+
+  @override
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    listener?.handleImplements(implementsKeyword, interfacesCount);
   }
 
   @override
@@ -1191,6 +1253,11 @@
   }
 
   @override
+  void handleEnumWithClause(Token withKeyword) {
+    listener?.handleEnumWithClause(withKeyword);
+  }
+
+  @override
   void handleCommentReference(
       Token? newKeyword, Token? prefix, Token? period, Token token) {
     listener?.handleCommentReference(newKeyword, prefix, period, token);
@@ -1548,6 +1615,11 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    listener?.handleNoTypeNameInConstructorReference(token);
+  }
+
+  @override
   void handleNoTypeVariables(Token token) {
     listener?.handleNoTypeVariables(token);
   }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
index 952d718..332225f 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
@@ -137,12 +137,11 @@
     logEvent("ClassExtends");
   }
 
-  /// Handle an implements clause in a class or mixin declaration.
+  /// Handle an implements clause in a class, mixin or enum declaration.
   /// Substructures:
   /// - implemented types
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    logEvent("ClassImplements");
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    logEvent("Implements");
   }
 
   /// Handle a show clause in an extension declaration.
@@ -306,12 +305,55 @@
   void beginEnum(Token enumKeyword) {}
 
   /// Handle the end of an enum declaration.  Substructures:
+  /// - [memberCount] times:
+  ///   - Enum member
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+    logEvent("Enum");
+  }
+
+  /// Handle the end of an enum constructor declaration.  Substructures:
+  /// - metadata
+  /// - return type
+  /// - method name (identifier, possibly qualified)
+  /// - type variables
+  /// - formal parameters
+  /// - initializers
+  /// - async marker
+  /// - body
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(danrubel): push implementation into subclasses
+    endClassMethod(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
+  }
+
+  /// Handle the enum elements. Substructures:
+  /// - [elementsCount] times:
+  ///   - Enum element
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    logEvent("EnumElements");
+  }
+
+  /// Handle the header of an enum declaration.  Substructures:
   /// - Metadata
   /// - Enum name (identifier)
-  /// - [count] times:
-  ///   - Enum value (identifier)
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
-    logEvent("Enum");
+  /// - type variables
+  /// - with clause
+  /// - implemented types
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    logEvent("EnumHeader");
+  }
+
+  /// Handle the enum element. Substructures:
+  /// - Metadata
+  /// - Enum value (identifier)
+  void handleEnumElement(Token beginToken) {
+    logEvent("EnumElement");
+  }
+
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    endClassFactoryMethod(beginToken, factoryKeyword, endToken);
   }
 
   void beginExport(Token token) {}
@@ -448,6 +490,42 @@
         lateToken, varFinalOrConst, count, beginToken, endToken);
   }
 
+  /// Handle the end of an enum field declaration.  Substructures:
+  /// - Metadata
+  /// - Modifiers
+  /// - Type
+  /// - Variable declarations (count times)
+  ///
+  /// Started by [beginFields].
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    endClassFields(abstractToken, externalToken, staticToken, covariantToken,
+        lateToken, varFinalOrConst, count, beginToken, endToken);
+  }
+
+  /// Handle the end of an enum method declaration.  Substructures:
+  /// - metadata
+  /// - return type
+  /// - method name (identifier, possibly qualified)
+  /// - type variables
+  /// - formal parameters
+  /// - initializers
+  /// - async marker
+  /// - body
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    endClassMethod(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
+  }
+
   /// Marks that the grammar term `forInitializerStatement` has been parsed and
   /// it was an empty statement.
   void handleForInitializerEmptyStatement(Token token) {
@@ -609,18 +687,33 @@
     logEvent("FunctionTypeAlias");
   }
 
-  /// Handle the end of a with clause (e.g. "with B, C").
+  /// Handle the end of a class with clause (e.g. "with B, C").
   /// Substructures:
   /// - mixin types (TypeList)
   void handleClassWithClause(Token withKeyword) {
     logEvent("ClassWithClause");
   }
 
-  /// Handle the absence of a with clause.
+  /// Handle the absence of a class with clause.
   void handleClassNoWithClause() {
     logEvent("ClassNoWithClause");
   }
 
+  /// Handle the end of an enum with clause (e.g. "with B, C").
+  /// Substructures:
+  /// - mixin types (TypeList)
+  ///
+  /// This method is separated from [handleClassWithClause] to simplify
+  /// handling the different objects in the context.
+  void handleEnumWithClause(Token withKeyword) {
+    logEvent("EnumWithClause");
+  }
+
+  /// Handle the absence of an enum with clause.
+  void handleEnumNoWithClause() {
+    logEvent("EnumNoWithClause");
+  }
+
   /// Handle the beginning of a named mixin application.
   /// [beginToken] may be the same as [name], or may point to modifiers
   /// (or extraneous modifiers in the case of recovery) preceding [name].
@@ -1567,6 +1660,10 @@
     logEvent("NoConstructorReferenceContinuationAfterTypeArguments");
   }
 
+  void handleNoTypeNameInConstructorReference(Token token) {
+    logEvent("NoTypeNameInConstructorReference");
+  }
+
   void handleNoType(Token lastConsumed) {
     logEvent("NoType");
   }
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 579785c..fac9391 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -1286,7 +1286,7 @@
     return token;
   }
 
-  Token parseWithClauseOpt(Token token) {
+  Token parseClassWithClauseOpt(Token token) {
     // <mixins> ::= with <typeNotVoidList>
     Token withKeyword = token.next!;
     if (optional('with', withKeyword)) {
@@ -1298,6 +1298,18 @@
     return token;
   }
 
+  Token parseEnumWithClauseOpt(Token token) {
+    // <mixins> ::= with <typeNotVoidList>
+    Token withKeyword = token.next!;
+    if (optional('with', withKeyword)) {
+      token = parseTypeList(withKeyword);
+      listener.handleEnumWithClause(withKeyword);
+    } else {
+      listener.handleEnumNoWithClause();
+    }
+    return token;
+  }
+
   /// Parse the formal parameters of a getter (which shouldn't have parameters)
   /// or function or method.
   Token parseGetterOrFormalParameters(
@@ -1930,35 +1942,45 @@
 
   /// ```
   /// enumType:
-  ///   metadata 'enum' id '{' metadata id [',' metadata id]* [','] '}'
-  /// ;
+  ///   metadata 'enum' id typeParameters? mixins? interfaces? '{'
+  ///      enumEntry (',' enumEntry)* (',')? (';'
+  ///      (metadata classMemberDefinition)*
+  ///      )?
+  ///   '}'
+  ///
+  /// enumEntry:
+  ///     metadata id argumentPart?
+  ///   | metadata id typeArguments? '.' id arguments
   /// ```
   Token parseEnum(Token enumKeyword) {
     assert(optional('enum', enumKeyword));
     listener.beginUncategorizedTopLevelDeclaration(enumKeyword);
-    listener.beginEnum(enumKeyword);
     Token token =
         ensureIdentifier(enumKeyword, IdentifierContext.enumDeclaration);
+    String name = token.lexeme;
+    listener.beginEnum(enumKeyword);
+    token = parseEnumHeaderOpt(token, enumKeyword);
     Token leftBrace = token.next!;
-    int count = 0;
+    int elementCount = 0;
+    int memberCount = 0;
     if (optional('{', leftBrace)) {
+      listener.handleEnumHeader(enumKeyword, leftBrace);
       token = leftBrace;
       while (true) {
         Token next = token.next!;
-        if (optional('}', next)) {
+        if (optional('}', next) || optional(';', next)) {
           token = next;
-          if (count == 0) {
+          if (elementCount == 0) {
             reportRecoverableError(token, codes.messageEnumDeclarationEmpty);
           }
           break;
         }
-        token = parseMetadataStar(token);
-        token = ensureIdentifier(token, IdentifierContext.enumValueDeclaration);
+        token = parseEnumElement(token);
         next = token.next!;
-        count++;
+        elementCount++;
         if (optional(',', next)) {
           token = next;
-        } else if (optional('}', next)) {
+        } else if (optional('}', next) || optional(';', next)) {
           token = next;
           break;
         } else {
@@ -1984,14 +2006,51 @@
           }
         }
       }
+      listener.handleEnumElements(token, elementCount);
+      if (optional(';', token)) {
+        while (notEofOrValue('}', token.next!)) {
+          token = parseClassOrMixinOrExtensionOrEnumMemberImpl(
+              token, DeclarationKind.Enum, name);
+          ++memberCount;
+        }
+        token = token.next!;
+        assert(token.isEof || optional('}', token));
+      }
     } else {
       // TODO(danrubel): merge this error message with missing class/mixin body
       leftBrace = ensureBlock(
           token, codes.templateExpectedEnumBody, /* missingBlockName = */ null);
+      listener.handleEnumHeader(enumKeyword, leftBrace);
+      listener.handleEnumElements(token, elementCount);
       token = leftBrace.endGroup!;
     }
     assert(optional('}', token));
-    listener.endEnum(enumKeyword, leftBrace, count);
+    listener.endEnum(enumKeyword, leftBrace, memberCount);
+    return token;
+  }
+
+  Token parseEnumHeaderOpt(Token token, Token enumKeyword) {
+    token = computeTypeParamOrArg(
+            token, /* inDeclaration = */ true, /* allowsVariance = */ true)
+        .parseVariables(token, this);
+    token = parseEnumWithClauseOpt(token);
+    token = parseClassOrMixinOrEnumImplementsOpt(token);
+    return token;
+  }
+
+  Token parseEnumElement(Token token) {
+    Token beginToken = token;
+    token = parseMetadataStar(token);
+    token = ensureIdentifier(token, IdentifierContext.enumValueDeclaration);
+    token = parseConstructorReference(token, ConstructorReferenceContext.Const,
+        /* typeArg = */ null, /* isImplicitTypeName = */ true);
+    Token next = token.next!;
+    if (optional('(', next) || optional('<', next)) {
+      token = parseConstructorInvocationArguments(token);
+    } else {
+      listener.handleNoArguments(token);
+    }
+    listener.handleEnumElement(beginToken);
     return token;
   }
 
@@ -2060,8 +2119,8 @@
 
   Token parseClassHeaderOpt(Token token, Token begin, Token classKeyword) {
     token = parseClassExtendsOpt(token);
-    token = parseWithClauseOpt(token);
-    token = parseClassOrMixinImplementsOpt(token);
+    token = parseClassWithClauseOpt(token);
+    token = parseClassOrMixinOrEnumImplementsOpt(token);
     Token? nativeToken;
     if (optional('native', token.next!)) {
       nativeToken = token.next!;
@@ -2127,7 +2186,7 @@
         }
       }
 
-      token = parseWithClauseOpt(token);
+      token = parseClassWithClauseOpt(token);
 
       if (recoveryListener.withKeyword != null) {
         if (hasWith) {
@@ -2142,7 +2201,7 @@
         }
       }
 
-      token = parseClassOrMixinImplementsOpt(token);
+      token = parseClassOrMixinOrEnumImplementsOpt(token);
 
       if (recoveryListener.implementsKeyword != null) {
         if (hasImplements) {
@@ -2204,7 +2263,7 @@
   ///   'implements' typeName (',' typeName)*
   /// ;
   /// ```
-  Token parseClassOrMixinImplementsOpt(Token token) {
+  Token parseClassOrMixinOrEnumImplementsOpt(Token token) {
     Token? implementsKeyword;
     int interfacesCount = 0;
     if (optional('implements', token.next!)) {
@@ -2215,7 +2274,7 @@
         ++interfacesCount;
       } while (optional(',', token.next!));
     }
-    listener.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
+    listener.handleImplements(implementsKeyword, interfacesCount);
     return token;
   }
 
@@ -2250,7 +2309,7 @@
 
   Token parseMixinHeaderOpt(Token token, Token mixinKeyword) {
     token = parseMixinOnOpt(token);
-    token = parseClassOrMixinImplementsOpt(token);
+    token = parseClassOrMixinOrEnumImplementsOpt(token);
     listener.handleMixinHeader(mixinKeyword);
     return token;
   }
@@ -2307,7 +2366,7 @@
         }
       }
 
-      token = parseClassOrMixinImplementsOpt(token);
+      token = parseClassOrMixinOrEnumImplementsOpt(token);
 
       if (recoveryListener.implementsKeyword != null) {
         if (hasImplements) {
@@ -3006,6 +3065,18 @@
             beforeStart.next!,
             token);
         break;
+      case DeclarationKind.Enum:
+        listener.endEnumFields(
+            abstractToken,
+            externalToken,
+            staticToken,
+            covariantToken,
+            lateToken,
+            varFinalOrConst,
+            fieldCount,
+            beforeStart.next!,
+            token);
+        break;
     }
     return token;
   }
@@ -3550,7 +3621,7 @@
     listener.beginClassOrMixinOrExtensionBody(kind, token);
     int count = 0;
     while (notEofOrValue('}', token.next!)) {
-      token = parseClassOrMixinOrExtensionMemberImpl(
+      token = parseClassOrMixinOrExtensionOrEnumMemberImpl(
           token, kind, enclosingDeclarationName);
       ++count;
     }
@@ -3572,7 +3643,7 @@
   /// token and returns the token after the last consumed token rather than the
   /// last consumed token.
   Token parseClassMember(Token token, String? className) {
-    return parseClassOrMixinOrExtensionMemberImpl(
+    return parseClassOrMixinOrExtensionOrEnumMemberImpl(
             syntheticPreviousToken(token), DeclarationKind.Class, className)
         .next!;
   }
@@ -3584,7 +3655,7 @@
   /// token and returns the token after the last consumed token rather than the
   /// last consumed token.
   Token parseMixinMember(Token token, String mixinName) {
-    return parseClassOrMixinOrExtensionMemberImpl(
+    return parseClassOrMixinOrExtensionOrEnumMemberImpl(
             syntheticPreviousToken(token), DeclarationKind.Mixin, mixinName)
         .next!;
   }
@@ -3596,8 +3667,10 @@
   /// token and returns the token after the last consumed token rather than the
   /// last consumed token.
   Token parseExtensionMember(Token token, String extensionName) {
-    return parseClassOrMixinOrExtensionMemberImpl(syntheticPreviousToken(token),
-            DeclarationKind.Extension, extensionName)
+    return parseClassOrMixinOrExtensionOrEnumMemberImpl(
+            syntheticPreviousToken(token),
+            DeclarationKind.Extension,
+            extensionName)
         .next!;
   }
 
@@ -3636,7 +3709,7 @@
   ///   methodDeclaration
   /// ;
   /// ```
-  Token parseClassOrMixinOrExtensionMemberImpl(
+  Token parseClassOrMixinOrExtensionOrEnumMemberImpl(
       Token token, DeclarationKind kind, String? enclosingDeclarationName) {
     Token beforeStart = token = parseMetadataStar(token);
 
@@ -4160,6 +4233,10 @@
           break;
         case DeclarationKind.TopLevel:
           throw "Internal error: TopLevel constructor.";
+        case DeclarationKind.Enum:
+          listener.endEnumConstructor(getOrSet, beforeStart.next!,
+              beforeParam.next!, beforeInitializers?.next, token);
+          break;
       }
     } else {
       //
@@ -4189,6 +4266,10 @@
           break;
         case DeclarationKind.TopLevel:
           throw "Internal error: TopLevel method.";
+        case DeclarationKind.Enum:
+          listener.endEnumMethod(getOrSet, beforeStart.next!, beforeParam.next!,
+              beforeInitializers?.next, token);
+          break;
       }
     }
     return token;
@@ -4281,6 +4362,11 @@
         break;
       case DeclarationKind.TopLevel:
         throw "Internal error: TopLevel factory.";
+      case DeclarationKind.Enum:
+        reportRecoverableError(
+            factoryKeyword, codes.messageEnumDeclaresFactory);
+        listener.endEnumFactoryMethod(beforeStart.next!, factoryKeyword, token);
+        break;
     }
     return token;
   }
@@ -4404,12 +4490,19 @@
 
   Token parseConstructorReference(
       Token token, ConstructorReferenceContext constructorReferenceContext,
-      [TypeParamOrArgInfo? typeArg]) {
-    Token start =
-        ensureIdentifier(token, IdentifierContext.constructorReference);
+      [TypeParamOrArgInfo? typeArg, bool isImplicitTypeName = false]) {
+    Token start;
+    if (isImplicitTypeName) {
+      listener.handleNoTypeNameInConstructorReference(token.next!);
+      start = token;
+    } else {
+      start = ensureIdentifier(token, IdentifierContext.constructorReference);
+    }
     listener.beginConstructorReference(start);
-    token = parseQualifiedRestOpt(
-        start, IdentifierContext.constructorReferenceContinuation);
+    if (!isImplicitTypeName) {
+      token = parseQualifiedRestOpt(
+          start, IdentifierContext.constructorReferenceContinuation);
+    }
     typeArg ??= computeTypeParamOrArg(token);
     token = typeArg.parseArguments(token, this);
     Token? period = null;
@@ -6063,8 +6156,8 @@
     }
 
     listener.beginNewExpression(newKeyword);
-    token = parseConstructorReference(
-        newKeyword, ConstructorReferenceContext.New, potentialTypeArg);
+    token = parseConstructorReference(newKeyword,
+        ConstructorReferenceContext.New, /* typeArg = */ potentialTypeArg);
     token = parseConstructorInvocationArguments(token);
     listener.endNewExpression(newKeyword);
     return token;
@@ -6075,7 +6168,7 @@
     Token begin = token.next!; // This is the class name.
     listener.beginImplicitCreationExpression(begin);
     token = parseConstructorReference(
-        token, ConstructorReferenceContext.Implicit, typeArg);
+        token, ConstructorReferenceContext.Implicit, /* typeArg = */ typeArg);
     token = parseConstructorInvocationArguments(token);
     listener.endImplicitCreationExpression(begin, openAngleBracket);
     return token;
@@ -6191,8 +6284,8 @@
       }
     }
     listener.beginConstExpression(constKeyword);
-    token = parseConstructorReference(
-        token, ConstructorReferenceContext.Const, potentialTypeArg);
+    token = parseConstructorReference(token, ConstructorReferenceContext.Const,
+        /* typeArg = */ potentialTypeArg);
     token = parseConstructorInvocationArguments(token);
     listener.endConstExpression(constKeyword);
     return token;
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/recovery_listeners.dart b/pkg/_fe_analyzer_shared/lib/src/parser/recovery_listeners.dart
index 5c24c53..7936de0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/recovery_listeners.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/recovery_listeners.dart
@@ -24,10 +24,9 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
     this.implementsKeyword = implementsKeyword;
-    super.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
+    super.handleImplements(implementsKeyword, interfacesCount);
   }
 
   @override
@@ -82,10 +81,9 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
     this.implementsKeyword = implementsKeyword;
-    super.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
+    super.handleImplements(implementsKeyword, interfacesCount);
   }
 
   @override
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
index 245bef3..fbc3ab3 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
@@ -37,6 +37,7 @@
   ConditionallySelectedImport,
   ConstructorInitializerSeparator,
   ConstructorInitializers,
+  ConstructorReference,
   ConstructorReferenceContinuationAfterTypeArguments,
   ContinueTarget,
   Deferred,
@@ -346,9 +347,8 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    debugEvent("ClassImplements");
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    debugEvent("Implements");
   }
 
   @override
diff --git a/pkg/analyzer/lib/dart/analysis/features.dart b/pkg/analyzer/lib/dart/analysis/features.dart
index 821e426..91c3a30 100644
--- a/pkg/analyzer/lib/dart/analysis/features.dart
+++ b/pkg/analyzer/lib/dart/analysis/features.dart
@@ -23,6 +23,9 @@
   static final control_flow_collections =
       ExperimentalFeatures.control_flow_collections;
 
+  /// Feature information for enhanced enums.
+  static final enhanced_enums = ExperimentalFeatures.enhanced_enums;
+
   /// Feature information for extension methods.
   static final extension_methods = ExperimentalFeatures.extension_methods;
 
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index e4fc9de..a376881 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -1593,6 +1593,9 @@
   /// Return the left curly bracket.
   Token get leftBracket;
 
+  /// Return the members declared by the enumeration.
+  NodeList<ClassMember> get members;
+
   @override
   SimpleIdentifier get name;
 
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index f005b49..f4c31cb 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -308,6 +308,7 @@
       SimpleIdentifier name,
       Token leftBracket,
       List<EnumConstantDeclaration> constants,
+      List<ClassMember> members,
       Token rightBracket);
 
   /// Returns a newly created export directive. Either or both of the
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 1738dc9..3ab0730 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -3301,6 +3301,9 @@
   /// The enumeration constants being declared.
   final NodeListImpl<EnumConstantDeclaration> _constants = NodeListImpl._();
 
+  /// The members defined by the enum.
+  final NodeListImpl<ClassMember> _members = NodeListImpl._();
+
   /// The right curly bracket.
   @override
   Token rightBracket;
@@ -3316,9 +3319,11 @@
       SimpleIdentifierImpl name,
       this.leftBracket,
       List<EnumConstantDeclaration> constants,
+      List<ClassMember> members,
       this.rightBracket)
       : super(comment, metadata, name) {
     _constants._initialize(this, constants);
+    _members._initialize(this, members);
   }
 
   @override
@@ -3328,6 +3333,7 @@
     ..add(_name)
     ..add(leftBracket)
     ..addAll(_constants)
+    ..addAll(_members)
     ..add(rightBracket);
 
   @override
@@ -3343,6 +3349,9 @@
   Token get firstTokenAfterCommentAndMetadata => enumKeyword;
 
   @override
+  NodeListImpl<ClassMember> get members => _members;
+
+  @override
   E? accept<E>(AstVisitor<E> visitor) => visitor.visitEnumDeclaration(this);
 
   @override
@@ -3350,6 +3359,7 @@
     super.visitChildren(visitor);
     _name.accept(visitor);
     _constants.accept(visitor);
+    _members.accept(visitor);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index da92510..b7a9b76 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -391,9 +391,17 @@
           SimpleIdentifier name,
           Token leftBracket,
           List<EnumConstantDeclaration> constants,
+          List<ClassMember> members,
           Token rightBracket) =>
-      EnumDeclarationImpl(comment as CommentImpl?, metadata, enumKeyword,
-          name as SimpleIdentifierImpl, leftBracket, constants, rightBracket);
+      EnumDeclarationImpl(
+          comment as CommentImpl?,
+          metadata,
+          enumKeyword,
+          name as SimpleIdentifierImpl,
+          leftBracket,
+          constants,
+          members,
+          rightBracket);
 
   @override
   ExportDirectiveImpl exportDirective(
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index b8539bd..6cfd05b 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -62,6 +62,8 @@
     show
         ClassDeclarationImpl,
         CompilationUnitImpl,
+        ConstructorNameImpl,
+        EnumDeclarationImpl,
         ExtensionDeclarationImpl,
         ImportDirectiveImpl,
         MethodInvocationImpl,
@@ -104,6 +106,9 @@
   /// The extension currently being parsed, or `null` if none.
   ExtensionDeclarationImpl? extensionDeclaration;
 
+  /// The enum currently being parsed, or `null` if none.
+  EnumDeclarationImpl? enumDeclaration;
+
   /// If true, this is building a full AST. Otherwise, only create method
   /// bodies.
   final bool isFullAst;
@@ -153,6 +158,9 @@
   /// `true` if super parameters are enabled
   final bool enableSuperParameters;
 
+  /// `true` if enhanced enums are enabled
+  final bool enableEnhancedEnums;
+
   final FeatureSet _featureSet;
 
   AstBuilder(ErrorReporter? errorReporter, this.fileUri, this.isFullAst,
@@ -174,6 +182,7 @@
         enableNamedArgumentsAnywhere =
             _featureSet.isEnabled(Feature.named_arguments_anywhere),
         enableSuperParameters = _featureSet.isEnabled(Feature.super_parameters),
+        enableEnhancedEnums = _featureSet.isEnabled(Feature.enhanced_enums),
         uri = uri ?? fileUri;
 
   NodeList<ClassMember> get currentDeclarationMembers {
@@ -181,8 +190,10 @@
       return classDeclaration!.members;
     } else if (mixinDeclaration != null) {
       return mixinDeclaration!.members;
-    } else {
+    } else if (extensionDeclaration != null) {
       return extensionDeclaration!.members;
+    } else {
+      return enumDeclaration!.members;
     }
   }
 
@@ -191,8 +202,10 @@
       return classDeclaration!.name;
     } else if (mixinDeclaration != null) {
       return mixinDeclaration!.name;
-    } else {
+    } else if (extensionDeclaration != null) {
       return extensionDeclaration!.name;
+    } else {
+      return enumDeclaration!.name;
     }
   }
 
@@ -240,6 +253,9 @@
   }
 
   @override
+  void beginEnum(Token enumKeyword) {}
+
+  @override
   void beginExtensionDeclaration(Token extensionKeyword, Token? nameToken) {
     assert(optional('extension', extensionKeyword));
     assert(classDeclaration == null &&
@@ -334,11 +350,7 @@
     }
     if (staticToken != null) {
       assert(staticToken.isModifier);
-      String? className = classDeclaration != null
-          ? classDeclaration!.name.name
-          : (mixinDeclaration != null
-              ? mixinDeclaration!.name.name
-              : extensionDeclaration!.name?.name);
+      String? className = currentDeclarationName?.name;
       if (name.lexeme != className || getOrSet != null) {
         modifiers.staticKeyword = staticToken;
       }
@@ -1177,17 +1189,18 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
     assert(optional('enum', enumKeyword));
     assert(optional('{', leftBrace));
     debugEvent("Enum");
+  }
 
-    var constants = popTypedList2<EnumConstantDeclaration>(count);
-    var name = pop() as SimpleIdentifier;
-    var metadata = pop() as List<Annotation>?;
-    var comment = _findComment(metadata, enumKeyword);
-    declarations.add(ast.enumDeclaration(comment, metadata, enumKeyword, name,
-        leftBrace, constants, leftBrace.endGroup!));
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    debugEvent("endEnumConstructor");
+    endClassConstructor(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
   }
 
   @override
@@ -2647,20 +2660,6 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    assert(optionalOrNull('implements', implementsKeyword));
-    debugEvent("ClassImplements");
-
-    if (implementsKeyword != null) {
-      var interfaces = popTypedList2<NamedType>(interfacesCount);
-      push(ast.implementsClause(implementsKeyword, interfaces));
-    } else {
-      push(NullValue.IdentifierList);
-    }
-  }
-
-  @override
   void handleClassWithClause(Token withKeyword) {
     assert(optional('with', withKeyword));
     var mixinTypes = pop() as List<NamedType>;
@@ -2736,6 +2735,101 @@
   }
 
   @override
+  void handleEnumElement(Token beginToken) {
+    debugEvent("EnumElement");
+    var arguments = pop() as MethodInvocationImpl?;
+    var constructorName = pop() as ConstructorNameImpl?;
+
+    if (!enableEnhancedEnums &&
+        (arguments != null ||
+            constructorName != null &&
+                (constructorName.type2.typeArguments != null ||
+                    constructorName.name != null))) {
+      Token token = arguments != null
+          ? arguments.argumentList.beginToken
+          : constructorName!.beginToken;
+      var feature = ExperimentalFeatures.enhanced_enums;
+      handleRecoverableError(
+        templateExperimentNotEnabled.withArguments(
+          feature.enableString,
+          _versionAsString(ExperimentStatus.currentVersion),
+        ),
+        token,
+        token,
+      );
+    }
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    debugEvent("EnumElements");
+
+    var constants = popTypedList2<EnumConstantDeclaration>(elementsCount);
+    enumDeclaration!.constants.addAll(constants);
+
+    if (!enableEnhancedEnums && optional(';', elementsEndToken)) {
+      var feature = ExperimentalFeatures.enhanced_enums;
+      handleRecoverableError(
+        templateExperimentNotEnabled.withArguments(
+          feature.enableString,
+          _versionAsString(ExperimentStatus.currentVersion),
+        ),
+        elementsEndToken,
+        elementsEndToken,
+      );
+    }
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    assert(optional('enum', enumKeyword));
+    assert(optional('{', leftBrace));
+    debugEvent("EnumHeader");
+
+    var implementsClause = pop(NullValue.IdentifierList) as ImplementsClause?;
+    var withClause = pop(NullValue.WithClause) as WithClause?;
+    var typeParameters = pop() as TypeParameterList?;
+    var name = pop() as SimpleIdentifier;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, enumKeyword);
+
+    if (!enableEnhancedEnums &&
+        (withClause != null ||
+            implementsClause != null ||
+            typeParameters != null)) {
+      var token = withClause != null
+          ? withClause.withKeyword
+          : implementsClause != null
+              ? implementsClause.implementsKeyword
+              : typeParameters!.beginToken;
+      var feature = ExperimentalFeatures.enhanced_enums;
+      handleRecoverableError(
+        templateExperimentNotEnabled.withArguments(
+          feature.enableString,
+          _versionAsString(ExperimentStatus.currentVersion),
+        ),
+        token,
+        token,
+      );
+    }
+
+    declarations.add(enumDeclaration = ast.enumDeclaration(comment, metadata,
+        enumKeyword, name, leftBrace, [], [], leftBrace.endGroup!));
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    push(NullValue.WithClause);
+  }
+
+  @override
+  void handleEnumWithClause(Token withKeyword) {
+    assert(optional('with', withKeyword));
+    var mixinTypes = pop() as List<NamedType>;
+    push(ast.withClause(withKeyword, mixinTypes));
+  }
+
+  @override
   void handleErrorToken(ErrorToken token) {
     translateErrorToken(token, errorReporter.reportScannerError);
   }
@@ -2963,6 +3057,19 @@
   }
 
   @override
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    assert(optionalOrNull('implements', implementsKeyword));
+    debugEvent("Implements");
+
+    if (implementsKeyword != null) {
+      var interfaces = popTypedList2<NamedType>(interfacesCount);
+      push(ast.implementsClause(implementsKeyword, interfaces));
+    } else {
+      push(NullValue.IdentifierList);
+    }
+  }
+
+  @override
   void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
     assert(optionalOrNull('deferred', deferredKeyword));
     assert(optionalOrNull('as', asKeyword));
@@ -3405,6 +3512,14 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    debugEvent("NoTypeNameInConstructorReference");
+    assert(enumDeclaration != null);
+
+    push(ast.simpleIdentifier(enumDeclaration!.name.token));
+  }
+
+  @override
   void handleNoVariableInitializer(Token token) {
     debugEvent("NoVariableInitializer");
   }
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
index abbc7bb..e05cbc0 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -467,6 +467,7 @@
           name,
           TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
           constants,
+          [],
           TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
 
   static EnumDeclarationImpl enumDeclaration2(
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index ecce608..f40c8da 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -732,9 +732,56 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
     end('Enum');
-    super.endEnum(enumKeyword, leftBrace, count);
+    super.endEnum(enumKeyword, leftBrace, memberCount);
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    end('Method');
+    super.endEnumConstructor(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    end('FactoryMethod');
+    super.endEnumFactoryMethod(beginToken, factoryKeyword, endToken);
+  }
+
+  @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    expectIn('Member');
+    super.endEnumFields(
+        abstractToken,
+        externalToken,
+        staticToken,
+        covariantToken,
+        lateToken,
+        varFinalOrConst,
+        count,
+        beginToken,
+        endToken);
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    end('Method');
+    super.endEnumMethod(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
   }
 
   @override
@@ -1284,25 +1331,54 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    expectInOneOf(['ClassDeclaration', 'MixinDeclaration']);
-    listener?.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
-  }
-
-  @override
   void handleDottedName(int count, Token firstIdentifier) {
     expectIn('ConditionalUri');
     super.handleDottedName(count, firstIdentifier);
   }
 
   @override
+  void handleEnumElement(Token beginToken) {
+    expectIn('Enum');
+    super.handleEnumElement(beginToken);
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    expectIn('Enum');
+    super.handleEnumElements(elementsEndToken, elementsCount);
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    expectIn('Enum');
+    super.handleEnumHeader(enumKeyword, leftBrace);
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    expectIn('Enum');
+    super.handleEnumNoWithClause();
+  }
+
+  @override
+  void handleEnumWithClause(Token withKeyword) {
+    expectIn('Enum');
+    super.handleEnumWithClause(withKeyword);
+  }
+
+  @override
   void handleIdentifierList(int count) {
     expectInOneOf(['Hide', 'Show']);
     super.handleIdentifierList(count);
   }
 
   @override
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    expectInOneOf(['ClassDeclaration', 'MixinDeclaration', 'Enum']);
+    listener?.handleImplements(implementsKeyword, interfacesCount);
+  }
+
+  @override
   void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
     // This event normally happens within "Import",
     // but happens within "CompilationUnit" during recovery.
@@ -1347,6 +1423,12 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    expectIn('Enum');
+    super.handleNoTypeNameInConstructorReference(token);
+  }
+
+  @override
   void handleRecoverClassHeader() {
     expectIn('ClassDeclaration');
     listener?.handleRecoverClassHeader();
diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart
index ba38b99..2e58862 100644
--- a/pkg/analyzer/tool/summary/mini_ast.dart
+++ b/pkg/analyzer/tool/summary/mini_ast.dart
@@ -285,16 +285,14 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void endConstructorReference(Token start, Token? periodBeforeName,
+      Token endToken, ConstructorReferenceContext constructorReferenceContext) {
+    debugEvent("ConstructorReference");
+  }
+
+  @override
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
     debugEvent("Enum");
-    var constants =
-        List<EnumConstantDeclaration?>.filled(count, null, growable: true);
-    popList(count, constants);
-    var name = pop() as String;
-    var metadata = popTypedList<Annotation>();
-    var comment = pop() as Comment?;
-    compilationUnit.declarations.add(EnumDeclaration(
-        comment, metadata, name, constants.whereNotNull().toList()));
   }
 
   @override
@@ -422,6 +420,37 @@
   }
 
   @override
+  void handleEnumElement(Token beginToken) {
+    debugEvent("EnumElement");
+    pop(); // Arguments.
+    pop(); // Type arguments.
+  }
+
+  @override
+  void handleEnumElements(Token endToken, int count) {
+    debugEvent("EnumElements");
+    var constants =
+        List<EnumConstantDeclaration?>.filled(count, null, growable: true);
+    popList(count, constants);
+    pop(); // Type variables.
+    var name = pop() as String;
+    var metadata = popTypedList<Annotation>();
+    var comment = pop() as Comment?;
+    compilationUnit.declarations.add(EnumDeclaration(
+        comment, metadata, name, constants.whereNotNull().toList()));
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    debugEvent("EnumHeader");
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    debugEvent("NoEnumWithClause");
+  }
+
+  @override
   void handleFormalParameterWithoutValue(Token token) {
     debugEvent("FormalParameterWithoutValue");
   }
@@ -540,6 +569,11 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    debugEvent("NoTypeNameInConstructorReference");
+  }
+
+  @override
   void handleQualified(Token period) {
     debugEvent("Qualified");
     var suffix = pop() as String;
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index 2a94404..ecc964c 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -120,7 +120,8 @@
       int startCharOffset,
       int charOffset,
       int charEndOffset,
-      IndexedClass? referencesFromIndexed) {
+      IndexedClass? referencesFromIndexed,
+      Scope scope) {
     assert(enumConstantInfos == null || enumConstantInfos.isNotEmpty);
 
     Uri fileUri = parent.fileUri;
@@ -170,6 +171,7 @@
         reference: referencesFromIndexed?.cls.reference,
         fileUri: fileUri);
     Map<String, MemberBuilder> members = <String, MemberBuilder>{};
+    Map<String, MemberBuilder> setters = <String, MemberBuilder>{};
     Map<String, MemberBuilder> constructors = <String, MemberBuilder>{};
     NamedTypeBuilder selfType = new NamedTypeBuilder(
         name,
@@ -357,11 +359,18 @@
     }
     final int startCharOffsetComputed =
         metadata == null ? startCharOffset : metadata.first.charOffset;
+    scope.forEachLocalMember((name, member) {
+      members[name] = member as MemberBuilder;
+    });
+    scope.forEachLocalSetter((name, member) {
+      setters[name] = member;
+    });
     EnumBuilder enumBuilder = new EnumBuilder.internal(
         metadata,
         name,
         new Scope(
             local: members,
+            setters: setters,
             parent: parent.scope,
             debugName: "enum $name",
             isModifiable: false),
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index a1e2b88..86edd9f 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -176,6 +176,11 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    debugEvent("NoTypeNameInConstructorReference");
+  }
+
+  @override
   void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
     debugEvent("NoConstructorReferenceContinuationAfterTypeArguments");
   }
@@ -212,11 +217,26 @@
   }
 
   @override
+  void handleEnumWithClause(Token withKeyword) {
+    debugEvent("EnumWithClause");
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    debugEvent("EnumNoWithClause");
+  }
+
+  @override
   void endTypeArguments(int count, Token beginToken, Token endToken) {
     debugEvent("TypeArguments");
   }
 
   @override
+  void endArguments(int count, Token beginToken, Token endToken) {
+    debugEvent("Arguments");
+  }
+
+  @override
   void handleInvalidTypeArguments(Token token) {
     debugEvent("InvalidTypeArguments");
   }
@@ -939,12 +959,103 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void beginEnum(Token enumKeyword) {
+    assert(checkState(enumKeyword, [ValueKinds.NameOrParserRecovery]));
     debugEvent("Enum");
-    const FixedNullableList<Object>().pop(stack, count * 2);
-    pop(); // Name.
-    pop(); // Annotations begin token.
+    Object? name = pop();
+
+    assert(currentDeclaration == null);
+    assert(memberScope == libraryBuilder.scope);
+
+    if (name is ParserRecovery) {
+      currentClassIsParserRecovery = true;
+      return;
+    }
+
+    currentDeclaration =
+        lookupBuilder(enumKeyword, null, name as String) as DeclarationBuilder;
+    memberScope = currentDeclaration!.scope;
+  }
+
+  @override
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+    debugEvent("Enum");
     checkEmpty(enumKeyword.charOffset);
+    currentDeclaration = null;
+    memberScope = libraryBuilder.scope;
+  }
+
+  @override
+  void handleEnumElement(Token beginKeyword) {
+    debugEvent("EnumElement");
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    debugEvent("EnumElements");
+    const FixedNullableList<Object>().pop(stack, elementsCount * 2);
+    pop(); // Annotations begin token.
+    checkEmpty(elementsEndToken.charOffset);
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    debugEvent("EnumHeader");
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(chloestefantsova): Call endClassConstructor instead.
+    debugEvent("EnumConstructor");
+    pop(); // bodyToken
+    pop(); // name
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    // Skip the declaration. An error as already been produced by the parser.
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    // TODO(chloestefantsova): Call endClassFactoryMethod instead.
+    debugEvent("EnumFactoryMethod");
+    pop(); // bodyToken
+    pop(); // name
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    // Skip the declaration. An error as already been produced by the parser.
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(chloestefantsova): Call endClassMethod instead.
+    debugEvent("EnumMethod");
+    pop(); // bodyToken
+    pop(); // name
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    // Skip the declaration. An error as already been produced by the parser.
+  }
+
+  @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    // TODO(chloestefantsova): Call endClassFields instead.
+    debugEvent("EnumFields");
+    const FixedNullableList<String>().pop(stack, count); // names
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    // Skip the declaration. An error as already been produced by the parser.
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 358b947..0d7fc82 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -309,6 +309,33 @@
   /// This includes type of the declaration but excludes annotations on the
   /// field declaration itself, which are seen in the [ExtensionBody] context.
   ExtensionStaticField,
+
+  /// In a generative constructor declaration inside an enum declaration.
+  EnumConstructor,
+
+  /// In a static method declaration inside an enum declaration.
+  EnumStaticMethod,
+
+  /// In a static field declaration inside an enum declaration.
+  EnumStaticField,
+
+  /// In an instance method declaration inside an enum declaration.
+  EnumInstanceMethod,
+
+  /// In an instance field declaration inside an enum declaration.
+  EnumInstanceField,
+
+  /// In a factory constructor declaration inside an enum declaration. This
+  /// is an error case.
+  ///
+  /// This excludes annotations on the constructor declaration itself, which
+  /// are seen in the [EnumBody] context.
+  EnumFactory,
+
+  /// In an enum declaration body.
+  ///
+  /// This includes annotations on extension member declarations.
+  EnumBody,
 }
 
 extension on DeclarationContext {
@@ -318,7 +345,6 @@
       case DeclarationContext.Typedef:
       case DeclarationContext.TopLevelMethod:
       case DeclarationContext.TopLevelField:
-      case DeclarationContext.Enum:
         return InstanceTypeVariableAccessState.Unexpected;
       case DeclarationContext.ClassOrMixinOrNamedMixinApplication:
       case DeclarationContext.NamedMixinApplication:
@@ -327,6 +353,10 @@
       case DeclarationContext.ClassFactory:
       case DeclarationContext.ClassInstanceMethod:
       case DeclarationContext.ClassInstanceField:
+      case DeclarationContext.Enum:
+      case DeclarationContext.EnumConstructor:
+      case DeclarationContext.EnumInstanceField:
+      case DeclarationContext.EnumInstanceMethod:
       case DeclarationContext.Mixin:
       case DeclarationContext.MixinInstanceMethod:
       case DeclarationContext.MixinInstanceField:
@@ -337,6 +367,9 @@
       case DeclarationContext.ClassBody:
       case DeclarationContext.ClassStaticMethod:
       case DeclarationContext.ClassStaticField:
+      case DeclarationContext.EnumStaticField:
+      case DeclarationContext.EnumStaticMethod:
+      case DeclarationContext.EnumBody:
       case DeclarationContext.MixinBody:
       case DeclarationContext.MixinStaticMethod:
       case DeclarationContext.MixinStaticField:
@@ -349,6 +382,7 @@
       case DeclarationContext.ExtensionConstructor:
       case DeclarationContext.ExtensionFactory:
       case DeclarationContext.ExtensionInstanceField:
+      case DeclarationContext.EnumFactory:
         return InstanceTypeVariableAccessState.Invalid;
     }
   }
@@ -824,6 +858,9 @@
       case DeclarationKind.Extension:
         declarationContext = DeclarationContext.ExtensionBody;
         break;
+      case DeclarationKind.Enum:
+        declarationContext = DeclarationContext.Enum;
+        break;
     }
     pushDeclarationContext(declarationContext);
     if (kind == DeclarationKind.Extension) {
@@ -876,12 +913,21 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    debugEvent("ClassOrMixinImplements");
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    debugEvent("Implements");
     push(const FixedNullableList<TypeBuilder>()
             .popNonNullable(stack, interfacesCount, dummyTypeBuilder) ??
         NullValue.TypeBuilderList);
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary &&
+        implementsKeyword != null &&
+        declarationContext == DeclarationContext.Enum) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          implementsKeyword.charOffset,
+          -1);
+    }
   }
 
   @override
@@ -1457,6 +1503,14 @@
           declarationContext = DeclarationContext.ExtensionInstanceMethod;
         }
         break;
+      case DeclarationKind.Enum:
+        if (inConstructor) {
+          declarationContext = DeclarationContext.EnumConstructor;
+        } else if (staticToken != null) {
+          declarationContext = DeclarationContext.EnumStaticMethod;
+        } else {
+          declarationContext = DeclarationContext.EnumInstanceMethod;
+        }
     }
     pushDeclarationContext(declarationContext);
 
@@ -1910,6 +1964,12 @@
   }
 
   @override
+  void endArguments(int count, Token beginToken, Token endToken) {
+    debugEvent("Arguments");
+    push(NullValue.Arguments);
+  }
+
+  @override
   void handleInvalidTypeArguments(Token token) {
     debugEvent("InvalidTypeArguments");
     pop(NullValue.TypeArguments);
@@ -1959,12 +2019,31 @@
   }
 
   @override
+  void handleNoArguments(Token token) {
+    debugEvent("NoArguments");
+    push(NullValue.Arguments);
+  }
+
+  @override
   void handleNoTypeVariables(Token token) {
     super.handleNoTypeVariables(token);
     inConstructorName = false;
   }
 
   @override
+  void handleNoTypeArguments(Token token) {
+    debugEvent("NoTypeArguments");
+    push(NullValue.TypeArguments);
+  }
+
+  @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    debugEvent("NoTypeNameInConstructorReference");
+    push(NullValue.Name);
+    push(token.charOffset);
+  }
+
+  @override
   void handleVoidKeyword(Token token) {
     debugEvent("VoidKeyword");
     push(libraryBuilder.addVoidType(token.charOffset));
@@ -2168,23 +2247,70 @@
 
   @override
   void beginEnum(Token enumKeyword) {
+    assert(checkState(
+        enumKeyword, [ValueKinds.Integer, ValueKinds.NameOrParserRecovery]));
+    int offset = pop() as int;
+    Object? name = pop();
+    push(name);
+    push(offset);
+
+    String declarationName;
+    if (name is String) {
+      declarationName = name;
+    } else {
+      declarationName = '#enum';
+    }
     pushDeclarationContext(DeclarationContext.Enum);
+    libraryBuilder.beginNestedDeclaration(
+        TypeParameterScopeKind.enumDeclaration, declarationName);
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
-    debugEvent("Enum");
+  void handleEnumElement(Token beginToken) {
+    debugEvent("EnumElements");
+    pop(); // arguments.
+    pop(); // constructor reference.
+    // Keep on the stack the EnumConstantInfo created in handleIdentifier.
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    debugEvent("EnumHeader");
+    push(enumKeyword.charOffset); // start char offset.
+    push(leftBrace.endGroup!.charOffset); // end char offset.
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    debugEvent("EnumElements");
     List<EnumConstantInfo?>? enumConstantInfos =
-        const FixedNullableList<EnumConstantInfo>().pop(stack, count);
+        const FixedNullableList<EnumConstantInfo>().pop(stack, elementsCount);
+    int endCharOffset = popCharOffset();
+    int startCharOffset = popCharOffset();
+    pop() as List<TypeBuilder>?; // interfaces.
+    pop() as List<TypeBuilder>?; // mixins.
+    List<TypeVariableBuilder>? typeVariables =
+        pop() as List<TypeVariableBuilder>?;
     int charOffset = popCharOffset(); // identifier char offset.
-    int startCharOffset = enumKeyword.charOffset;
     Object? name = pop();
     List<MetadataBuilder>? metadata = pop() as List<MetadataBuilder>?;
-    checkEmpty(enumKeyword.charOffset);
+    checkEmpty(startCharOffset);
+
     if (name is! ParserRecovery) {
       libraryBuilder.addEnum(metadata, name as String, enumConstantInfos,
-          startCharOffset, charOffset, leftBrace.endGroup!.charOffset);
+          startCharOffset, charOffset, endCharOffset);
+    } else {
+      libraryBuilder
+          .endNestedDeclaration(
+              TypeParameterScopeKind.enumDeclaration, "<syntax-error>")
+          .resolveNamedTypes(typeVariables, libraryBuilder);
     }
+  }
+
+  @override
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+    debugEvent("Enum");
+    checkEmpty(enumKeyword.charOffset);
     popDeclarationContext(DeclarationContext.Enum);
   }
 
@@ -2413,6 +2539,12 @@
           declarationContext = DeclarationContext.ExtensionInstanceField;
         }
         break;
+      case DeclarationKind.Enum:
+        if (staticToken != null) {
+          declarationContext = DeclarationContext.EnumStaticMethod;
+        } else {
+          declarationContext = DeclarationContext.EnumInstanceMethod;
+        }
     }
     pushDeclarationContext(declarationContext);
   }
@@ -2588,6 +2720,15 @@
   void endTypeVariables(Token beginToken, Token endToken) {
     debugEvent("endTypeVariables");
 
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary &&
+        declarationContext == DeclarationContext.Enum) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+
     // Peek to leave type parameters on top of stack.
     List<TypeVariableBuilder>? typeParameters =
         peek() as List<TypeVariableBuilder>?;
@@ -2681,12 +2822,44 @@
     String? suffix = popIfNotNull(periodBeforeName) as String?;
     List<TypeBuilder>? typeArguments = pop() as List<TypeBuilder>?;
     int charOffset = popCharOffset();
-    Object name = pop()!;
+    Object? name = pop();
     if (name is ParserRecovery) {
       push(name);
-    } else {
+    } else if (name != null) {
       push(libraryBuilder.addConstructorReference(
           name, typeArguments, suffix, charOffset));
+    } else {
+      assert(name == null);
+      // At the moment, the name of the type in a constructor reference can be
+      // omitted only within an enum element declaration.
+      if (libraryBuilder.currentTypeParameterScopeBuilder.kind ==
+          TypeParameterScopeKind.enumDeclaration) {
+        if (libraryBuilder.enableEnhancedEnumsInLibrary) {
+          push(libraryBuilder.addConstructorReference(
+              libraryBuilder.currentTypeParameterScopeBuilder.name,
+              typeArguments,
+              suffix,
+              charOffset));
+        } else {
+          // For entries that consist of their name only, all of the elements
+          // of the constructor reference should be null.
+          if (typeArguments != null || suffix != null) {
+            addProblem(
+                templateExperimentNotEnabled.withArguments(
+                    'enhanced-enums',
+                    libraryBuilder.enableEnhancedEnumsVersionInLibrary
+                        .toText()),
+                charOffset,
+                -1);
+          }
+          push(NullValue.ConstructorReference);
+        }
+      } else {
+        internalProblem(
+            messageInternalProblemOmittedTypeNameInConstructorReference,
+            charOffset,
+            uri);
+      }
     }
   }
 
@@ -2706,6 +2879,9 @@
       case DeclarationKind.Extension:
         declarationContext = DeclarationContext.ExtensionFactory;
         break;
+      case DeclarationKind.Enum:
+        declarationContext = DeclarationContext.EnumFactory;
+        break;
     }
 
     pushDeclarationContext(declarationContext);
@@ -2780,6 +2956,150 @@
   }
 
   @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    // TODO(cstefantsova): Call endClassFactoryMethod instead.
+    debugEvent("EnumFactoryMethod");
+    MethodBody bodyKind = pop() as MethodBody;
+    if (bodyKind == MethodBody.RedirectingFactoryBody) {
+      pop(); // reference
+    }
+    pop(); // async marker
+    pop(); // formals
+    popCharOffset(); // formals char offset
+    pop(); // type variables
+    popCharOffset(); // char offset
+    pop(); // name
+    pop(); // modifiers
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    popDeclarationContext();
+    // TODO(cstefantsova): Use actual type parameters.
+    libraryBuilder
+        .endNestedDeclaration(
+            TypeParameterScopeKind.factoryMethod, "#factory_method")
+        .resolveNamedTypes([], libraryBuilder);
+    // Skip the declaration. An error as already been produced by the parser.
+
+    if (libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(messageEnumDeclaresFactory, beginToken.charOffset, -1);
+    } else {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(cstefantsova): Call endClassMethod instead.
+    debugEvent("EnumMethod");
+    MethodBody bodyKind = pop() as MethodBody;
+    if (bodyKind == MethodBody.RedirectingFactoryBody) {
+      pop(); // reference
+    }
+    pop(); // async marker
+    pop(); // formals
+    popCharOffset(); // formals char offset
+    pop(); // type variables
+    popCharOffset(); // char offset
+    pop(); // name
+    pop(); // return type
+    int modifiers = Modifier.toMask(pop() as List<Modifier>?);
+    popCharOffset(); // final or const offset
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    popDeclarationContext();
+    TypeParameterScopeKind scopeKind;
+    if ((modifiers & staticMask) != 0) {
+      scopeKind = TypeParameterScopeKind.staticMethod;
+    } else {
+      scopeKind = TypeParameterScopeKind.instanceMethod;
+    }
+    // TODO(cstefantsova): Use actual type parameters.
+    libraryBuilder
+        .endNestedDeclaration(scopeKind, "#method")
+        .resolveNamedTypes([], libraryBuilder);
+    // Skip the declaration. An error as already been produced by the parser.
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+  }
+
+  @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    // TODO(cstefantsova): Call endClassFields instead.
+    debugEvent("EnumFields");
+    popFieldInfos(count); // field infos
+    pop(); // type
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    popDeclarationContext();
+    // Skip the declaration. An error as already been produced by the parser.
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(cstefantsova): Call endClassConstructor instead.
+    debugEvent("EnumMethod");
+    MethodBody bodyKind = pop() as MethodBody;
+    if (bodyKind == MethodBody.RedirectingFactoryBody) {
+      pop(); // reference
+    }
+    pop(); // async marker
+    pop(); // formals
+    popCharOffset(); // formals char offset
+    pop(); // type variables
+    popCharOffset(); // char offset
+    pop(); // name
+    pop(); // return type
+    pop(); // modifiers
+    popCharOffset(); // final or const offset
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    popDeclarationContext();
+    // TODO(cstefantsova): Use actual type parameters.
+    libraryBuilder
+        .endNestedDeclaration(TypeParameterScopeKind.instanceMethod, "#method")
+        .resolveNamedTypes([], libraryBuilder);
+    // Skip the declaration. An error as already been produced by the parser.
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+  }
+
+  @override
   void endRedirectingFactoryBody(Token beginToken, Token endToken) {
     debugEvent("RedirectingFactoryBody");
     push(MethodBody.RedirectingFactoryBody);
@@ -2869,6 +3189,33 @@
   }
 
   @override
+  void handleEnumWithClause(Token withKeyword) {
+    debugEvent("EnumWithClause");
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          withKeyword.charOffset,
+          -1);
+    }
+
+    Object? mixins = pop();
+    if (mixins is ParserRecovery) {
+      push(new ParserRecovery(withKeyword.charOffset));
+    } else {
+      // TODO(cstefantsova): Handle enum mixins here.
+      push(mixins);
+    }
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    debugEvent("EnumNoWithClause");
+    push(NullValue.TypeBuilderList);
+  }
+
+  @override
   void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
     debugEvent("ClassHeader");
     nativeMethodName = null;
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 01b9d91..cf7b0ba 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -319,10 +319,12 @@
   Version? _enableExtensionTypesVersionInLibrary;
   Version? _enableNamedArgumentsAnywhereVersionInLibrary;
   Version? _enableSuperParametersVersionInLibrary;
+  Version? _enableEnhancedEnumsVersionInLibrary;
   bool? _enableTripleShiftInLibrary;
   bool? _enableExtensionMethodsInLibrary;
   bool? _enableGenericMetadataInLibrary;
   bool? _enableExtensionTypesInLibrary;
+  bool? _enableEnhancedEnumsInLibrary;
   bool? _enableConstructorTearOffsInLibrary;
   bool? _enableNamedArgumentsAnywhereInLibrary;
   bool? _enableSuperParametersInLibrary;
@@ -424,6 +426,17 @@
           .getExperimentEnabledVersionInLibrary(
               ExperimentalFlag.superParameters, _packageUri ?? importUri);
 
+  bool get enableEnhancedEnumsInLibrary => _enableEnhancedEnumsInLibrary ??=
+      loader.target.isExperimentEnabledInLibraryByVersion(
+          ExperimentalFlag.enhancedEnums,
+          _packageUri ?? importUri,
+          languageVersion.version);
+
+  Version get enableEnhancedEnumsVersionInLibrary =>
+      _enableEnhancedEnumsVersionInLibrary ??= loader.target
+          .getExperimentEnabledVersionInLibrary(
+              ExperimentalFlag.enhancedEnums, _packageUri ?? importUri);
+
   void _updateLibraryNNBDSettings() {
     library.isNonNullableByDefault = isNonNullableByDefault;
     switch (loader.nnbdMode) {
@@ -2677,6 +2690,11 @@
       referencesFromIndexedClass =
           referencesFromIndexed!.lookupIndexedClass(name);
     }
+    // Nested declaration began in `OutlineBuilder.beginEnum`.
+    // TODO(cstefantsova): Use actual type variables here.
+    TypeParameterScopeBuilder declaration =
+        endNestedDeclaration(TypeParameterScopeKind.enumDeclaration, name)
+          ..resolveNamedTypes([], this);
     EnumBuilder builder = new EnumBuilder(
         metadata,
         name,
@@ -2685,7 +2703,13 @@
         startCharOffset,
         charOffset,
         charEndOffset,
-        referencesFromIndexedClass);
+        referencesFromIndexedClass,
+        new Scope(
+            local: declaration.members!,
+            setters: declaration.setters!,
+            parent: scope.withTypeVariables(<TypeVariableBuilder>[]),
+            debugName: "enum $name",
+            isModifiable: false));
     addBuilder(name, builder, charOffset,
         getterReference: referencesFromIndexedClass?.cls.reference);
   }
@@ -4586,6 +4610,7 @@
   topLevelMethod,
   factoryMethod,
   functionType,
+  enumDeclaration,
 }
 
 /// A builder object preparing for building declarations that can introduce type
diff --git a/pkg/front_end/lib/src/fasta/util/parser_ast.dart b/pkg/front_end/lib/src/fasta/util/parser_ast.dart
index 3fe3f31..b648bfc 100644
--- a/pkg/front_end/lib/src/fasta/util/parser_ast.dart
+++ b/pkg/front_end/lib/src/fasta/util/parser_ast.dart
@@ -867,9 +867,9 @@
     throw "Not found.";
   }
 
-  ClassOrMixinImplementsHandle getClassImplements() {
+  ImplementsHandle getClassImplements() {
     for (ParserAstNode child in children!) {
-      if (child is ClassOrMixinImplementsHandle) {
+      if (child is ImplementsHandle) {
         return child;
       }
     }
@@ -1512,24 +1512,30 @@
                 end == "ExtensionConstructor" ||
                 end == "ExtensionMethod" ||
                 end == "MixinConstructor" ||
-                end == "MixinMethod")) {
-          // beginMethod is ended by one of endClassConstructor, endClassMethod,
-          // endExtensionMethod, endMixinConstructor or endMixinMethod.
+                end == "MixinMethod" ||
+                end == "EnumConstructor" ||
+                end == "EnumMethod")) {
+          // beginMethod is ended by one of endClassConstructor,
+          // endClassMethod, endExtensionMethod, endMixinConstructor,
+          // endMixinMethod, endEnumMethod or endEnumConstructor.
         } else if (begin == "Fields" &&
             (end == "TopLevelFields" ||
                 end == "ClassFields" ||
                 end == "MixinFields" ||
-                end == "ExtensionFields")) {
-          // beginFields is ended by one of endTopLevelFields, endMixinFields or
-          // endExtensionFields.
+                end == "ExtensionFields" ||
+                end == "EnumFields")) {
+          // beginFields is ended by one of endTopLevelFields, endMixinFields,
+          // endEnumFields or endExtensionFields.
         } else if (begin == "ForStatement" && end == "ForIn") {
           // beginForStatement is ended by either endForStatement or endForIn.
         } else if (begin == "FactoryMethod" &&
             (end == "ClassFactoryMethod" ||
                 end == "MixinFactoryMethod" ||
-                end == "ExtensionFactoryMethod")) {
+                end == "ExtensionFactoryMethod" ||
+                end == "EnumFactoryMethod")) {
           // beginFactoryMethod is ended by either endClassFactoryMethod,
-          // endMixinFactoryMethod or endExtensionFactoryMethod.
+          // endMixinFactoryMethod, endExtensionFactoryMethod, or
+          // endEnumFactoryMethod.
         } else if (begin == "ForControlFlow" && (end == "ForInControlFlow")) {
           // beginForControlFlow is ended by either endForControlFlow or
           // endForInControlFlow.
diff --git a/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart b/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
index f41a614..13348fd 100644
--- a/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
+++ b/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
@@ -179,12 +179,9 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    ClassOrMixinImplementsHandle data = new ClassOrMixinImplementsHandle(
-        ParserAstType.HANDLE,
-        implementsKeyword: implementsKeyword,
-        interfacesCount: interfacesCount);
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    ImplementsHandle data = new ImplementsHandle(ParserAstType.HANDLE,
+        implementsKeyword: implementsKeyword, interfacesCount: interfacesCount);
     seen(data);
   }
 
@@ -411,9 +408,54 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
     EnumEnd data = new EnumEnd(ParserAstType.END,
-        enumKeyword: enumKeyword, leftBrace: leftBrace, count: count);
+        enumKeyword: enumKeyword,
+        leftBrace: leftBrace,
+        memberCount: memberCount);
+    seen(data);
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    EnumConstructorEnd data = new EnumConstructorEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    EnumElementsHandle data = new EnumElementsHandle(ParserAstType.HANDLE,
+        elementsEndToken: elementsEndToken, elementsCount: elementsCount);
+    seen(data);
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    EnumHeaderHandle data = new EnumHeaderHandle(ParserAstType.HANDLE,
+        enumKeyword: enumKeyword, leftBrace: leftBrace);
+    seen(data);
+  }
+
+  @override
+  void handleEnumElement(Token beginToken) {
+    EnumElementHandle data =
+        new EnumElementHandle(ParserAstType.HANDLE, beginToken: beginToken);
+    seen(data);
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    EnumFactoryMethodEnd data = new EnumFactoryMethodEnd(ParserAstType.END,
+        beginToken: beginToken,
+        factoryKeyword: factoryKeyword,
+        endToken: endToken);
     seen(data);
   }
 
@@ -619,6 +661,42 @@
   }
 
   @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    EnumFieldsEnd data = new EnumFieldsEnd(ParserAstType.END,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    EnumMethodEnd data = new EnumMethodEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
   void handleForInitializerEmptyStatement(Token token) {
     ForInitializerEmptyStatementHandle data =
         new ForInitializerEmptyStatementHandle(ParserAstType.HANDLE,
@@ -824,6 +902,20 @@
   }
 
   @override
+  void handleEnumWithClause(Token withKeyword) {
+    EnumWithClauseHandle data = new EnumWithClauseHandle(ParserAstType.HANDLE,
+        withKeyword: withKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    EnumNoWithClauseHandle data =
+        new EnumNoWithClauseHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
   void beginNamedMixinApplication(
       Token begin, Token? abstractToken, Token name) {
     NamedMixinApplicationBegin data = new NamedMixinApplicationBegin(
@@ -2188,6 +2280,14 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    NoTypeNameInConstructorReferenceHandle data =
+        new NoTypeNameInConstructorReferenceHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
   void handleNoType(Token lastConsumed) {
     NoTypeHandle data =
         new NoTypeHandle(ParserAstType.HANDLE, lastConsumed: lastConsumed);
@@ -2747,13 +2847,13 @@
       };
 }
 
-class ClassOrMixinImplementsHandle extends ParserAstNode {
+class ImplementsHandle extends ParserAstNode {
   final Token? implementsKeyword;
   final int interfacesCount;
 
-  ClassOrMixinImplementsHandle(ParserAstType type,
+  ImplementsHandle(ParserAstType type,
       {this.implementsKeyword, required this.interfacesCount})
-      : super("ClassOrMixinImplements", type);
+      : super("Implements", type);
 
   @override
   Map<String, Object?> get deprecatedArguments => {
@@ -3167,17 +3267,105 @@
 class EnumEnd extends ParserAstNode {
   final Token enumKeyword;
   final Token leftBrace;
-  final int count;
+  final int memberCount;
 
   EnumEnd(ParserAstType type,
-      {required this.enumKeyword, required this.leftBrace, required this.count})
+      {required this.enumKeyword,
+      required this.leftBrace,
+      required this.memberCount})
       : super("Enum", type);
 
   @override
   Map<String, Object?> get deprecatedArguments => {
         "enumKeyword": enumKeyword,
         "leftBrace": leftBrace,
-        "count": count,
+        "memberCount": memberCount,
+      };
+}
+
+class EnumConstructorEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  EnumConstructorEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("EnumConstructor", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class EnumElementsHandle extends ParserAstNode {
+  final Token elementsEndToken;
+  final int elementsCount;
+
+  EnumElementsHandle(ParserAstType type,
+      {required this.elementsEndToken, required this.elementsCount})
+      : super("EnumElements", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "elementsEndToken": elementsEndToken,
+        "elementsCount": elementsCount,
+      };
+}
+
+class EnumHeaderHandle extends ParserAstNode {
+  final Token enumKeyword;
+  final Token leftBrace;
+
+  EnumHeaderHandle(ParserAstType type,
+      {required this.enumKeyword, required this.leftBrace})
+      : super("EnumHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "enumKeyword": enumKeyword,
+        "leftBrace": leftBrace,
+      };
+}
+
+class EnumElementHandle extends ParserAstNode {
+  final Token beginToken;
+
+  EnumElementHandle(ParserAstType type, {required this.beginToken})
+      : super("EnumElement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+      };
+}
+
+class EnumFactoryMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token factoryKeyword;
+  final Token endToken;
+
+  EnumFactoryMethodEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
+      : super("EnumFactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "factoryKeyword": factoryKeyword,
+        "endToken": endToken,
       };
 }
 
@@ -3536,6 +3724,68 @@
       };
 }
 
+class EnumFieldsEnd extends ParserAstNode {
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  EnumFieldsEnd(ParserAstType type,
+      {this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("EnumFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class EnumMethodEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  EnumMethodEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("EnumMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
 class ForInitializerEmptyStatementHandle extends ParserAstNode {
   final Token token;
 
@@ -3909,6 +4159,25 @@
   Map<String, Object?> get deprecatedArguments => {};
 }
 
+class EnumWithClauseHandle extends ParserAstNode {
+  final Token withKeyword;
+
+  EnumWithClauseHandle(ParserAstType type, {required this.withKeyword})
+      : super("EnumWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "withKeyword": withKeyword,
+      };
+}
+
+class EnumNoWithClauseHandle extends ParserAstNode {
+  EnumNoWithClauseHandle(ParserAstType type) : super("EnumNoWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
 class NamedMixinApplicationBegin extends ParserAstNode {
   final Token begin;
   final Token? abstractToken;
@@ -6377,6 +6646,19 @@
       };
 }
 
+class NoTypeNameInConstructorReferenceHandle extends ParserAstNode {
+  final Token token;
+
+  NoTypeNameInConstructorReferenceHandle(ParserAstType type,
+      {required this.token})
+      : super("NoTypeNameInConstructorReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
 class NoTypeHandle extends ParserAstNode {
   final Token lastConsumed;
 
diff --git a/pkg/front_end/lib/src/fasta/util/textual_outline.dart b/pkg/front_end/lib/src/fasta/util/textual_outline.dart
index b72d8b6..e902eab 100644
--- a/pkg/front_end/lib/src/fasta/util/textual_outline.dart
+++ b/pkg/front_end/lib/src/fasta/util/textual_outline.dart
@@ -759,7 +759,7 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
     elementStartToChunk[enumKeyword] =
         new _EnumChunk(enumKeyword, leftBrace.endGroup!);
   }
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index b217478..c7aca29 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -212,6 +212,8 @@
 DuplicatedParameterName/example: Fail
 Encoding/analyzerCode: Fail
 EnumConstantSameNameAsEnclosing/example: Fail
+EnumDeclaresFactory/analyzerCode: Fail
+EnumDeclaresFactory/example: Fail
 EnumInstantiation/example: Fail
 EqualityCannotBeEqualityOperand/part_wrapped_script1: Fail
 EqualityCannotBeEqualityOperand/part_wrapped_script2: Fail
@@ -525,10 +527,6 @@
 JsInteropExternalMemberNotJSAnnotated/example: Fail # Web compiler specific
 JsInteropIndexNotSupported/analyzerCode: Fail # Web compiler specific
 JsInteropIndexNotSupported/example: Fail # Web compiler specific
-JsInteropStaticInteropWithInstanceMembers/analyzerCode: Fail # Web compiler specific
-JsInteropStaticInteropWithInstanceMembers/example: Fail # Web compiler specific
-JsInteropStaticInteropWithNonStaticSupertype/analyzerCode: Fail # Web compiler specific
-JsInteropStaticInteropWithNonStaticSupertype/example: Fail # Web compiler specific
 JsInteropJSClassExtendsDartClass/analyzerCode: Fail # Web compiler specific
 JsInteropJSClassExtendsDartClass/example: Fail # Web compiler specific
 JsInteropNamedParameters/analyzerCode: Fail # Web compiler specific
@@ -539,6 +537,10 @@
 JsInteropNonExternalConstructor/example: Fail # Web compiler specific
 JsInteropNonExternalMember/analyzerCode: Fail # Web compiler specific
 JsInteropNonExternalMember/example: Fail # Web compiler specific
+JsInteropStaticInteropWithInstanceMembers/analyzerCode: Fail # Web compiler specific
+JsInteropStaticInteropWithInstanceMembers/example: Fail # Web compiler specific
+JsInteropStaticInteropWithNonStaticSupertype/analyzerCode: Fail # Web compiler specific
+JsInteropStaticInteropWithNonStaticSupertype/example: Fail # Web compiler specific
 LanguageVersionInvalidInDotPackages/analyzerCode: Fail
 LanguageVersionMismatchInPart/analyzerCode: Fail
 LanguageVersionMismatchInPart/part_wrapped_script: Fail # Part in (now) part.
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 6b7772e..043ebae 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -2069,6 +2069,10 @@
   problemMessage: "Unsupported nullability value '#string' on type '#type'."
   severity: INTERNAL_PROBLEM
 
+InternalProblemOmittedTypeNameInConstructorReference:
+  problemMessage: "Unsupported omission of the type name in a constructor reference outside of an enum element declaration."
+  severity: INTERNAL_PROBLEM
+
 IncrementalCompilerIllegalParameter:
   problemMessage: "Illegal parameter name '#string' found during expression compilation."
 
@@ -5436,3 +5440,7 @@
   experiments: constructor-tearoffs
   script: |
     method(dynamic d) => d.new;
+
+EnumDeclaresFactory:
+  problemMessage: "Enums can't declare factory constructors."
+  correctionMessage: "Try removing the factory constructor declaration."
diff --git a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart
new file mode 100644
index 0000000..145b799
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart
@@ -0,0 +1,8 @@
+enum E<X, Y> {
+  one<int, String>(),
+  two<double, num>(),
+  three<int, int>.named(42);
+
+  const E();
+  const E.named(int value);
+}
diff --git a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.expect b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.expect
new file mode 100644
index 0000000..69b148f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.expect
@@ -0,0 +1,122 @@
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      beginTypeVariables(<)
+        beginMetadataStar(X)
+        endMetadataStar(0)
+        handleIdentifier(X, typeVariableDeclaration)
+        beginTypeVariable(X)
+          beginMetadataStar(Y)
+          endMetadataStar(0)
+          handleIdentifier(Y, typeVariableDeclaration)
+          beginTypeVariable(Y)
+            handleTypeVariablesDefined(Y, 2)
+            handleNoType(Y)
+          endTypeVariable(>, 1, null, null)
+          handleNoType(X)
+        endTypeVariable(,, 0, null, null)
+      endTypeVariables(<, >)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(one)
+      endMetadataStar(0)
+      handleIdentifier(one, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(one)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(,)
+          handleType(int, null)
+          handleIdentifier(String, typeReference)
+          handleNoTypeArguments(>)
+          handleType(String, null)
+        endTypeArguments(2, <, >)
+        handleNoConstructorReferenceContinuationAfterTypeArguments(()
+      endConstructorReference(one, null, (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      beginMetadataStar(two)
+      endMetadataStar(0)
+      handleIdentifier(two, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(two)
+        beginTypeArguments(<)
+          handleIdentifier(double, typeReference)
+          handleNoTypeArguments(,)
+          handleType(double, null)
+          handleIdentifier(num, typeReference)
+          handleNoTypeArguments(>)
+          handleType(num, null)
+        endTypeArguments(2, <, >)
+        handleNoConstructorReferenceContinuationAfterTypeArguments(()
+      endConstructorReference(two, null, (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement(,)
+      beginMetadataStar(three)
+      endMetadataStar(0)
+      handleIdentifier(three, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(three)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(,)
+          handleType(int, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(2, <, >)
+        handleIdentifier(named, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(three, ., (, ConstructorReferenceContext.Const)
+      beginArguments(()
+        handleLiteralInt(42)
+      endArguments(1, (, ))
+      handleEnumElement(,)
+      handleEnumElements(;, 3)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, 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, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(named, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+            beginMetadataStar(int)
+            endMetadataStar(0)
+            beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
+              handleIdentifier(int, typeReference)
+              handleNoTypeArguments(value)
+              handleType(int, null)
+              handleIdentifier(value, formalParameterDeclaration)
+              handleFormalParameterWithoutValue())
+            endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+          endFormalParameters(1, (, ), 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/enhanced_enums/entries_with_type_arguments.dart.intertwined.expect b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.intertwined.expect
new file mode 100644
index 0000000..04b3942
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.intertwined.expect
@@ -0,0 +1,199 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(, enum)
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: beginTypeVariables(<)
+          parseMetadataStar(<)
+            listener: beginMetadataStar(X)
+            listener: endMetadataStar(0)
+          ensureIdentifier(<, typeVariableDeclaration)
+            listener: handleIdentifier(X, typeVariableDeclaration)
+          listener: beginTypeVariable(X)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(Y)
+            listener: endMetadataStar(0)
+          ensureIdentifier(,, typeVariableDeclaration)
+            listener: handleIdentifier(Y, typeVariableDeclaration)
+          listener: beginTypeVariable(Y)
+          listener: handleTypeVariablesDefined(Y, 2)
+          listener: handleNoType(Y)
+          listener: endTypeVariable(>, 1, null, null)
+          listener: handleNoType(X)
+          listener: endTypeVariable(,, 0, null, null)
+          listener: endTypeVariables(<, >)
+          parseEnumWithClauseOpt(>)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(>)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(one)
+            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)
+          parseConstructorInvocationArguments(>)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        parseEnumElement(,)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(two)
+            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)
+          parseConstructorInvocationArguments(>)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement(,)
+        parseEnumElement(,)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(three)
+            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)
+          parseConstructorInvocationArguments(named)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralInt(()
+                        listener: handleLiteralInt(42)
+              listener: endArguments(1, (, ))
+          listener: handleEnumElement(,)
+        listener: handleEnumElements(;, 3)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, 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, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, 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(named, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(named)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(named, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(named, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                    parseMetadataStar(()
+                      listener: beginMetadataStar(int)
+                      listener: endMetadataStar(0)
+                    listener: beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
+                    listener: handleIdentifier(int, typeReference)
+                    listener: handleNoTypeArguments(value)
+                    listener: handleType(int, null)
+                    ensureIdentifier(int, formalParameterDeclaration)
+                      listener: handleIdentifier(value, formalParameterDeclaration)
+                    listener: handleFormalParameterWithoutValue())
+                    listener: endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(1, (, ), 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/enhanced_enums/entries_with_type_arguments.dart.parser.expect b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.parser.expect
new file mode 100644
index 0000000..9f86055
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.parser.expect
@@ -0,0 +1,19 @@
+enum E<X, Y> {
+one<int, String>(),
+two<double, num>(),
+three<int, int>.named(42);
+
+const E();
+const E.named(int value);
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]X[StringToken],[SimpleToken] Y[StringToken]>[SimpleToken] {[BeginToken]
+one[StringToken]<[BeginToken]int[StringToken],[SimpleToken] String[StringToken]>[SimpleToken]([BeginToken])[SimpleToken],[SimpleToken]
+two[StringToken]<[BeginToken]double[StringToken],[SimpleToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken],[SimpleToken]
+three[StringToken]<[BeginToken]int[StringToken],[SimpleToken] int[StringToken]>[SimpleToken].[SimpleToken]named[StringToken]([BeginToken]42[StringToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]named[StringToken]([BeginToken]int[StringToken] value[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.scanner.expect b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.scanner.expect
new file mode 100644
index 0000000..9f86055
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.scanner.expect
@@ -0,0 +1,19 @@
+enum E<X, Y> {
+one<int, String>(),
+two<double, num>(),
+three<int, int>.named(42);
+
+const E();
+const E.named(int value);
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]X[StringToken],[SimpleToken] Y[StringToken]>[SimpleToken] {[BeginToken]
+one[StringToken]<[BeginToken]int[StringToken],[SimpleToken] String[StringToken]>[SimpleToken]([BeginToken])[SimpleToken],[SimpleToken]
+two[StringToken]<[BeginToken]double[StringToken],[SimpleToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken],[SimpleToken]
+three[StringToken]<[BeginToken]int[StringToken],[SimpleToken] int[StringToken]>[SimpleToken].[SimpleToken]named[StringToken]([BeginToken]42[StringToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]named[StringToken]([BeginToken]int[StringToken] value[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect
index 285f1da..9fc344c 100644
--- a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect
@@ -18,7 +18,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
@@ -118,7 +118,7 @@
       handleNoType(D)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(D)
diff --git a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect
index fa61730..07f6de4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -71,7 +71,7 @@
                 listener: endClassConstructor(null, C, (, null, ;)
               listener: endMember()
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -271,15 +271,15 @@
             parseClassExtendsOpt(D)
               listener: handleNoType(D)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(D)
+            parseClassWithClauseOpt(D)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(D)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(D)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(D, DeclarationKind.Class, D)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, D)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, D)
               parseMetadataStar({)
                 listener: beginMetadataStar(D)
                 listener: endMetadataStar(0)
@@ -323,7 +323,7 @@
                 listener: endClassConstructor(null, D, (, null, ;)
               listener: endMember()
             notEofOrValue(}, D)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(D)
                 listener: endMetadataStar(0)
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 e2d55ca..e861c72 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)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(C, constructorReference)
                                 listener: beginConstructorReference(C)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.expect
index 5ee9cdb..acb0f6c 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.expect
@@ -130,7 +130,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(foo)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.intertwined.expect
index 7e46b8b..88944b7f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -65,7 +65,7 @@
                 listener: endClassConstructor(null, foo, (, null, })
               listener: endMember()
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -128,7 +128,7 @@
                 listener: endClassConstructor(null, foo, (, :, })
               listener: endMember()
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -187,7 +187,7 @@
                 listener: endClassConstructor(null, foo, (, :, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -224,7 +224,7 @@
                 listener: endClassMethod(get, get, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -268,7 +268,7 @@
                 listener: endClassMethod(get, get, {, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -315,7 +315,7 @@
                 listener: endClassConstructor(get, get, (, null, ;)
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -369,7 +369,7 @@
                 listener: endClassConstructor(get, get, (, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -437,7 +437,7 @@
                 listener: endClassConstructor(get, get, (, :, ;)
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -516,7 +516,7 @@
                 listener: endClassConstructor(get, get, (, :, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -559,7 +559,7 @@
                 listener: endClassMethod(set, set, (, null, ;)
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -609,7 +609,7 @@
                 listener: endClassMethod(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -656,7 +656,7 @@
                 listener: endClassConstructor(set, set, (, null, ;)
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -710,7 +710,7 @@
                 listener: endClassConstructor(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -778,7 +778,7 @@
                 listener: endClassConstructor(set, set, (, :, ;)
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -857,7 +857,7 @@
                 listener: endClassConstructor(set, set, (, :, })
               listener: endMember()
             notEofOrValue(}, external)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
@@ -914,7 +914,7 @@
                 listener: endClassConstructor(null, external, (, :, ;)
               listener: endMember()
             notEofOrValue(}, external)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
@@ -993,7 +993,7 @@
                 listener: endClassConstructor(null, external, (, :, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1012,7 +1012,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.expect
index 06805796..4b23187 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.expect
@@ -38,7 +38,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(get)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.intertwined.expect
index c1bf8ebf..75979e4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -66,7 +66,7 @@
                 listener: endClassConstructor(get, get, (, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -130,7 +130,7 @@
                 listener: endClassConstructor(get, get, (, :, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.expect
index 7629bd3..77c9204 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.expect
@@ -34,7 +34,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(void)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.intertwined.expect
index 1502968..7ab4015 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -66,7 +66,7 @@
                 listener: endClassConstructor(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -130,7 +130,7 @@
                 listener: endClassConstructor(null, void, (, :, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.expect
index 26bb64b..f2201dc 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.expect
@@ -34,7 +34,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(set)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.intertwined.expect
index ca57772..55c390c 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -66,7 +66,7 @@
                 listener: endClassConstructor(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -130,7 +130,7 @@
                 listener: endClassConstructor(set, set, (, :, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.expect
index daaa1b0..4f6c582 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.expect
@@ -34,7 +34,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(get)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.intertwined.expect
index 75d8a2f0..21be0f7 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -62,7 +62,7 @@
                 listener: endClassMethod(get, get, (, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -122,7 +122,7 @@
                 listener: endClassConstructor(get, get, (, :, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -159,7 +159,7 @@
                 listener: endClassConstructor(get, get, (, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.expect
index 750f16f..2ed0508 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Foo)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.intertwined.expect
index 9286fc8..5109bb5 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -59,7 +59,7 @@
                 listener: endClassConstructor(null, Foo, (, null, })
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -116,7 +116,7 @@
                 listener: endClassConstructor(null, Foo, (, :, })
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -152,7 +152,7 @@
                 listener: endClassConstructor(null, Foo, (, null, })
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.expect
index 5e8a7be..6b37228 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.expect
@@ -82,7 +82,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Foo)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.intertwined.expect
index 968b712..e584d14 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -63,7 +63,7 @@
                 listener: endClassConstructor(null, Foo, (, null, })
               listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
@@ -122,7 +122,7 @@
                     listener: endClassConstructor(null, operator, (, :, })
                   listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -158,7 +158,7 @@
                 listener: endClassConstructor(null, Foo, (, null, })
               listener: endMember()
             notEofOrValue(}, .)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(.)
                 listener: endMetadataStar(0)
@@ -169,7 +169,7 @@
                 listener: handleInvalidMember(.)
                 listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(., DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(., DeclarationKind.Class, Foo)
               parseMetadataStar(.)
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
@@ -228,7 +228,7 @@
                     listener: endClassConstructor(null, operator, (, :, })
                   listener: endMember()
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -264,7 +264,7 @@
                 listener: endClassMethod(null, foo, (, null, })
               listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
@@ -323,7 +323,7 @@
                     listener: endClassConstructor(null, operator, (, :, })
                   listener: endMember()
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -359,7 +359,7 @@
                 listener: endClassMethod(null, foo, (, null, })
               listener: endMember()
             notEofOrValue(}, .)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(.)
                 listener: endMetadataStar(0)
@@ -370,7 +370,7 @@
                 listener: handleInvalidMember(.)
                 listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(., DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(., DeclarationKind.Class, Foo)
               parseMetadataStar(.)
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.expect
index 9e97581..3c0bbca 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.expect
@@ -26,7 +26,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(void)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.intertwined.expect
index 37469fb..057bb78 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -60,7 +60,7 @@
                 listener: endClassConstructor(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -118,7 +118,7 @@
                 listener: endClassConstructor(null, void, (, :, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -155,7 +155,7 @@
                 listener: endClassConstructor(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.expect
index 927d34c..1620ea3 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.expect
@@ -26,7 +26,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(set)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.intertwined.expect
index 716dcfc..5abf42d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -60,7 +60,7 @@
                 listener: endClassMethod(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -118,7 +118,7 @@
                 listener: endClassConstructor(set, set, (, :, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -155,7 +155,7 @@
                 listener: endClassConstructor(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
index 9f4f796..0d4f0e2 100644
--- a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
@@ -35,7 +35,7 @@
         parseClassOrMixinOrExtensionBody(>, DeclarationKind.Extension, E)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, bool)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, E)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, E)
             parseMetadataStar({)
               listener: beginMetadataStar(bool)
               listener: endMetadataStar(0)
@@ -92,7 +92,7 @@
               listener: endExtensionMethod(null, bool, (, null, })
             listener: endMember()
           notEofOrValue(}, int)
-          parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Extension, E)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Extension, E)
             parseMetadataStar(})
               listener: beginMetadataStar(int)
               listener: endMetadataStar(0)
@@ -129,7 +129,7 @@
               listener: endExtensionMethod(get, int, =>, null, ;)
             listener: endMember()
           notEofOrValue(}, set)
-          parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Extension, E)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Extension, E)
             parseMetadataStar(;)
               listener: beginMetadataStar(set)
               listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.expect
index daa2562..0a96f68 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.expect
@@ -30,7 +30,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.intertwined.expect
index 7fce480..0fd3f33 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.expect
index 40cd176..448b3e0 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.expect
@@ -30,7 +30,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -45,7 +45,7 @@
       handleNoType(B)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -66,7 +66,7 @@
       handleType(B, null)
       handleClassExtends(extends, 2)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Foo)
@@ -96,7 +96,7 @@
       handleNoType(Bar)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       handleRecoverableError(Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}], extend, extend)
       handleIdentifier(A, typeReference)
@@ -108,7 +108,7 @@
       handleType(B, null)
       handleClassExtends(extend, 2)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleRecoverClassHeader()
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Bar)
@@ -138,7 +138,7 @@
       handleNoType(Baz)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       handleRecoverableError(Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}], on, on)
       handleIdentifier(A, typeReference)
@@ -150,7 +150,7 @@
       handleType(B, null)
       handleClassExtends(on, 2)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleRecoverClassHeader()
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Baz)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.intertwined.expect
index e4749d3..612efb5 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -47,10 +47,10 @@
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -83,15 +83,15 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(B, null)
                 listener: handleClassExtends(extends, 2)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -143,16 +143,16 @@
             parseClassExtendsOpt(Bar)
               listener: handleNoType(Bar)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Bar)
+            parseClassWithClauseOpt(Bar)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Bar)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Bar)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassHeaderRecovery(Bar, class, class)
             parseClassHeaderOpt(Bar, class, class)
               parseClassExtendsOpt(Bar)
-              parseWithClauseOpt(Bar)
-              parseClassOrMixinImplementsOpt(Bar)
+              parseClassWithClauseOpt(Bar)
+              parseClassOrMixinOrEnumImplementsOpt(Bar)
             skipUnexpectedTokenOpt(Bar, [extends, with, implements, {])
             reportRecoverableError(extend, Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}])
               listener: handleRecoverableError(Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}], extend, extend)
@@ -166,16 +166,16 @@
               listener: handleNoTypeArguments({)
               listener: handleType(B, null)
               listener: handleClassExtends(extend, 2)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleRecoverClassHeader()
           ensureBlock(B, null, class declaration)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, Bar)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Bar)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Bar)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Bar)
               parseMetadataStar({)
                 listener: beginMetadataStar(Bar)
                 listener: endMetadataStar(0)
@@ -227,16 +227,16 @@
             parseClassExtendsOpt(Baz)
               listener: handleNoType(Baz)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Baz)
+            parseClassWithClauseOpt(Baz)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Baz)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Baz)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassHeaderRecovery(Baz, class, class)
             parseClassHeaderOpt(Baz, class, class)
               parseClassExtendsOpt(Baz)
-              parseWithClauseOpt(Baz)
-              parseClassOrMixinImplementsOpt(Baz)
+              parseClassWithClauseOpt(Baz)
+              parseClassOrMixinOrEnumImplementsOpt(Baz)
             skipUnexpectedTokenOpt(Baz, [extends, with, implements, {])
             reportRecoverableError(on, Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}])
               listener: handleRecoverableError(Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}], on, on)
@@ -250,16 +250,16 @@
               listener: handleNoTypeArguments({)
               listener: handleType(B, null)
               listener: handleClassExtends(on, 2)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleRecoverClassHeader()
           ensureBlock(B, null, class declaration)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, Baz)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Baz)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Baz)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Baz)
               parseMetadataStar({)
                 listener: beginMetadataStar(Baz)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.expect
index c6a8057..c95dc3b 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.expect
@@ -29,7 +29,7 @@
       handleNoType(Annotation)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
@@ -84,7 +84,7 @@
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -99,7 +99,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(m)
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 54dd7b2..4720e85 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
@@ -41,15 +41,15 @@
             parseClassExtendsOpt(Annotation)
               listener: handleNoType(Annotation)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Annotation)
+            parseClassWithClauseOpt(Annotation)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Annotation)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Annotation)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Annotation, DeclarationKind.Class, Annotation)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Annotation)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Annotation)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -66,7 +66,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, const)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Annotation)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Annotation)
               parseMetadataStar(;)
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
@@ -133,10 +133,10 @@
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -161,15 +161,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, m)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(m)
                 listener: endMetadataStar(0)
@@ -203,7 +203,7 @@
                             parseNewExpression(=>)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(A, constructorReference)
                                 listener: beginConstructorReference(A)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.expect
index aabfc19..db84d46 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.expect
@@ -70,7 +70,7 @@
       handleNoType(Key)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.intertwined.expect
index d527220..e575bbf 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.intertwined.expect
@@ -20,15 +20,15 @@
             parseClassExtendsOpt(Key)
               listener: handleNoType(Key)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Key)
+            parseClassWithClauseOpt(Key)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Key)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Key)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(Key, DeclarationKind.Class, Key)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Key)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -115,7 +115,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -188,7 +188,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -282,7 +282,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -362,7 +362,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -468,7 +468,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -555,7 +555,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -668,7 +668,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -762,7 +762,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -859,7 +859,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -944,7 +944,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1048,7 +1048,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1140,7 +1140,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1279,7 +1279,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1406,7 +1406,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1522,7 +1522,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1621,7 +1621,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1744,7 +1744,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1850,7 +1850,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, s)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(s)
                 listener: endMetadataStar(0)
@@ -2088,7 +2088,7 @@
                 listener: endClassMethod(null, s, (, null, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2333,7 +2333,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2542,7 +2542,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, not_currently_working)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(not_currently_working)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.expect
index 16264e7..b5464e1 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.expect
@@ -70,7 +70,7 @@
       handleNoType(Key)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect
index 3e3aac0..d50b821 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect
@@ -20,15 +20,15 @@
             parseClassExtendsOpt(Key)
               listener: handleNoType(Key)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Key)
+            parseClassWithClauseOpt(Key)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Key)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Key)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(Key, DeclarationKind.Class, Key)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Key)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -115,7 +115,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -188,7 +188,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -282,7 +282,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -362,7 +362,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -469,7 +469,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -556,7 +556,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -670,7 +670,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -764,7 +764,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -861,7 +861,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -946,7 +946,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1050,7 +1050,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1142,7 +1142,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1281,7 +1281,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1408,7 +1408,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1525,7 +1525,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1624,7 +1624,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1748,7 +1748,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1854,7 +1854,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, s)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(s)
                 listener: endMetadataStar(0)
@@ -2092,7 +2092,7 @@
                 listener: endClassMethod(null, s, (, null, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2337,7 +2337,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2546,7 +2546,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, not_currently_working)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(not_currently_working)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.expect
index 994f319..4f4d844 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.expect
@@ -70,7 +70,7 @@
       handleNoType(Key)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect
index cbfa78f..8d04871 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect
@@ -20,15 +20,15 @@
             parseClassExtendsOpt(Key)
               listener: handleNoType(Key)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Key)
+            parseClassWithClauseOpt(Key)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Key)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Key)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(Key, DeclarationKind.Class, Key)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Key)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -115,7 +115,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -188,7 +188,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -282,7 +282,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -362,7 +362,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -469,7 +469,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -556,7 +556,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -670,7 +670,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -764,7 +764,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -861,7 +861,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -946,7 +946,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1050,7 +1050,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1142,7 +1142,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1281,7 +1281,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1408,7 +1408,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1525,7 +1525,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1624,7 +1624,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1748,7 +1748,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1854,7 +1854,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, s)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(s)
                 listener: endMetadataStar(0)
@@ -2092,7 +2092,7 @@
                 listener: endClassMethod(null, s, (, null, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2337,7 +2337,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2546,7 +2546,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, not_currently_working)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(not_currently_working)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.expect
index 550de5d..e14c1cd 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.expect
@@ -18,7 +18,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(co)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.intertwined.expect
index 20a6ec6..885acb8 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, co)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(co)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.expect
index 2c563eb..ef39e22 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.expect
@@ -14,7 +14,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(co)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.intertwined.expect
index 0029b54..8a9a4f4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, co)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(co)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect
index 71be906..eb7be0a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect
@@ -26,7 +26,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect
index f465d58..486d7a3 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -63,7 +63,7 @@
                 listener: endClassConstructor(null, C, (, null, })
               listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, C)
               parseMetadataStar(})
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
index fed361e..1443cf1 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
@@ -22,7 +22,7 @@
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -43,7 +43,7 @@
     endTypeVariables(<, >)
     beginMixinDeclaration(mixin, M)
       handleMixinOn(null, 0)
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleMixinHeader(mixin)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Mixin, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Mixin, 0, {, })
@@ -74,13 +74,13 @@
         endFunctionType(Function, null)
       endTypeList(1)
       handleClassWithClause(with)
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       handleRecoverableError(Message[UnexpectedToken, Unexpected token '>'., null, {lexeme: >}], >, >)
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleRecoverClassHeader()
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
index 6017b1c..c046fee 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
@@ -27,10 +27,10 @@
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -61,8 +61,8 @@
         parseMixinHeaderOpt(>, mixin)
           parseMixinOnOpt(>)
             listener: handleMixinOn(null, 0)
-          parseClassOrMixinImplementsOpt(>)
-            listener: handleClassOrMixinImplements(null, 0)
+          parseClassOrMixinOrEnumImplementsOpt(>)
+            listener: handleImplements(null, 0)
           listener: handleMixinHeader(mixin)
         parseClassOrMixinOrExtensionBody(>, DeclarationKind.Mixin, M)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Mixin, {)
@@ -90,7 +90,7 @@
                 listener: handleNoTypeArguments(with)
                 listener: handleType(Object, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(Object)
+            parseClassWithClauseOpt(Object)
               parseTypeList(with)
                 listener: beginTypeList(M)
                 listener: beginFunctionType(M)
@@ -110,29 +110,29 @@
                 listener: endFunctionType(Function, null)
                 listener: endTypeList(1)
               listener: handleClassWithClause(with)
-            parseClassOrMixinImplementsOpt())
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt())
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassHeaderRecovery(DND1, class, class)
             parseClassHeaderOpt(DND1, class, class)
               parseClassExtendsOpt(DND1)
                 parseClassExtendsSeenExtendsClause(extends, DND1)
-              parseWithClauseOpt(Object)
+              parseClassWithClauseOpt(Object)
                 parseTypeList(with)
                   ensureIdentifier(with, typeReference)
                   parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
                     parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
-              parseClassOrMixinImplementsOpt())
+              parseClassOrMixinOrEnumImplementsOpt())
             skipUnexpectedTokenOpt(), [extends, with, implements, {])
               reportRecoverableErrorWithToken(>, Instance of 'Template<(Token) => Message>')
                 listener: handleRecoverableError(Message[UnexpectedToken, Unexpected token '>'., null, {lexeme: >}], >, >)
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleRecoverClassHeader()
           ensureBlock(>, null, class declaration)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, DND1)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect
index 90f0494..d370a1f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect
@@ -26,7 +26,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect
index a1f507a..487b2f4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -78,7 +78,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -123,7 +123,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -162,7 +162,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -216,7 +216,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -259,7 +259,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -325,7 +325,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -379,7 +379,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -439,7 +439,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect
index f85d2a9..3e6acd8 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect
@@ -26,7 +26,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
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 3fdbced..3286fb7 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
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -77,7 +77,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -125,7 +125,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -163,7 +163,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -191,7 +191,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
@@ -219,7 +219,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -247,7 +247,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
@@ -264,7 +264,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -329,7 +329,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -382,7 +382,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -445,7 +445,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.expect
index dbfa889..a77c1d4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.expect
@@ -22,7 +22,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.intertwined.expect
index fe10043..78e2879 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -74,7 +74,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -115,7 +115,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -153,7 +153,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -200,7 +200,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -239,7 +239,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -289,7 +289,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -332,7 +332,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -376,7 +376,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.expect
index ee30059..7671fc4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.expect
@@ -26,7 +26,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
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 2a9f996..1859b0b 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
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -73,7 +73,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -117,7 +117,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -154,7 +154,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -178,7 +178,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
@@ -203,7 +203,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -227,7 +227,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
@@ -244,7 +244,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -293,7 +293,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -333,7 +333,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -380,7 +380,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.expect
index 53c04d2..1711905 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.expect
@@ -38,7 +38,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
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 0133f20..4a37dea 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
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -73,7 +73,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -119,7 +119,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -156,7 +156,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -181,7 +181,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
@@ -206,7 +206,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -231,7 +231,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
@@ -248,7 +248,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -297,7 +297,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -337,7 +337,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -386,7 +386,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect
index 173eeae..b2a0a36 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect
@@ -38,7 +38,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
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 0b1733b..77176c4 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
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -77,7 +77,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -127,7 +127,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -165,7 +165,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -194,7 +194,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
@@ -222,7 +222,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -251,7 +251,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
@@ -268,7 +268,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -333,7 +333,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -386,7 +386,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -451,7 +451,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.expect
index 7a1bda5..48a989a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.expect
@@ -26,7 +26,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.intertwined.expect
index 6419253..4c25c0e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -71,7 +71,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -109,7 +109,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -144,7 +144,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -191,7 +191,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -230,7 +230,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -280,7 +280,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -321,7 +321,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -365,7 +365,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.expect
index be8115b..e64026f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.expect
@@ -26,7 +26,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
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 fe81a69..2b0b373 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
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -70,7 +70,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -111,7 +111,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -145,7 +145,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -169,7 +169,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
@@ -194,7 +194,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -218,7 +218,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
@@ -235,7 +235,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -284,7 +284,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -324,7 +324,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -371,7 +371,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.expect
index 47c67e8..cf0c95b 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.expect
@@ -38,7 +38,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
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 02cf05c..642c608 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
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -70,7 +70,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -113,7 +113,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -147,7 +147,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -172,7 +172,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
@@ -197,7 +197,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -222,7 +222,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
@@ -239,7 +239,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -288,7 +288,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -328,7 +328,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -377,7 +377,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.expect
index 3f63dfc..51b616e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.expect
@@ -26,7 +26,7 @@
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(foo)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.intertwined.expect
index b30860f..352b89d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.intertwined.expect
@@ -27,15 +27,15 @@
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect
index 5c15762..1819758 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect
@@ -231,7 +231,7 @@
       handleNoType(abstract)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -247,7 +247,7 @@
       handleNoType(as)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -263,7 +263,7 @@
       handleNoType(assert)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -278,7 +278,7 @@
       handleNoType(async)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -293,7 +293,7 @@
       handleNoType(await)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -309,7 +309,7 @@
       handleNoType(break)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -325,7 +325,7 @@
       handleNoType(case)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -341,7 +341,7 @@
       handleNoType(catch)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -357,7 +357,7 @@
       handleNoType(class)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -373,7 +373,7 @@
       handleNoType(const)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -389,7 +389,7 @@
       handleNoType(continue)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -405,7 +405,7 @@
       handleNoType(covariant)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -421,7 +421,7 @@
       handleNoType(default)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -437,7 +437,7 @@
       handleNoType(deferred)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -453,7 +453,7 @@
       handleNoType(do)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -469,7 +469,7 @@
       handleNoType(dynamic)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -485,7 +485,7 @@
       handleNoType(else)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -501,7 +501,7 @@
       handleNoType(enum)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -517,7 +517,7 @@
       handleNoType(export)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -533,7 +533,7 @@
       handleNoType(extends)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -549,7 +549,7 @@
       handleNoType(extension)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -565,7 +565,7 @@
       handleNoType(external)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -581,7 +581,7 @@
       handleNoType(factory)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -597,7 +597,7 @@
       handleNoType(false)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -613,7 +613,7 @@
       handleNoType(final)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -629,7 +629,7 @@
       handleNoType(finally)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -645,7 +645,7 @@
       handleNoType(for)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -660,7 +660,7 @@
       handleNoType(Function)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -676,7 +676,7 @@
       handleNoType(get)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -691,7 +691,7 @@
       handleNoType(hide)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -707,7 +707,7 @@
       handleNoType(if)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -723,7 +723,7 @@
       handleNoType(implements)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -739,7 +739,7 @@
       handleNoType(import)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -755,7 +755,7 @@
       handleNoType(in)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -770,7 +770,7 @@
       handleNoType(inout)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -786,7 +786,7 @@
       handleNoType(interface)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -802,7 +802,7 @@
       handleNoType(is)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -818,7 +818,7 @@
       handleNoType(late)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -834,7 +834,7 @@
       handleNoType(library)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -850,7 +850,7 @@
       handleNoType(mixin)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -865,7 +865,7 @@
       handleNoType(native)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -881,7 +881,7 @@
       handleNoType(new)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -897,7 +897,7 @@
       handleNoType(null)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -912,7 +912,7 @@
       handleNoType(of)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -927,7 +927,7 @@
       handleNoType(on)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -943,7 +943,7 @@
       handleNoType(operator)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -958,7 +958,7 @@
       handleNoType(out)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -974,7 +974,7 @@
       handleNoType(part)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -989,7 +989,7 @@
       handleNoType(patch)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1005,7 +1005,7 @@
       handleNoType(required)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1021,7 +1021,7 @@
       handleNoType(rethrow)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1037,7 +1037,7 @@
       handleNoType(return)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1053,7 +1053,7 @@
       handleNoType(set)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1068,7 +1068,7 @@
       handleNoType(show)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1083,7 +1083,7 @@
       handleNoType(source)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1099,7 +1099,7 @@
       handleNoType(static)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1115,7 +1115,7 @@
       handleNoType(super)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1131,7 +1131,7 @@
       handleNoType(switch)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1146,7 +1146,7 @@
       handleNoType(sync)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1162,7 +1162,7 @@
       handleNoType(this)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1178,7 +1178,7 @@
       handleNoType(throw)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1194,7 +1194,7 @@
       handleNoType(true)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1210,7 +1210,7 @@
       handleNoType(try)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1226,7 +1226,7 @@
       handleNoType(typedef)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1242,7 +1242,7 @@
       handleNoType(var)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1258,7 +1258,7 @@
       handleNoType(void)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1274,7 +1274,7 @@
       handleNoType(while)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1290,7 +1290,7 @@
       handleNoType(with)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1305,7 +1305,7 @@
       handleNoType(yield)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect
index 395b3c1..5a31b41 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect
@@ -21,10 +21,10 @@
             parseClassExtendsOpt(abstract)
               listener: handleNoType(abstract)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(abstract)
+            parseClassWithClauseOpt(abstract)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(abstract)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(abstract)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(abstract, DeclarationKind.Class, abstract)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -51,10 +51,10 @@
             parseClassExtendsOpt(as)
               listener: handleNoType(as)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(as)
+            parseClassWithClauseOpt(as)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(as)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(as)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(as, DeclarationKind.Class, as)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -81,10 +81,10 @@
             parseClassExtendsOpt(assert)
               listener: handleNoType(assert)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(assert)
+            parseClassWithClauseOpt(assert)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(assert)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(assert)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(assert, DeclarationKind.Class, assert)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -109,10 +109,10 @@
             parseClassExtendsOpt(async)
               listener: handleNoType(async)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(async)
+            parseClassWithClauseOpt(async)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(async)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(async)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(async, DeclarationKind.Class, async)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -137,10 +137,10 @@
             parseClassExtendsOpt(await)
               listener: handleNoType(await)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(await)
+            parseClassWithClauseOpt(await)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(await)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(await)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(await, DeclarationKind.Class, await)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -167,10 +167,10 @@
             parseClassExtendsOpt(break)
               listener: handleNoType(break)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(break)
+            parseClassWithClauseOpt(break)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(break)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(break)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(break, DeclarationKind.Class, break)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -197,10 +197,10 @@
             parseClassExtendsOpt(case)
               listener: handleNoType(case)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(case)
+            parseClassWithClauseOpt(case)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(case)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(case)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(case, DeclarationKind.Class, case)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -227,10 +227,10 @@
             parseClassExtendsOpt(catch)
               listener: handleNoType(catch)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(catch)
+            parseClassWithClauseOpt(catch)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(catch)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(catch)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(catch, DeclarationKind.Class, catch)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -257,10 +257,10 @@
             parseClassExtendsOpt(class)
               listener: handleNoType(class)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(class)
+            parseClassWithClauseOpt(class)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(class)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(class)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(class, DeclarationKind.Class, class)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -287,10 +287,10 @@
             parseClassExtendsOpt(const)
               listener: handleNoType(const)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(const)
+            parseClassWithClauseOpt(const)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(const)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(const)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(const, DeclarationKind.Class, const)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -317,10 +317,10 @@
             parseClassExtendsOpt(continue)
               listener: handleNoType(continue)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(continue)
+            parseClassWithClauseOpt(continue)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(continue)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(continue)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(continue, DeclarationKind.Class, continue)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -347,10 +347,10 @@
             parseClassExtendsOpt(covariant)
               listener: handleNoType(covariant)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(covariant)
+            parseClassWithClauseOpt(covariant)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(covariant)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(covariant)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(covariant, DeclarationKind.Class, covariant)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -377,10 +377,10 @@
             parseClassExtendsOpt(default)
               listener: handleNoType(default)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(default)
+            parseClassWithClauseOpt(default)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(default)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(default)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(default, DeclarationKind.Class, default)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -407,10 +407,10 @@
             parseClassExtendsOpt(deferred)
               listener: handleNoType(deferred)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(deferred)
+            parseClassWithClauseOpt(deferred)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(deferred)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(deferred)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(deferred, DeclarationKind.Class, deferred)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -437,10 +437,10 @@
             parseClassExtendsOpt(do)
               listener: handleNoType(do)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(do)
+            parseClassWithClauseOpt(do)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(do)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(do)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(do, DeclarationKind.Class, do)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -467,10 +467,10 @@
             parseClassExtendsOpt(dynamic)
               listener: handleNoType(dynamic)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(dynamic)
+            parseClassWithClauseOpt(dynamic)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(dynamic)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(dynamic)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(dynamic, DeclarationKind.Class, dynamic)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -497,10 +497,10 @@
             parseClassExtendsOpt(else)
               listener: handleNoType(else)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(else)
+            parseClassWithClauseOpt(else)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(else)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(else)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(else, DeclarationKind.Class, else)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -527,10 +527,10 @@
             parseClassExtendsOpt(enum)
               listener: handleNoType(enum)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(enum)
+            parseClassWithClauseOpt(enum)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(enum)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(enum)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(enum, DeclarationKind.Class, enum)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -557,10 +557,10 @@
             parseClassExtendsOpt(export)
               listener: handleNoType(export)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(export)
+            parseClassWithClauseOpt(export)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(export)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(export)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(export, DeclarationKind.Class, export)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -587,10 +587,10 @@
             parseClassExtendsOpt(extends)
               listener: handleNoType(extends)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(extends)
+            parseClassWithClauseOpt(extends)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(extends)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(extends)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(extends, DeclarationKind.Class, extends)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -617,10 +617,10 @@
             parseClassExtendsOpt(extension)
               listener: handleNoType(extension)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(extension)
+            parseClassWithClauseOpt(extension)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(extension)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(extension)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(extension, DeclarationKind.Class, extension)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -647,10 +647,10 @@
             parseClassExtendsOpt(external)
               listener: handleNoType(external)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(external)
+            parseClassWithClauseOpt(external)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(external)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(external)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(external, DeclarationKind.Class, external)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -677,10 +677,10 @@
             parseClassExtendsOpt(factory)
               listener: handleNoType(factory)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(factory)
+            parseClassWithClauseOpt(factory)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(factory)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(factory)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(factory, DeclarationKind.Class, factory)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -707,10 +707,10 @@
             parseClassExtendsOpt(false)
               listener: handleNoType(false)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(false)
+            parseClassWithClauseOpt(false)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(false)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(false)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(false, DeclarationKind.Class, false)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -737,10 +737,10 @@
             parseClassExtendsOpt(final)
               listener: handleNoType(final)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(final)
+            parseClassWithClauseOpt(final)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(final)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(final)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(final, DeclarationKind.Class, final)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -767,10 +767,10 @@
             parseClassExtendsOpt(finally)
               listener: handleNoType(finally)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(finally)
+            parseClassWithClauseOpt(finally)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(finally)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(finally)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(finally, DeclarationKind.Class, finally)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -797,10 +797,10 @@
             parseClassExtendsOpt(for)
               listener: handleNoType(for)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(for)
+            parseClassWithClauseOpt(for)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(for)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(for)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(for, DeclarationKind.Class, for)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -825,10 +825,10 @@
             parseClassExtendsOpt(Function)
               listener: handleNoType(Function)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Function)
+            parseClassWithClauseOpt(Function)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Function)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Function)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Function, DeclarationKind.Class, Function)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -855,10 +855,10 @@
             parseClassExtendsOpt(get)
               listener: handleNoType(get)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(get)
+            parseClassWithClauseOpt(get)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(get)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(get)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(get, DeclarationKind.Class, get)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -883,10 +883,10 @@
             parseClassExtendsOpt(hide)
               listener: handleNoType(hide)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(hide)
+            parseClassWithClauseOpt(hide)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(hide)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(hide)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(hide, DeclarationKind.Class, hide)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -913,10 +913,10 @@
             parseClassExtendsOpt(if)
               listener: handleNoType(if)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(if)
+            parseClassWithClauseOpt(if)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(if)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(if)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(if, DeclarationKind.Class, if)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -943,10 +943,10 @@
             parseClassExtendsOpt(implements)
               listener: handleNoType(implements)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(implements)
+            parseClassWithClauseOpt(implements)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(implements)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(implements)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(implements, DeclarationKind.Class, implements)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -973,10 +973,10 @@
             parseClassExtendsOpt(import)
               listener: handleNoType(import)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(import)
+            parseClassWithClauseOpt(import)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(import)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(import)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(import, DeclarationKind.Class, import)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1003,10 +1003,10 @@
             parseClassExtendsOpt(in)
               listener: handleNoType(in)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(in)
+            parseClassWithClauseOpt(in)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(in)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(in)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(in, DeclarationKind.Class, in)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1031,10 +1031,10 @@
             parseClassExtendsOpt(inout)
               listener: handleNoType(inout)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(inout)
+            parseClassWithClauseOpt(inout)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(inout)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(inout)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(inout, DeclarationKind.Class, inout)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1061,10 +1061,10 @@
             parseClassExtendsOpt(interface)
               listener: handleNoType(interface)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(interface)
+            parseClassWithClauseOpt(interface)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(interface)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(interface)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(interface, DeclarationKind.Class, interface)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1091,10 +1091,10 @@
             parseClassExtendsOpt(is)
               listener: handleNoType(is)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(is)
+            parseClassWithClauseOpt(is)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(is)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(is)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(is, DeclarationKind.Class, is)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1121,10 +1121,10 @@
             parseClassExtendsOpt(late)
               listener: handleNoType(late)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(late)
+            parseClassWithClauseOpt(late)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(late)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(late)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(late, DeclarationKind.Class, late)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1151,10 +1151,10 @@
             parseClassExtendsOpt(library)
               listener: handleNoType(library)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(library)
+            parseClassWithClauseOpt(library)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(library)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(library)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(library, DeclarationKind.Class, library)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1181,10 +1181,10 @@
             parseClassExtendsOpt(mixin)
               listener: handleNoType(mixin)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(mixin)
+            parseClassWithClauseOpt(mixin)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(mixin)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(mixin)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(mixin, DeclarationKind.Class, mixin)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1209,10 +1209,10 @@
             parseClassExtendsOpt(native)
               listener: handleNoType(native)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(native)
+            parseClassWithClauseOpt(native)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(native)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(native)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(native, DeclarationKind.Class, native)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1239,10 +1239,10 @@
             parseClassExtendsOpt(new)
               listener: handleNoType(new)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(new)
+            parseClassWithClauseOpt(new)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(new)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(new)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(new, DeclarationKind.Class, new)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1269,10 +1269,10 @@
             parseClassExtendsOpt(null)
               listener: handleNoType(null)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(null)
+            parseClassWithClauseOpt(null)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(null)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(null)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(null, DeclarationKind.Class, null)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1297,10 +1297,10 @@
             parseClassExtendsOpt(of)
               listener: handleNoType(of)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(of)
+            parseClassWithClauseOpt(of)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(of)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(of)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(of, DeclarationKind.Class, of)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1325,10 +1325,10 @@
             parseClassExtendsOpt(on)
               listener: handleNoType(on)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(on)
+            parseClassWithClauseOpt(on)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(on)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(on)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(on, DeclarationKind.Class, on)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1355,10 +1355,10 @@
             parseClassExtendsOpt(operator)
               listener: handleNoType(operator)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(operator)
+            parseClassWithClauseOpt(operator)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(operator)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(operator)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(operator, DeclarationKind.Class, operator)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1383,10 +1383,10 @@
             parseClassExtendsOpt(out)
               listener: handleNoType(out)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(out)
+            parseClassWithClauseOpt(out)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(out)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(out)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(out, DeclarationKind.Class, out)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1413,10 +1413,10 @@
             parseClassExtendsOpt(part)
               listener: handleNoType(part)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(part)
+            parseClassWithClauseOpt(part)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(part)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(part)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(part, DeclarationKind.Class, part)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1441,10 +1441,10 @@
             parseClassExtendsOpt(patch)
               listener: handleNoType(patch)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(patch)
+            parseClassWithClauseOpt(patch)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(patch)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(patch)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(patch, DeclarationKind.Class, patch)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1471,10 +1471,10 @@
             parseClassExtendsOpt(required)
               listener: handleNoType(required)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(required)
+            parseClassWithClauseOpt(required)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(required)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(required)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(required, DeclarationKind.Class, required)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1501,10 +1501,10 @@
             parseClassExtendsOpt(rethrow)
               listener: handleNoType(rethrow)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(rethrow)
+            parseClassWithClauseOpt(rethrow)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(rethrow)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(rethrow)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(rethrow, DeclarationKind.Class, rethrow)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1531,10 +1531,10 @@
             parseClassExtendsOpt(return)
               listener: handleNoType(return)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(return)
+            parseClassWithClauseOpt(return)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(return)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(return)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(return, DeclarationKind.Class, return)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1561,10 +1561,10 @@
             parseClassExtendsOpt(set)
               listener: handleNoType(set)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(set)
+            parseClassWithClauseOpt(set)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(set)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(set)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(set, DeclarationKind.Class, set)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1589,10 +1589,10 @@
             parseClassExtendsOpt(show)
               listener: handleNoType(show)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(show)
+            parseClassWithClauseOpt(show)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(show)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(show)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(show, DeclarationKind.Class, show)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1617,10 +1617,10 @@
             parseClassExtendsOpt(source)
               listener: handleNoType(source)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(source)
+            parseClassWithClauseOpt(source)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(source)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(source)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(source, DeclarationKind.Class, source)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1647,10 +1647,10 @@
             parseClassExtendsOpt(static)
               listener: handleNoType(static)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(static)
+            parseClassWithClauseOpt(static)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(static)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(static)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(static, DeclarationKind.Class, static)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1677,10 +1677,10 @@
             parseClassExtendsOpt(super)
               listener: handleNoType(super)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(super)
+            parseClassWithClauseOpt(super)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(super)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(super)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(super, DeclarationKind.Class, super)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1707,10 +1707,10 @@
             parseClassExtendsOpt(switch)
               listener: handleNoType(switch)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(switch)
+            parseClassWithClauseOpt(switch)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(switch)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(switch)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(switch, DeclarationKind.Class, switch)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1735,10 +1735,10 @@
             parseClassExtendsOpt(sync)
               listener: handleNoType(sync)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(sync)
+            parseClassWithClauseOpt(sync)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(sync)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(sync)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(sync, DeclarationKind.Class, sync)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1765,10 +1765,10 @@
             parseClassExtendsOpt(this)
               listener: handleNoType(this)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(this)
+            parseClassWithClauseOpt(this)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(this)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(this)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(this, DeclarationKind.Class, this)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1795,10 +1795,10 @@
             parseClassExtendsOpt(throw)
               listener: handleNoType(throw)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(throw)
+            parseClassWithClauseOpt(throw)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(throw)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(throw)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(throw, DeclarationKind.Class, throw)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1825,10 +1825,10 @@
             parseClassExtendsOpt(true)
               listener: handleNoType(true)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(true)
+            parseClassWithClauseOpt(true)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(true)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(true)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(true, DeclarationKind.Class, true)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1855,10 +1855,10 @@
             parseClassExtendsOpt(try)
               listener: handleNoType(try)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(try)
+            parseClassWithClauseOpt(try)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(try)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(try)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(try, DeclarationKind.Class, try)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1885,10 +1885,10 @@
             parseClassExtendsOpt(typedef)
               listener: handleNoType(typedef)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(typedef)
+            parseClassWithClauseOpt(typedef)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(typedef)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(typedef)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(typedef, DeclarationKind.Class, typedef)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1915,10 +1915,10 @@
             parseClassExtendsOpt(var)
               listener: handleNoType(var)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(var)
+            parseClassWithClauseOpt(var)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(var)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(var)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(var, DeclarationKind.Class, var)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1945,10 +1945,10 @@
             parseClassExtendsOpt(void)
               listener: handleNoType(void)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(void)
+            parseClassWithClauseOpt(void)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(void)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(void)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(void, DeclarationKind.Class, void)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1975,10 +1975,10 @@
             parseClassExtendsOpt(while)
               listener: handleNoType(while)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(while)
+            parseClassWithClauseOpt(while)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(while)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(while)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(while, DeclarationKind.Class, while)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -2005,10 +2005,10 @@
             parseClassExtendsOpt(with)
               listener: handleNoType(with)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(with)
+            parseClassWithClauseOpt(with)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(with)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(with)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(with, DeclarationKind.Class, with)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -2033,10 +2033,10 @@
             parseClassExtendsOpt(yield)
               listener: handleNoType(yield)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(yield)
+            parseClassWithClauseOpt(yield)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(yield)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(yield)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(yield, DeclarationKind.Class, yield)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect
index de863a7..c531ce9 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect
@@ -24,12 +24,12 @@
       handleNoType()
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       handleNoType()
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleRecoverClassHeader()
       handleRecoverableError(Message[ExpectedClassOrMixinBody, A class declaration must have a body, even if it is empty., Try adding an empty body., {string: class declaration}], , )
       // WARNING: Reporting at eof for .
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect
index 6dbf406..7f36933 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect
@@ -24,24 +24,24 @@
             parseClassExtendsOpt()
               listener: handleNoType()
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt()
+            parseClassWithClauseOpt()
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt()
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt()
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassHeaderRecovery(, class, class)
             parseClassHeaderOpt(, class, class)
               parseClassExtendsOpt()
-              parseWithClauseOpt()
-              parseClassOrMixinImplementsOpt()
+              parseClassWithClauseOpt()
+              parseClassOrMixinOrEnumImplementsOpt()
             skipUnexpectedTokenOpt(, [extends, with, implements, {])
             parseClassExtendsOpt()
               listener: handleNoType()
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt()
+            parseClassWithClauseOpt()
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt()
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt()
+              listener: handleImplements(null, 0)
             listener: handleRecoverClassHeader()
           ensureBlock(, null, class declaration)
             reportRecoverableError(, Message[ExpectedClassOrMixinBody, A class declaration must have a body, even if it is empty., Try adding an empty body., {string: class declaration}])
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect
index 2735118..5319e1e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect
@@ -34,7 +34,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
@@ -71,7 +71,7 @@
       handleNoType(B)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(List)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect
index fec64a0..2084366 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -86,15 +86,15 @@
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, List)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, B)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, B)
               parseMetadataStar({)
                 listener: beginMetadataStar(List)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect
index 5f9ce60..57ee430 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect
@@ -14,7 +14,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect
index e9142c6..7943b6e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect
index bdef6b4..9966ba4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect
@@ -8,7 +8,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect
index 9b6493f..ef59ba8 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect
index 6e7b413..e72edce 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect
@@ -22,7 +22,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.intertwined.expect
index aa7d85c..facee11 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect
index 1e76544..c08729f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect
@@ -22,7 +22,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.intertwined.expect
index 9e3219e..6b797ae 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.expect
index 385f68c..2f106f1 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.expect
@@ -86,7 +86,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
@@ -131,7 +131,7 @@
       handleNoType(B)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
@@ -203,7 +203,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.intertwined.expect
index de9f8f5..67c819d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -96,15 +96,15 @@
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, B)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, B)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -141,7 +141,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, Stream, ;)
               listener: endMember()
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, B)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, B)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -210,15 +210,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -255,7 +255,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, Stream, ;)
               listener: endMember()
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -338,7 +338,7 @@
                 listener: endClassMethod(null, Stream, (, null, })
               listener: endMember()
             notEofOrValue(}, baz)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, C)
               parseMetadataStar(})
                 listener: beginMetadataStar(baz)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.expect
index 85c2130..1c4ffc0 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.expect
@@ -14,7 +14,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.intertwined.expect
index ab4d7d7..b5de8a7 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(stream)
                 listener: endMetadataStar(0)
@@ -87,7 +87,7 @@
                 listener: endClassMethod(null, stream, (, null, })
               listener: endMember()
             notEofOrValue(}, stream2)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, A)
               parseMetadataStar(})
                 listener: beginMetadataStar(stream2)
                 listener: endMetadataStar(0)
@@ -151,7 +151,7 @@
                 listener: endClassMethod(null, stream2, (, null, })
               listener: endMember()
             notEofOrValue(}, stream3)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, A)
               parseMetadataStar(})
                 listener: beginMetadataStar(stream3)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.expect
index 40b2bb9..40b87ef 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.expect
@@ -142,7 +142,7 @@
       handleNoType(WrapperClass)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect
index ccc4f23..769412a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(WrapperClass)
               listener: handleNoType(WrapperClass)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(WrapperClass)
+            parseClassWithClauseOpt(WrapperClass)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(WrapperClass)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(WrapperClass)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(WrapperClass, DeclarationKind.Class, WrapperClass)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, WrapperClass)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -51,7 +51,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -75,7 +75,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -103,7 +103,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -127,7 +127,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -151,7 +151,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -179,7 +179,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -207,7 +207,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -235,7 +235,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -263,7 +263,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -291,7 +291,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -319,7 +319,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -343,7 +343,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -371,7 +371,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -395,7 +395,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -423,7 +423,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -447,7 +447,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -475,7 +475,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -503,7 +503,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -527,7 +527,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -555,7 +555,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -579,7 +579,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -603,7 +603,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -627,7 +627,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -655,7 +655,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -683,7 +683,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -711,7 +711,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -739,7 +739,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -763,7 +763,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -788,7 +788,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -812,7 +812,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -840,7 +840,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -864,7 +864,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -888,7 +888,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -916,7 +916,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -940,7 +940,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -964,7 +964,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -992,7 +992,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1016,7 +1016,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1040,7 +1040,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1064,7 +1064,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1088,7 +1088,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1116,7 +1116,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1144,7 +1144,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1168,7 +1168,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1192,7 +1192,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1217,7 +1217,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1241,7 +1241,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1265,7 +1265,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1289,7 +1289,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1313,7 +1313,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1341,7 +1341,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1369,7 +1369,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1394,7 +1394,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1418,7 +1418,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1442,7 +1442,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1466,7 +1466,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1494,7 +1494,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1522,7 +1522,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1546,7 +1546,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1573,7 +1573,7 @@
                   listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
                 listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1601,7 +1601,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1629,7 +1629,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1657,7 +1657,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1681,7 +1681,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1709,7 +1709,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1737,7 +1737,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1765,7 +1765,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1793,7 +1793,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect
index 8d03d85..bf58a68 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect
@@ -482,7 +482,7 @@
       handleNoType(WrapperClass)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
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 cce4bfe..22c9cba 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
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(WrapperClass)
               listener: handleNoType(WrapperClass)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(WrapperClass)
+            parseClassWithClauseOpt(WrapperClass)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(WrapperClass)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(WrapperClass)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(WrapperClass, DeclarationKind.Class, WrapperClass)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, WrapperClass)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -171,7 +171,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -315,7 +315,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -454,7 +454,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -598,7 +598,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -745,7 +745,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -924,7 +924,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1071,7 +1071,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1218,7 +1218,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1365,7 +1365,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1465,7 +1465,7 @@
                               parsePrimary(return, expression)
                                 parseConstExpression(return)
                                   listener: beginConstExpression(const)
-                                  parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                                  parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                                     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: (}])
@@ -1517,7 +1517,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1696,7 +1696,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1840,7 +1840,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1987,7 +1987,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2131,7 +2131,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2334,7 +2334,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2478,7 +2478,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2675,7 +2675,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2822,7 +2822,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2966,7 +2966,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3113,7 +3113,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3257,7 +3257,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3401,7 +3401,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3545,7 +3545,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3687,7 +3687,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3926,7 +3926,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4073,7 +4073,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4287,7 +4287,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4431,7 +4431,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4576,7 +4576,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4720,7 +4720,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4905,7 +4905,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5049,7 +5049,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5193,7 +5193,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5340,7 +5340,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5484,7 +5484,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5628,7 +5628,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5807,7 +5807,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5951,7 +5951,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6095,7 +6095,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6239,7 +6239,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6383,7 +6383,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6484,7 +6484,7 @@
                                 parseNewExpression(return)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     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: (}])
@@ -6536,7 +6536,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6678,7 +6678,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6822,7 +6822,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6966,7 +6966,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7112,7 +7112,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7256,7 +7256,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7400,7 +7400,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7544,7 +7544,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7688,7 +7688,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7835,7 +7835,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7978,7 +7978,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8123,7 +8123,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8267,7 +8267,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8411,7 +8411,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8555,7 +8555,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8696,7 +8696,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8890,7 +8890,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9034,7 +9034,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9058,7 +9058,7 @@
                   listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
                 listener: endMember()
             notEofOrValue(}, ()
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(()
                 listener: endMetadataStar(0)
@@ -9198,7 +9198,7 @@
                   listener: endClassMethod(null, , (, null, })
                 listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9340,7 +9340,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9482,7 +9482,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9667,7 +9667,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9811,7 +9811,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -10050,7 +10050,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -10290,7 +10290,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -10475,7 +10475,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -10622,7 +10622,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.expect
index ed0b4ec..6085b02 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.expect
@@ -39,7 +39,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.intertwined.expect
index d1916b7..194b6ca 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.intertwined.expect
@@ -62,10 +62,10 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
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 3737602..bad4dea 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)
+                          parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                             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)
+                          parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                             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/method_called_with.dart.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.expect
index 38b0d73..3ec322e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.expect
@@ -34,7 +34,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.intertwined.expect
index dfc8af9..a3ee2de 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -71,7 +71,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -99,7 +99,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -140,7 +140,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.expect
index 58af32b..5f2c8b0 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.intertwined.expect
index 77060d5..0bfc02a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -67,7 +67,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -91,7 +91,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -128,7 +128,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.expect
index b16f9b0..2975c4f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.expect
@@ -30,7 +30,7 @@
       handleNoType(B)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -56,7 +56,7 @@
       handleNoType(M1)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(foo)
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.intertwined.expect
index 56c4e3a..ec3e1aa 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -70,15 +70,15 @@
             parseClassExtendsOpt(M1)
               listener: handleNoType(M1)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(M1)
+            parseClassWithClauseOpt(M1)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(M1)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(M1)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(M1, DeclarationKind.Class, M1)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, M1)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, M1)
               parseMetadataStar({)
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -101,7 +101,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, foo, ;)
               listener: endMember()
             notEofOrValue(}, class)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, M1)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, M1)
               parseMetadataStar(;)
                 listener: beginMetadataStar(class)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/extension_named_type.dart.expect b/pkg/front_end/parser_testcases/extension_named_type.dart.expect
index 390e380..cf2bd6f 100644
--- a/pkg/front_end/parser_testcases/extension_named_type.dart.expect
+++ b/pkg/front_end/parser_testcases/extension_named_type.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
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 7e8cccc..f67f847 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
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -47,7 +47,7 @@
         parseClassOrMixinOrExtensionBody(A, DeclarationKind.Extension, type)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, method)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, type)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, type)
             parseMetadataStar({)
               listener: beginMetadataStar(method)
               listener: endMetadataStar(0)
@@ -140,7 +140,7 @@
                                       parseNewExpression(()
                                         isNextIdentifier(new)
                                         listener: beginNewExpression(new)
-                                        parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                        parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                           ensureIdentifier(new, constructorReference)
                                             listener: handleIdentifier(A, constructorReference)
                                           listener: beginConstructorReference(A)
diff --git a/pkg/front_end/parser_testcases/extension_type.dart.expect b/pkg/front_end/parser_testcases/extension_type.dart.expect
index 34b0e66..69cafad 100644
--- a/pkg/front_end/parser_testcases/extension_type.dart.expect
+++ b/pkg/front_end/parser_testcases/extension_type.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect b/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect
index eb48c9c..200f4ca 100644
--- a/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/extensions/covariant.dart.expect b/pkg/front_end/parser_testcases/extensions/covariant.dart.expect
index 373c791..2d5e28f 100644
--- a/pkg/front_end/parser_testcases/extensions/covariant.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/covariant.dart.expect
@@ -14,7 +14,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -31,7 +31,7 @@
       handleType(A, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect
index eda0664..8dac2d3 100644
--- a/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -50,10 +50,10 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(A, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -78,7 +78,7 @@
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, addChild)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(addChild)
               listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect
index 743ab38..a66993b 100644
--- a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -25,7 +25,7 @@
       handleType(A, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect
index bd2782c..8b610fd 100644
--- a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -50,10 +50,10 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(A, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -78,7 +78,7 @@
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, addChild)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(addChild)
               listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/extensions/static.dart.expect b/pkg/front_end/parser_testcases/extensions/static.dart.expect
index 98f02d9..0a73b25 100644
--- a/pkg/front_end/parser_testcases/extensions/static.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/static.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -25,7 +25,7 @@
       handleType(A, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect
index da7d071..9efff07 100644
--- a/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -50,10 +50,10 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(A, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -78,7 +78,7 @@
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, static)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(static)
               listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect
index d94b4bf..6e3a17c 100644
--- a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect
@@ -14,7 +14,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -31,7 +31,7 @@
       handleType(A, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect
index 02b460b..c7ba3ab 100644
--- a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -50,10 +50,10 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(A, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -78,7 +78,7 @@
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, static)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(static)
               listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.expect
index eb5a5c5..ea7558e 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(WrapperClass)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.intertwined.expect
index 1b1c156..4196505 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(WrapperClass)
               listener: handleNoType(WrapperClass)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(WrapperClass)
+            parseClassWithClauseOpt(WrapperClass)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(WrapperClass)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(WrapperClass)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(WrapperClass, DeclarationKind.Class, WrapperClass)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, WrapperClass)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -51,7 +51,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -75,7 +75,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -99,7 +99,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -123,7 +123,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -147,7 +147,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -171,7 +171,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -195,7 +195,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -219,7 +219,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -243,7 +243,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -268,7 +268,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -292,7 +292,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -316,7 +316,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -340,7 +340,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -364,7 +364,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -389,7 +389,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -413,7 +413,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -437,7 +437,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -462,7 +462,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -486,7 +486,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.expect
index 28e4f56..be1cef5 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(WrapperClass)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.intertwined.expect
index b31da29..7196e63 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(WrapperClass)
               listener: handleNoType(WrapperClass)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(WrapperClass)
+            parseClassWithClauseOpt(WrapperClass)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(WrapperClass)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(WrapperClass)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(WrapperClass, DeclarationKind.Class, WrapperClass)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, WrapperClass)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -164,7 +164,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -301,7 +301,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -438,7 +438,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -575,7 +575,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -712,7 +712,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -849,7 +849,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -986,7 +986,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1123,7 +1123,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1260,7 +1260,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1398,7 +1398,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1535,7 +1535,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1672,7 +1672,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1809,7 +1809,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1946,7 +1946,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2085,7 +2085,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2222,7 +2222,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2359,7 +2359,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2497,7 +2497,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2634,7 +2634,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
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 11e6ef5..b8955d7 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')
+                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'ComplexTypeParamOrArgInfo', false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(f, constructorReference)
                     listener: beginConstructorReference(f)
diff --git a/pkg/front_end/parser_testcases/general/issue_41121.dart.expect b/pkg/front_end/parser_testcases/general/issue_41121.dart.expect
index 6dd127f..31e37e0 100644
--- a/pkg/front_end/parser_testcases/general/issue_41121.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_41121.dart.expect
@@ -50,7 +50,7 @@
       handleNoType(ConfigurationService)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Configuration)
@@ -279,7 +279,7 @@
       handleNoType(Configuration)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Configuration)
diff --git a/pkg/front_end/parser_testcases/general/issue_41121.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_41121.dart.intertwined.expect
index befa373..ee486f9 100644
--- a/pkg/front_end/parser_testcases/general/issue_41121.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_41121.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(ConfigurationService)
               listener: handleNoType(ConfigurationService)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(ConfigurationService)
+            parseClassWithClauseOpt(ConfigurationService)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(ConfigurationService)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(ConfigurationService)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(ConfigurationService, DeclarationKind.Class, ConfigurationService)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Configuration)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar({)
                 listener: beginMetadataStar(Configuration)
                 listener: endMetadataStar(0)
@@ -44,7 +44,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, Configuration, ;)
               listener: endMember()
             notEofOrValue(}, ConfigurationService)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(;)
                 listener: beginMetadataStar(ConfigurationService)
                 listener: endMetadataStar(0)
@@ -146,7 +146,7 @@
                 listener: endClassConstructor(null, ConfigurationService, (, :, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -253,7 +253,7 @@
                 listener: endClassConstructor(set, void, (, :, })
               listener: endMember()
             notEofOrValue(}, Configuration)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(})
                 listener: beginMetadataStar(Configuration)
                 listener: endMetadataStar(0)
@@ -385,7 +385,7 @@
                 listener: endClassConstructor(get, Configuration, (, :, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -445,7 +445,7 @@
                 listener: endClassConstructor(null, void, (, :, })
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -524,15 +524,15 @@
             parseClassExtendsOpt(Configuration)
               listener: handleNoType(Configuration)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Configuration)
+            parseClassWithClauseOpt(Configuration)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Configuration)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Configuration)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Configuration, DeclarationKind.Class, Configuration)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Configuration)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Configuration)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Configuration)
               parseMetadataStar({)
                 listener: beginMetadataStar(Configuration)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/general/metadata.dart.expect b/pkg/front_end/parser_testcases/general/metadata.dart.expect
index 9b86851..591d9e1 100644
--- a/pkg/front_end/parser_testcases/general/metadata.dart.expect
+++ b/pkg/front_end/parser_testcases/general/metadata.dart.expect
@@ -111,7 +111,7 @@
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -943,7 +943,7 @@
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect
index a1c1e01..676c00f 100644
--- a/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect
@@ -241,10 +241,10 @@
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1726,10 +1726,10 @@
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect
index 97bcac4..988d84a 100644
--- a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect
+++ b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect
@@ -50,7 +50,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
@@ -151,7 +151,7 @@
       handleNoType(D)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(factory)
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 7af61b0..a0d0817 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
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -63,7 +63,7 @@
                 listener: endClassConstructor(null, C, (, null, ;)
               listener: endMember()
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -148,7 +148,7 @@
                 listener: endClassConstructor(null, C, (, :, })
               listener: endMember()
             notEofOrValue(}, new)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, C)
               parseMetadataStar(})
                 listener: beginMetadataStar(new)
                 listener: endMetadataStar(0)
@@ -159,7 +159,7 @@
                 listener: handleInvalidMember(new)
                 listener: endMember()
             notEofOrValue(}, =)
-            parseClassOrMixinOrExtensionMemberImpl(new, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(new, DeclarationKind.Class, C)
               parseMetadataStar(new)
                 listener: beginMetadataStar(=)
                 listener: endMetadataStar(0)
@@ -204,7 +204,7 @@
                     listener: endClassMethod(null, operator, (, null, })
                   listener: endMember()
             notEofOrValue(}, null)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, C)
               parseMetadataStar(})
                 listener: beginMetadataStar(null)
                 listener: endMetadataStar(0)
@@ -215,7 +215,7 @@
                 listener: handleInvalidMember(null)
                 listener: endMember()
             notEofOrValue(}, ;)
-            parseClassOrMixinOrExtensionMemberImpl(null, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(null, DeclarationKind.Class, C)
               parseMetadataStar(null)
                 listener: beginMetadataStar(;)
                 listener: endMetadataStar(0)
@@ -246,15 +246,15 @@
             parseClassExtendsOpt(D)
               listener: handleNoType(D)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(D)
+            parseClassWithClauseOpt(D)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(D)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(D)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(D, DeclarationKind.Class, D)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, D)
               parseMetadataStar({)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -305,7 +305,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -331,7 +331,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(C, constructorReference)
                     listener: beginConstructorReference(C)
@@ -350,7 +350,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -376,7 +376,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(C, constructorReference)
                     listener: beginConstructorReference(C)
@@ -396,7 +396,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -422,7 +422,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(prefix, constructorReference)
                     listener: beginConstructorReference(prefix)
@@ -442,7 +442,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -468,7 +468,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(prefix, constructorReference)
                     listener: beginConstructorReference(prefix)
@@ -492,7 +492,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, D)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(D)
                 listener: endMetadataStar(0)
@@ -555,7 +555,7 @@
                 listener: endClassConstructor(null, D, (, :, ;)
               listener: endMember()
             notEofOrValue(}, D)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(D)
                 listener: endMetadataStar(0)
@@ -639,7 +639,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -680,7 +680,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -722,7 +722,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -764,7 +764,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -811,7 +811,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -853,7 +853,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -896,7 +896,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -939,7 +939,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -1030,7 +1030,7 @@
               parseUnaryExpression(=, true)
                 parseImplicitCreationExpression(=, <, Instance of 'SimpleTypeArgument1')
                   listener: beginImplicitCreationExpression(C)
-                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1')
+                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1', false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(C, constructorReference)
                     listener: beginConstructorReference(C)
@@ -1128,7 +1128,7 @@
               parseUnaryExpression(=, true)
                 parseImplicitCreationExpression(=, <, Instance of 'SimpleTypeArgument1')
                   listener: beginImplicitCreationExpression(prefix)
-                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1')
+                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1', false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(prefix, constructorReference)
                     listener: beginConstructorReference(prefix)
diff --git a/pkg/front_end/parser_testcases/general/operator_01.dart.expect b/pkg/front_end/parser_testcases/general/operator_01.dart.expect
index f273b12..7a98e55 100644
--- a/pkg/front_end/parser_testcases/general/operator_01.dart.expect
+++ b/pkg/front_end/parser_testcases/general/operator_01.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(bool)
diff --git a/pkg/front_end/parser_testcases/general/operator_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/operator_01.dart.intertwined.expect
index eab60b8..150a67f 100644
--- a/pkg/front_end/parser_testcases/general/operator_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/operator_01.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, bool)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(bool)
                 listener: endMetadataStar(0)
@@ -85,7 +85,7 @@
                 listener: endClassMethod(null, bool, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -143,7 +143,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, bool)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(bool)
                 listener: endMetadataStar(0)
@@ -201,7 +201,7 @@
                 listener: endClassMethod(null, bool, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -259,7 +259,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.expect b/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.expect
index 9b45570..220fb22 100644
--- a/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.expect
@@ -15,7 +15,7 @@
       handleNoType(operator)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(operator)
diff --git a/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.intertwined.expect
index efe9efb..ae300e1 100644
--- a/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.intertwined.expect
@@ -21,15 +21,15 @@
             parseClassExtendsOpt(operator)
               listener: handleNoType(operator)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(operator)
+            parseClassWithClauseOpt(operator)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(operator)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(operator)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(operator, DeclarationKind.Class, operator)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, operator)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, operator)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, operator)
               parseMetadataStar({)
                 listener: beginMetadataStar(operator)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect
index b9eb4f6..431b3ea 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect
@@ -62,7 +62,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
@@ -174,7 +174,7 @@
       handleNoType(Bar)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect
index 93bf99d..0dad422 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect
@@ -20,15 +20,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -47,7 +47,7 @@
                 listener: endClassFields(abstract, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -64,7 +64,7 @@
                 listener: endClassFields(abstract, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -83,7 +83,7 @@
                 listener: endClassFields(abstract, null, null, covariant, null, null, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -100,7 +100,7 @@
                 listener: endClassFields(abstract, null, null, covariant, null, var, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -117,7 +117,7 @@
                 listener: endClassFields(abstract, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, var)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
@@ -134,7 +134,7 @@
                 listener: endClassFields(abstract, null, null, null, null, var, 1, var, ;)
               listener: endMember()
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -155,7 +155,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, C, ;)
               listener: endMember()
             notEofOrValue(}, i7)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(i7)
                 listener: endMetadataStar(0)
@@ -213,15 +213,15 @@
             parseClassExtendsOpt(Bar)
               listener: handleNoType(Bar)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Bar)
+            parseClassWithClauseOpt(Bar)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Bar)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Bar)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(Bar, DeclarationKind.Class, Bar)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Bar)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Bar)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect
index 140bdbf..0f039f2 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect
@@ -68,7 +68,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect
index 6c9e4f0..b6e296e 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect
@@ -55,15 +55,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -82,7 +82,7 @@
                 listener: endClassFields(null, external, null, covariant, null, null, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -101,7 +101,7 @@
                 listener: endClassFields(null, external, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -118,7 +118,7 @@
                 listener: endClassFields(null, external, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -135,7 +135,7 @@
                 listener: endClassFields(null, external, static, null, null, final, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -152,7 +152,7 @@
                 listener: endClassFields(null, external, static, null, null, final, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect
index 946637f..ff7df27 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect
@@ -64,7 +64,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect
index 2f526a0..b3d9581 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect
@@ -86,15 +86,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -112,7 +112,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -165,7 +165,7 @@
                 listener: endClassMethod(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.expect
index 472072e..e8f8cc3 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(operator)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.intertwined.expect
index 6aa168e..48f91db 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, operator)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(operator)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect
index d9594d1..0917000 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(operator)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect
index ced9b4e..fb8706d 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, operator)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(operator)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.expect
index 1328dc8..3928968 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.expect
@@ -34,7 +34,7 @@
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.intertwined.expect
index 26b7bad..dbb38a1 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -45,7 +45,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -63,7 +63,7 @@
                 listener: endClassFields(null, null, static, null, late, null, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -81,7 +81,7 @@
                 listener: endClassFields(null, null, null, covariant, late, null, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -106,7 +106,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -131,7 +131,7 @@
                 listener: endClassFields(null, null, static, null, late, null, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.expect
index 7ebeff9..000e5f1 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(var)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.intertwined.expect
index 1d8ef6f..390d560 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, var)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
@@ -42,7 +42,7 @@
                 listener: endClassFields(null, null, null, null, null, var, 1, var, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -57,7 +57,7 @@
                 listener: endClassFields(null, null, static, null, null, var, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -72,7 +72,7 @@
                 listener: endClassFields(null, null, null, covariant, null, var, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, var)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
@@ -94,7 +94,7 @@
                 listener: endClassFields(null, null, null, null, null, var, 1, var, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -116,7 +116,7 @@
                 listener: endClassFields(null, null, static, null, null, var, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.expect
index 890579d..c8d1dbb 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.intertwined.expect
index a42a169..d9d2694 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.expect
index 8125755..5ee07df 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.expect
@@ -14,7 +14,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.intertwined.expect
index 777b6f6..6458925 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.expect
index 0c383ad..a29e8f2 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.expect
@@ -14,7 +14,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.intertwined.expect
index 40f8c8c5..da73524 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.expect
index 0906f4b..1d39a3c 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(String)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.intertwined.expect
index cd68ac3..6a80fc4 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, String)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(String)
                 listener: endMetadataStar(0)
@@ -44,7 +44,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, String, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -61,7 +61,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -167,7 +167,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -312,7 +312,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -457,7 +457,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -602,7 +602,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.expect
index cdf1f37..a8f4c2d 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(String)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.intertwined.expect
index da43b09..b03cb1b 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, String)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(String)
                 listener: endMetadataStar(0)
@@ -44,7 +44,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, String, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -61,7 +61,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.expect
index 508f6c9..d9b3888 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(String)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.intertwined.expect
index 6d5cd4e..7ac308d 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, String)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(String)
                 listener: endMetadataStar(0)
@@ -44,7 +44,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, String, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -61,7 +61,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -198,7 +198,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -339,7 +339,7 @@
                 listener: endClassMethod(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.expect
index 4bb704e..627e902 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.expect
@@ -76,7 +76,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.intertwined.expect
index 1b2b88b..fd8e6dc 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.intertwined.expect
@@ -199,15 +199,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -260,7 +260,7 @@
                 listener: endClassConstructor(null, C, (, :, ;)
               listener: endMember()
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect
index 6bc57b5..a4fad4a 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect
@@ -312,7 +312,7 @@
       handleNoType(Order)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(List)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect
index 45828a7..319ea20 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect
@@ -647,15 +647,15 @@
             parseClassExtendsOpt(Order)
               listener: handleNoType(Order)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Order)
+            parseClassWithClauseOpt(Order)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Order)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Order)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Order, DeclarationKind.Class, Order)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, List)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Order)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Order)
               parseMetadataStar({)
                 listener: beginMetadataStar(List)
                 listener: endMetadataStar(0)
@@ -672,7 +672,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, List, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Order)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Order)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/late_member.dart.expect b/pkg/front_end/parser_testcases/nnbd/late_member.dart.expect
index 1bf1597..00eb347 100644
--- a/pkg/front_end/parser_testcases/nnbd/late_member.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/late_member.dart.expect
@@ -127,7 +127,7 @@
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
@@ -165,7 +165,7 @@
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
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 23a7bb2..362c55c 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)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     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)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 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)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
@@ -338,15 +338,15 @@
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -430,15 +430,15 @@
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Y)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Y)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.expect b/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.expect
index 52d88f1..e528774 100644
--- a/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.expect
@@ -145,7 +145,7 @@
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
@@ -183,7 +183,7 @@
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
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 cbd34da..a61b867 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)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     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)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 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)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
@@ -387,15 +387,15 @@
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -479,15 +479,15 @@
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Y)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Y)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.expect b/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.expect
index 938445a..45f4ec7 100644
--- a/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Class1)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.intertwined.expect
index fb15bbe..fa8e973 100644
--- a/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Class1)
               listener: handleNoType(Class1)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Class1)
+            parseClassWithClauseOpt(Class1)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Class1)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Class1)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Class1, DeclarationKind.Class, Class1)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Class1)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Class1)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -85,7 +85,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Class1)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Class1)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/required_member.dart.expect b/pkg/front_end/parser_testcases/nnbd/required_member.dart.expect
index f4825f1..b2d3c4d 100644
--- a/pkg/front_end/parser_testcases/nnbd/required_member.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/required_member.dart.expect
@@ -127,7 +127,7 @@
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(required)
@@ -165,7 +165,7 @@
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
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 ef231a3..84da6c5 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)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     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)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 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)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
@@ -338,15 +338,15 @@
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, required)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(required)
                 listener: endMetadataStar(0)
@@ -430,15 +430,15 @@
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Y)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Y)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.expect b/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.expect
index cc013e8..8af1629 100644
--- a/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.expect
@@ -138,7 +138,7 @@
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(required)
@@ -176,7 +176,7 @@
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
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 2842ce5..a184fd5 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)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     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)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 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)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
@@ -354,15 +354,15 @@
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, required)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(required)
                 listener: endMetadataStar(0)
@@ -446,15 +446,15 @@
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Y)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Y)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect
index 5d002ad..e5eb201 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect
@@ -30,7 +30,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Foo)
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 0608f92..823d3fc 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
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -131,7 +131,7 @@
                               parseNewExpression(=)
                                 isNextIdentifier(new)
                                 listener: beginNewExpression(new)
-                                parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                   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.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect
index 1c1a7be..df508f2 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(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 a38d2eb..30851c1 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
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -128,7 +128,7 @@
                               parseNewExpression(=)
                                 isNextIdentifier(new)
                                 listener: beginNewExpression(new)
-                                parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                   ensureIdentifier(new, constructorReference)
                                     listener: handleIdentifier(Foo, constructorReference)
                                   listener: beginConstructorReference(Foo)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
index ab01add..c29258b 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
@@ -112,7 +112,7 @@
       handleType(List, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
index 1d0b84e..1917d68 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
@@ -19,7 +19,7 @@
         parseClassOrMixinOrExtensionBody(Symbol, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, String)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(String)
               listener: endMetadataStar(0)
@@ -70,7 +70,7 @@
               listener: endExtensionMethod(null, String, (, null, ;)
             listener: endMember()
           notEofOrValue(}, String)
-          parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Extension, null)
             parseMetadataStar(;)
               listener: beginMetadataStar(String)
               listener: endMetadataStar(0)
@@ -237,10 +237,10 @@
                 listener: endTypeArguments(1, <, >)
                 listener: handleType(List, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect
index ccf89b4..bf983c2 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(late)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -39,7 +39,7 @@
       handleNoType(required)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -70,7 +70,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect
index 8a856d0..2a31e5e 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(late)
               listener: handleNoType(late)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(late)
+            parseClassWithClauseOpt(late)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(late)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(late)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(late, DeclarationKind.Class, late)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, late)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, late)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -84,15 +84,15 @@
             parseClassExtendsOpt(required)
               listener: handleNoType(required)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(required)
+            parseClassWithClauseOpt(required)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(required)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(required)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(required, DeclarationKind.Class, required)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, required)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, required)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -149,15 +149,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -192,7 +192,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, required)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(required)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.expect
index f7cda4b..73ec228 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Xlate)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -39,7 +39,7 @@
       handleNoType(Xrequired)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -70,7 +70,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Xlate)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.intertwined.expect
index 20506bd..06103bb 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Xlate)
               listener: handleNoType(Xlate)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Xlate)
+            parseClassWithClauseOpt(Xlate)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Xlate)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Xlate)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Xlate, DeclarationKind.Class, Xlate)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Xlate)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Xlate)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -84,15 +84,15 @@
             parseClassExtendsOpt(Xrequired)
               listener: handleNoType(Xrequired)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Xrequired)
+            parseClassWithClauseOpt(Xrequired)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Xrequired)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Xrequired)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Xrequired, DeclarationKind.Class, Xrequired)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Xrequired)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Xrequired)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -149,15 +149,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Xlate)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(Xlate)
                 listener: endMetadataStar(0)
@@ -192,7 +192,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, Xlate, ;)
               listener: endMember()
             notEofOrValue(}, Xrequired)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Xrequired)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.expect
index 42d27b1..6489670 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.expect
@@ -16,7 +16,7 @@
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -38,7 +38,7 @@
         handleType(num, ?)
       endTypeArguments(1, <, >)
       handleType(A, null)
-      handleClassOrMixinImplements(implements, 1)
+      handleImplements(implements, 1)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.intertwined.expect
index 5d322f3..574de45 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.intertwined.expect
@@ -27,10 +27,10 @@
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -55,9 +55,9 @@
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
+            parseClassOrMixinOrEnumImplementsOpt(B)
               ensureIdentifier(implements, typeReference)
                 listener: handleIdentifier(A, typeReference)
               listener: beginTypeArguments(<)
@@ -66,7 +66,7 @@
               listener: handleType(num, ?)
               listener: endTypeArguments(1, <, >)
               listener: handleType(A, null)
-              listener: handleClassOrMixinImplements(implements, 1)
+              listener: handleImplements(implements, 1)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect
index 4593ff2..025b95b 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect
@@ -250,7 +250,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect
index 69d7a34..4029ed4 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect
@@ -348,15 +348,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -373,7 +373,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -393,7 +393,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -417,7 +417,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, List, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -437,7 +437,7 @@
                 listener: endClassFields(null, null, null, null, late, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -454,7 +454,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, ;)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(;)
                 listener: endMetadataStar(0)
@@ -465,7 +465,7 @@
                 listener: handleInvalidMember(;)
                 listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -483,7 +483,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, ;)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(;)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect
index ccb78dd..9835fbf 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect
@@ -129,7 +129,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(void)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect
index 22ec782..8a6632f 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect
@@ -266,15 +266,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/test/fasta/util/parser_ast_test.dart b/pkg/front_end/test/fasta/util/parser_ast_test.dart
index 4d74a08..e002d6d 100644
--- a/pkg/front_end/test/fasta/util/parser_ast_test.dart
+++ b/pkg/front_end/test/fasta/util/parser_ast_test.dart
@@ -157,7 +157,7 @@
   expect("Foo", decl.getIdentifier().token.lexeme);
   ClassExtendsHandle extendsDecl = cls.getClassExtends();
   expect("extends", extendsDecl.extendsKeyword?.lexeme);
-  ClassOrMixinImplementsHandle implementsDecl = cls.getClassImplements();
+  ImplementsHandle implementsDecl = cls.getClassImplements();
   expect("implements", implementsDecl.implementsKeyword?.lexeme);
   ClassWithClauseHandle? withClauseDecl = cls.getClassWithClause();
   expect(null, withClauseDecl);
diff --git a/pkg/front_end/test/parser_test_listener.dart b/pkg/front_end/test/parser_test_listener.dart
index 88cfa97..f90c7fa 100644
--- a/pkg/front_end/test/parser_test_listener.dart
+++ b/pkg/front_end/test/parser_test_listener.dart
@@ -214,12 +214,9 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
     seen(implementsKeyword);
-    doPrint('handleClassOrMixinImplements('
-        '$implementsKeyword, '
-        '$interfacesCount)');
+    doPrint('handleImplements(' '$implementsKeyword, ' '$interfacesCount)');
   }
 
   @override
@@ -450,11 +447,60 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
     indent--;
     seen(enumKeyword);
     seen(leftBrace);
-    doPrint('endEnum(' '$enumKeyword, ' '$leftBrace, ' '$count)');
+    doPrint('endEnum(' '$enumKeyword, ' '$leftBrace, ' '$memberCount)');
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    indent--;
+    seen(getOrSet);
+    seen(beginToken);
+    seen(beginParam);
+    seen(beginInitializers);
+    seen(endToken);
+    doPrint('endEnumConstructor('
+        '$getOrSet, '
+        '$beginToken, '
+        '$beginParam, '
+        '$beginInitializers, '
+        '$endToken)');
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    seen(elementsEndToken);
+    doPrint('handleEnumElements(' '$elementsEndToken, ' '$elementsCount)');
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    seen(enumKeyword);
+    seen(leftBrace);
+    doPrint('handleEnumHeader(' '$enumKeyword, ' '$leftBrace)');
+  }
+
+  @override
+  void handleEnumElement(Token beginToken) {
+    seen(beginToken);
+    doPrint('handleEnumElement(' '$beginToken)');
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    indent--;
+    seen(beginToken);
+    seen(factoryKeyword);
+    seen(endToken);
+    doPrint('endEnumFactoryMethod('
+        '$beginToken, '
+        '$factoryKeyword, '
+        '$endToken)');
   }
 
   @override
@@ -704,6 +750,55 @@
   }
 
   @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    indent--;
+    seen(abstractToken);
+    seen(externalToken);
+    seen(staticToken);
+    seen(covariantToken);
+    seen(lateToken);
+    seen(varFinalOrConst);
+    seen(beginToken);
+    seen(endToken);
+    doPrint('endEnumFields('
+        '$abstractToken, '
+        '$externalToken, '
+        '$staticToken, '
+        '$covariantToken, '
+        '$lateToken, '
+        '$varFinalOrConst, '
+        '$count, '
+        '$beginToken, '
+        '$endToken)');
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    indent--;
+    seen(getOrSet);
+    seen(beginToken);
+    seen(beginParam);
+    seen(beginInitializers);
+    seen(endToken);
+    doPrint('endEnumMethod('
+        '$getOrSet, '
+        '$beginToken, '
+        '$beginParam, '
+        '$beginInitializers, '
+        '$endToken)');
+  }
+
+  @override
   void handleForInitializerEmptyStatement(Token token) {
     seen(token);
     doPrint('handleForInitializerEmptyStatement(' '$token)');
@@ -910,6 +1005,17 @@
   }
 
   @override
+  void handleEnumWithClause(Token withKeyword) {
+    seen(withKeyword);
+    doPrint('handleEnumWithClause(' '$withKeyword)');
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    doPrint('handleEnumNoWithClause()');
+  }
+
+  @override
   void beginNamedMixinApplication(
       Token begin, Token? abstractToken, Token name) {
     seen(begin);
@@ -2311,6 +2417,12 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    seen(token);
+    doPrint('handleNoTypeNameInConstructorReference(' '$token)');
+  }
+
+  @override
   void handleNoType(Token lastConsumed) {
     seen(lastConsumed);
     doPrint('handleNoType(' '$lastConsumed)');
diff --git a/pkg/front_end/test/parser_test_parser.dart b/pkg/front_end/test/parser_test_parser.dart
index a6ba2ca..139220a 100644
--- a/pkg/front_end/test/parser_test_parser.dart
+++ b/pkg/front_end/test/parser_test_parser.dart
@@ -392,10 +392,19 @@
   }
 
   @override
-  Token parseWithClauseOpt(Token token) {
-    doPrint('parseWithClauseOpt(' '$token)');
+  Token parseClassWithClauseOpt(Token token) {
+    doPrint('parseClassWithClauseOpt(' '$token)');
     indent++;
-    var result = super.parseWithClauseOpt(token);
+    var result = super.parseClassWithClauseOpt(token);
+    indent--;
+    return result;
+  }
+
+  @override
+  Token parseEnumWithClauseOpt(Token token) {
+    doPrint('parseEnumWithClauseOpt(' '$token)');
+    indent++;
+    var result = super.parseEnumWithClauseOpt(token);
     indent--;
     return result;
   }
@@ -555,6 +564,24 @@
   }
 
   @override
+  Token parseEnumHeaderOpt(Token token, Token enumKeyword) {
+    doPrint('parseEnumHeaderOpt(' '$token, ' '$enumKeyword)');
+    indent++;
+    var result = super.parseEnumHeaderOpt(token, enumKeyword);
+    indent--;
+    return result;
+  }
+
+  @override
+  Token parseEnumElement(Token token) {
+    doPrint('parseEnumElement(' '$token)');
+    indent++;
+    var result = super.parseEnumElement(token);
+    indent--;
+    return result;
+  }
+
+  @override
   Token parseClassOrNamedMixinApplication(
       Token? abstractToken, Token classKeyword) {
     doPrint('parseClassOrNamedMixinApplication('
@@ -628,10 +655,10 @@
   }
 
   @override
-  Token parseClassOrMixinImplementsOpt(Token token) {
-    doPrint('parseClassOrMixinImplementsOpt(' '$token)');
+  Token parseClassOrMixinOrEnumImplementsOpt(Token token) {
+    doPrint('parseClassOrMixinOrEnumImplementsOpt(' '$token)');
     indent++;
-    var result = super.parseClassOrMixinImplementsOpt(token);
+    var result = super.parseClassOrMixinOrEnumImplementsOpt(token);
     indent--;
     return result;
   }
@@ -1126,14 +1153,14 @@
   }
 
   @override
-  Token parseClassOrMixinOrExtensionMemberImpl(
+  Token parseClassOrMixinOrExtensionOrEnumMemberImpl(
       Token token, DeclarationKind kind, String? enclosingDeclarationName) {
-    doPrint('parseClassOrMixinOrExtensionMemberImpl('
+    doPrint('parseClassOrMixinOrExtensionOrEnumMemberImpl('
         '$token, '
         '$kind, '
         '$enclosingDeclarationName)');
     indent++;
-    var result = super.parseClassOrMixinOrExtensionMemberImpl(
+    var result = super.parseClassOrMixinOrExtensionOrEnumMemberImpl(
         token, kind, enclosingDeclarationName);
     indent--;
     return result;
@@ -1279,14 +1306,15 @@
   @override
   Token parseConstructorReference(
       Token token, ConstructorReferenceContext constructorReferenceContext,
-      [TypeParamOrArgInfo? typeArg]) {
+      [TypeParamOrArgInfo? typeArg, bool isImplicitTypeName = false]) {
     doPrint('parseConstructorReference('
         '$token, '
         '$constructorReferenceContext, '
-        '$typeArg)');
+        '$typeArg, '
+        '$isImplicitTypeName)');
     indent++;
-    var result = super
-        .parseConstructorReference(token, constructorReferenceContext, typeArg);
+    var result = super.parseConstructorReference(
+        token, constructorReferenceContext, typeArg, isImplicitTypeName);
     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 3132c1c..89cc303 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -179,6 +179,7 @@
 charcode
 chars
 checkpoint
+chloestefantsova
 chunks
 ci
 circuited
@@ -273,6 +274,7 @@
 cryptic
 crypto
 csslib
+cstefantsova
 ctx
 customized
 cut
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 4a5faff..28be9b1 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -597,6 +597,7 @@
 consider
 considered
 considers
+consist
 consistency
 consistent
 consistently
@@ -2044,6 +2045,7 @@
 ok
 old
 older
+omission
 omit
 omitted
 on
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart
new file mode 100644
index 0000000..a645a364
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart
@@ -0,0 +1,14 @@
+// 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.
+
+enum E<X, Y> {
+  one<int, String>(),
+  two<double, num>(),
+  three<int, int>.named(42);
+
+  const E();
+  const E.named(int value);
+}
+
+main() {}
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
new file mode 100644
index 0000000..b4016d7
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C10;
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = #C9;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "three"
+  #C9 = self::E {index:#C7, _name:#C8}
+  #C10 = <self::E>[#C3, #C6, #C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///entries_with_type_arguments.dart:
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
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
new file mode 100644
index 0000000..b4016d7
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C10;
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = #C9;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "three"
+  #C9 = self::E {index:#C7, _name:#C8}
+  #C10 = <self::E>[#C3, #C6, #C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///entries_with_type_arguments.dart:
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
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
new file mode 100644
index 0000000..4fa6f4d
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+enum E<X, Y> { one<int, String>(), two<double, num>(), three<int, int>.named(42); 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
new file mode 100644
index 0000000..a7d67d3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C10;
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = #C9;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "three"
+  #C9 = self::E {index:#C7, _name:#C8}
+  #C10 = <self::E*>[#C3, #C6, #C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///entries_with_type_arguments.dart:
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
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
new file mode 100644
index 0000000..61d174a
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = const <self::E>[self::E::one, self::E::two, self::E::three];
+  static const field self::E one = const self::E::•(0, "one");
+  static const field self::E two = const self::E::•(1, "two");
+  static const field self::E three = const self::E::•(2, "three");
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///entries_with_type_arguments.dart:5:6 -> ListConstant(const <E*>[const E{_Enum.index: 0, _Enum._name: "one"}, const E{_Enum.index: 1, _Enum._name: "two"}, const E{_Enum.index: 2, _Enum._name: "three"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:7:3 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "two"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:8:3 -> InstanceConstant(const E{_Enum.index: 2, _Enum._name: "three"})
+Extra constant evaluation: evaluated: 9, effectively constant: 4
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
new file mode 100644
index 0000000..a7d67d3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C10;
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = #C9;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "three"
+  #C9 = self::E {index:#C7, _name:#C8}
+  #C10 = <self::E*>[#C3, #C6, #C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///entries_with_type_arguments.dart:
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/folder.options b/pkg/front_end/testcases/enhanced_enums/folder.options
new file mode 100644
index 0000000..ecd97db
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/folder.options
@@ -0,0 +1 @@
+--enable-experiment=enhanced-enums
\ No newline at end of file
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart
new file mode 100644
index 0000000..b1dcf70
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart
@@ -0,0 +1,11 @@
+// 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.
+
+enum E {
+  a.b() // Qualified name with no type arguments.
+  ;
+  const E.b();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect
new file mode 100644
index 0000000..b209df1
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C4;
+  static const field self::E a = #C3;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
+- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect
new file mode 100644
index 0000000..b209df1
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C4;
+  static const field self::E a = #C3;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
+- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.textual_outline.expect
new file mode 100644
index 0000000..bc9f7ff
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+enum E { a.b() ; const E.b(); }
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect
new file mode 100644
index 0000000..5cc89c4
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C4;
+  static const field self::E a = #C3;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
+- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect
new file mode 100644
index 0000000..2732493
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = const <self::E>[self::E::a];
+  static const field self::E a = const self::E::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6 -> ListConstant(const <E*>[const E{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "a"})
+Extra constant evaluation: evaluated: 7, effectively constant: 2
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect
new file mode 100644
index 0000000..5cc89c4
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C4;
+  static const field self::E a = #C3;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
+- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 13f7172..956276e 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -28,6 +28,8 @@
 constructor_tearoffs/new_as_selector: FormatterCrash
 dart2js/late_fields: FormatterCrash
 dart2js/late_statics: FormatterCrash
+enhanced_enums/entries_with_type_arguments: FormatterCrash
+enhanced_enums/qualified_names_with_no_type_arguments: FormatterCrash
 extension_types/basic_show: FormatterCrash
 extension_types/call_not_get: FormatterCrash
 extension_types/keyword_in_show_hide_element: FormatterCrash
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index 1b03265..30f1303 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -56,7 +56,7 @@
     if (!is_android) {
       libs += [ "pthread" ]
     }
-    if (!is_mac) {
+    if (!is_mac && !is_ios) {
       libs += [ "atomic" ]
     }
   }
diff --git a/tools/VERSION b/tools/VERSION
index 0416c57..b80779c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 16
 PATCH 0
-PRERELEASE 76
+PRERELEASE 77
 PRERELEASE_PATCH 0
\ No newline at end of file