[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);
+}