[dart2js] Migrate js_backend/enqueuer.dart
Change-Id: I8949e6a3ca083f33f55ceb2cf37bf09c5d69450d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/251124
Commit-Queue: Nate Biggs <natebiggs@google.com>
Reviewed-by: Mayank Patke <fishythefish@google.com>
diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index 9238540..7dfad22 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -2,8 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-// @dart = 2.10
-
library dart2js.js.enqueue;
import 'dart:collection' show Queue;
@@ -16,7 +14,7 @@
import '../elements/types.dart';
import '../enqueue.dart';
import '../js_backend/annotations.dart';
-import '../universe/codegen_world_builder.dart';
+import '../universe/codegen_world_builder_interfaces.dart';
import '../universe/member_usage.dart';
import '../universe/use.dart'
show
@@ -34,7 +32,7 @@
final String name;
final Set<ClassEntity> _recentClasses = Setlet();
bool _recentConstants = false;
- final CodegenWorldBuilderImpl worldBuilder;
+ final CodegenWorldBuilderImplForEnqueuer worldBuilder;
final WorkItemBuilder _workItemBuilder;
@override
@@ -52,7 +50,7 @@
// If not `null` this is called when the queue has been emptied. It allows for
// applying additional impacts before re-emptying the queue.
- void Function() onEmptyForTesting;
+ void Function()? onEmptyForTesting;
CodegenEnqueuer(this.task, this.worldBuilder, this._workItemBuilder,
this.listener, this._annotationsData)
@@ -77,7 +75,7 @@
void _addToWorkList(MemberEntity entity) {
if (_processedEntities.contains(entity)) return;
- WorkItem workItem = _workItemBuilder.createWorkItem(entity);
+ final workItem = _workItemBuilder.createWorkItem(entity);
if (workItem == null) return;
if (queueIsClosed) {
@@ -134,7 +132,7 @@
_addToWorkList(member);
}
if (useSet.contains(MemberUse.CLOSURIZE_INSTANCE)) {
- _registerClosurizedMember(member);
+ _registerClosurizedMember(member as FunctionEntity);
}
if (useSet.contains(MemberUse.CLOSURIZE_STATIC)) {
applyImpact(listener.registerGetOfStaticFunction());
@@ -149,17 +147,17 @@
}
@override
- void processStaticUse(MemberEntity member, StaticUse staticUse) {
+ void processStaticUse(MemberEntity? member, StaticUse staticUse) {
task.measureSubtask('codegen.staticUse', () {
worldBuilder.registerStaticUse(staticUse, _applyMemberUse);
switch (staticUse.kind) {
case StaticUseKind.CONSTRUCTOR_INVOKE:
case StaticUseKind.CONST_CONSTRUCTOR_INVOKE:
- processTypeUse(member, TypeUse.instantiation(staticUse.type));
+ processTypeUse(member, TypeUse.instantiation(staticUse.type!));
break;
case StaticUseKind.INLINING:
// TODO(johnniwinther): Should this be tracked with _MemberUsage ?
- listener.registerUsedElement(staticUse.element);
+ listener.registerUsedElement(staticUse.element as MemberEntity);
break;
default:
break;
@@ -168,14 +166,14 @@
}
@override
- void processTypeUse(MemberEntity member, TypeUse typeUse) {
+ void processTypeUse(MemberEntity? member, TypeUse typeUse) {
DartType type = typeUse.type;
switch (typeUse.kind) {
case TypeUseKind.INSTANTIATION:
- _registerInstantiatedType(type);
+ _registerInstantiatedType(type as InterfaceType);
break;
case TypeUseKind.NATIVE_INSTANTIATION:
- _registerInstantiatedType(type, nativeUsage: true);
+ _registerInstantiatedType(type as InterfaceType, nativeUsage: true);
break;
case TypeUseKind.IS_CHECK:
case TypeUseKind.CATCH_TYPE:
@@ -209,14 +207,13 @@
worldBuilder.registerTypeArgument(type);
break;
case TypeUseKind.CONSTRUCTOR_REFERENCE:
- worldBuilder.registerConstructorReference(type);
+ worldBuilder.registerConstructorReference(type as InterfaceType);
break;
case TypeUseKind.CONST_INSTANTIATION:
failedAt(CURRENT_ELEMENT_SPANNABLE, "Unexpected type use: $typeUse.");
- break;
case TypeUseKind.NAMED_TYPE_VARIABLE_NEW_RTI:
- assert(type is TypeVariableType);
- _registerNamedTypeVariableNewRti(type);
+ _registerNamedTypeVariableNewRti(type as TypeVariableType);
+ break;
}
}
@@ -267,7 +264,7 @@
void forEach(void f(WorkItem work)) {
_forEach(f);
if (onEmptyForTesting != null) {
- onEmptyForTesting();
+ onEmptyForTesting!();
_forEach(f);
}
}
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index 73a25f6..9ddc907 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -21,6 +21,7 @@
import '../util/util.dart';
import '../world.dart';
import 'call_structure.dart';
+import 'codegen_world_builder_interfaces.dart' as interfaces;
import 'member_usage.dart';
import 'selector.dart' show Selector;
import 'use.dart'
@@ -30,7 +31,8 @@
/// World builder specific to codegen.
///
/// This adds additional access to liveness of selectors and elements.
-abstract class CodegenWorldBuilder {
+abstract class CodegenWorldBuilder
+ implements interfaces.CodegenWorldBuilderImplForEnqueuer {
/// Register [constant] as needed for emission.
void addCompileTimeConstantForEmission(ConstantValue constant);
@@ -172,6 +174,7 @@
.where((cls) => _processedClasses[cls].isInstantiated);
// TODO(johnniwinther): Improve semantic precision.
+ @override
Iterable<ClassEntity> get directlyInstantiatedClasses {
return _directlyInstantiatedClasses;
}
@@ -180,6 +183,7 @@
// TODO(johnniwinther): Fully enforce the separation between exact, through
// subclass and through subtype instantiated types/classes.
// TODO(johnniwinther): Support unknown type arguments for generic types.
+ @override
void registerTypeInstantiation(
InterfaceType type, ClassUsedCallback classUsed) {
ClassEntity cls = type.element;
@@ -251,6 +255,7 @@
_invokedSetters[member.name], member, _closedWorld);
}
+ @override
void registerDynamicUse(
DynamicUse dynamicUse, MemberUsedCallback memberUsed) {
Selector selector = dynamicUse.selector;
@@ -319,14 +324,17 @@
return constraints.addReceiverConstraint(constraint);
}
+ @override
void registerIsCheck(covariant DartType type) {
_isChecks.add(type);
}
+ @override
void registerNamedTypeVariableNewRti(TypeVariableType type) {
_namedTypeVariablesNewRti.add(type);
}
+ @override
void registerStaticUse(StaticUse staticUse, MemberUsedCallback memberUsed) {
MemberEntity element = staticUse.element;
EnumSet<MemberUse> useSet = EnumSet();
@@ -409,6 +417,7 @@
}
}
+ @override
void processClassMembers(ClassEntity cls, MemberUsedCallback memberUsed,
{bool checkEnqueuerConsistency = false}) {
_elementEnvironment.forEachClassMember(cls,
@@ -559,19 +568,23 @@
/// Register the constant [use] with this world builder. Returns `true` if
/// the constant use was new to the world.
+ @override
bool registerConstantUse(ConstantUse use) {
addCompileTimeConstantForEmission(use.value);
return _constantValues.add(use.value);
}
+ @override
void registerConstTypeLiteral(DartType type) {
_constTypeLiterals.add(type);
}
+ @override
void registerTypeArgument(DartType type) {
_liveTypeArguments.add(type);
}
+ @override
void registerConstructorReference(InterfaceType type) {
_constructorReferences.add(type.element);
}
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder_interfaces.dart b/pkg/compiler/lib/src/universe/codegen_world_builder_interfaces.dart
new file mode 100644
index 0000000..65499cf
--- /dev/null
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder_interfaces.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../elements/entities.dart';
+import '../elements/types.dart';
+import '../universe/use.dart';
+import 'member_usage.dart';
+
+abstract class CodegenWorldBuilderImplForEnqueuer {
+ Iterable<ClassEntity> get directlyInstantiatedClasses;
+
+ void registerTypeInstantiation(
+ InterfaceType type, ClassUsedCallback classUsed);
+
+ void processClassMembers(ClassEntity cls, MemberUsedCallback memberUsed,
+ {bool checkEnqueuerConsistency = false});
+
+ void registerDynamicUse(DynamicUse dynamicUse, MemberUsedCallback memberUsed);
+
+ void registerStaticUse(StaticUse staticUse, MemberUsedCallback memberUsed);
+
+ void registerTypeVariableTypeLiteral(TypeVariableType typeVariable);
+
+ void registerConstTypeLiteral(DartType type);
+
+ void registerTypeArgument(DartType type);
+
+ void registerConstructorReference(InterfaceType type);
+
+ bool registerConstantUse(ConstantUse use);
+
+ void registerIsCheck(covariant DartType type);
+
+ void registerNamedTypeVariableNewRti(TypeVariableType type);
+}