[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,