[cfe] Make _Enum type pre-created similarly to built-in types

Part of https://github.com/dart-lang/sdk/issues/47453

Change-Id: I046fc14b76513b6b1b3f3606b4c1bd299abca50a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/229963
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_in/core.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_in/core.dart
index 79f1f75..ceda8df 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_in/core.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_in/core.dart
@@ -27,6 +27,9 @@
 /*class: Enum:Enum,Object*/
 abstract class Enum {}
 
+/*class: _Enum:Enum,Object,_Enum*/
+abstract class _Enum implements Enum {}
+
 /*class: Null:Null,Object*/
 class Null {
   factory Null._uninstantiable() {
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/core.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/core.dart
index 2682390..f3d77df 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/core.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/core.dart
@@ -29,6 +29,9 @@
 /*class: Enum:Enum,Object*/
 abstract class Enum {}
 
+/*class: _Enum:Enum,Object,_Enum*/
+abstract class _Enum implements Enum {}
+
 /*class: Null:Null,Object*/
 class Null {
   factory Null._uninstantiable() {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 53a4e7d..c7c5dfc 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -145,6 +145,14 @@
       /* charOffset = */ null,
       instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
 
+  final NamedTypeBuilder underscoreEnumType = new NamedTypeBuilder(
+      "_Enum",
+      const NullabilityBuilder.omitted(),
+      /* arguments = */ null,
+      /* fileUri = */ null,
+      /* charOffset = */ null,
+      instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
+
   final bool excludeSource = !CompilerContext.current.options.embedSourceText;
 
   final Map<String, String>? environmentDefines =
@@ -988,6 +996,8 @@
         .lookupLocalMember("Never", required: true) as TypeDeclarationBuilder);
     enumType.bind(loader.coreLibrary.lookupLocalMember("Enum", required: true)
         as TypeDeclarationBuilder);
+    underscoreEnumType.bind(loader.coreLibrary
+        .lookupLocalMember("_Enum", required: true) as TypeDeclarationBuilder);
   }
 
   void computeCoreTypes() {
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 8510a02..47620d5 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -3230,16 +3230,10 @@
     if (mixins is ParserRecovery) {
       push(new ParserRecovery(withKeyword.charOffset));
     } else {
-      NamedTypeBuilder enumType = new NamedTypeBuilder(
-          "_Enum",
-          const NullabilityBuilder.omitted(),
-          /* arguments = */ null,
-          /* fileUri = */ null,
-          /* charOffset = */ null,
-          instanceTypeVariableAccess:
-              InstanceTypeVariableAccessState.Unexpected);
       push(libraryBuilder.addMixinApplication(
-          enumType, mixins as List<TypeBuilder>, withKeyword.charOffset));
+          libraryBuilder.loader.target.underscoreEnumType,
+          mixins as List<TypeBuilder>,
+          withKeyword.charOffset));
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 2e98155..50fad75 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -105,8 +105,6 @@
 
   SourceClassBuilder? _patchBuilder;
 
-  final bool isEnumMixin;
-
   SourceClassBuilder(
       List<MetadataBuilder>? metadata,
       int modifiers,
@@ -126,8 +124,7 @@
       {Class? cls,
       this.mixedInTypeBuilder,
       this.isMixinDeclaration = false,
-      this.isMacro: false,
-      this.isEnumMixin: false})
+      this.isMacro: false})
       : actualCls = initializeClass(cls, typeVariables, name, parent,
             startCharOffset, nameOffset, charEndOffset, referencesFromIndexed),
         super(metadata, modifiers, name, typeVariables, supertype, interfaces,
@@ -200,11 +197,6 @@
 
     scope.forEach(buildBuilders);
     constructors.forEach(buildBuilders);
-    if (isEnumMixin) {
-      assert(supertypeBuilder?.name == "_Enum");
-      supertypeBuilder?.resolveIn(coreLibrary.scope,
-          supertypeBuilder?.charOffset ?? charOffset, fileUri, library);
-    }
     if (supertypeBuilder != null) {
       supertypeBuilder = _checkSupertype(supertypeBuilder!);
     }
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 bbcbbca..a0bf299 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
@@ -2103,8 +2103,7 @@
       List<TypeVariableBuilder>? typeVariables,
       int modifiers: 0,
       List<TypeBuilder>? interfaces,
-      required bool isMacro,
-      bool isEnumMixin: false}) {
+      required bool isMacro}) {
     if (name == null) {
       // The following parameters should only be used when building a named
       // mixin application.
@@ -2323,8 +2322,7 @@
             charEndOffset,
             referencesFromIndexedClass,
             mixedInTypeBuilder: isMixinDeclaration ? null : mixin,
-            isMacro: isNamedMixinApplication && isMacro,
-            isEnumMixin: isEnumMixin && i == 0);
+            isMacro: isNamedMixinApplication && isMacro);
         // TODO(ahe, kmillikin): Should always be true?
         // pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart can't
         // handle that :(
@@ -2818,7 +2816,7 @@
         typeVariables,
         applyMixins(supertypeBuilder, startCharOffset, charOffset,
             charEndOffset, name, /* isMixinDeclaration = */ false,
-            typeVariables: typeVariables, isMacro: false, isEnumMixin: true),
+            typeVariables: typeVariables, isMacro: false),
         interfaceBuilders,
         enumConstantInfos,
         this,