[dart2js] Prep ssa/builder.dart for null safety migration.

Change-Id: I7ff792c38bd2257bcff55186e9f6f0cabf5f9021
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/277160
Reviewed-by: Stephen Adams <sra@google.com>
Commit-Queue: Nate Biggs <natebiggs@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/pkg/compiler/lib/src/js_model/element_map.dart b/pkg/compiler/lib/src/js_model/element_map.dart
index 8b79e54..7ddfa0b 100644
--- a/pkg/compiler/lib/src/js_model/element_map.dart
+++ b/pkg/compiler/lib/src/js_model/element_map.dart
@@ -168,18 +168,18 @@
   /// Returns the inferred receiver type of the dynamic [invocation].
   // TODO(johnniwinther): Improve the type of the [invocation] once the new
   // method invocation encoding is fully utilized.
-  AbstractValue receiverTypeOfInvocation(
+  AbstractValue? receiverTypeOfInvocation(
       ir.Expression invocation, AbstractValueDomain abstractValueDomain);
 
   /// Returns the inferred receiver type of the dynamic [read].
   // TODO(johnniwinther): Improve the type of the [invocation] once the new
   // method invocation encoding is fully utilized.
-  AbstractValue receiverTypeOfGet(ir.Expression read);
+  AbstractValue? receiverTypeOfGet(ir.Expression read);
 
   /// Returns the inferred receiver type of the dynamic [write].
   // TODO(johnniwinther): Improve the type of the [invocation] once the new
   // method invocation encoding is fully utilized.
-  AbstractValue receiverTypeOfSet(
+  AbstractValue? receiverTypeOfSet(
       ir.Expression write, AbstractValueDomain abstractValueDomain);
 
   /// Returns the inferred type of [listLiteral].
@@ -187,13 +187,13 @@
       ir.ListLiteral listLiteral, AbstractValueDomain abstractValueDomain);
 
   /// Returns the inferred type of iterator in [forInStatement].
-  AbstractValue typeOfIterator(ir.ForInStatement forInStatement);
+  AbstractValue? typeOfIterator(ir.ForInStatement forInStatement);
 
   /// Returns the inferred type of `current` in [forInStatement].
-  AbstractValue typeOfIteratorCurrent(ir.ForInStatement forInStatement);
+  AbstractValue? typeOfIteratorCurrent(ir.ForInStatement forInStatement);
 
   /// Returns the inferred type of `moveNext` in [forInStatement].
-  AbstractValue typeOfIteratorMoveNext(ir.ForInStatement forInStatement);
+  AbstractValue? typeOfIteratorMoveNext(ir.ForInStatement forInStatement);
 
   /// Returns `true` if [forInStatement] is inferred to be a JavaScript
   /// indexable iterator.
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 9186746..8ebe6c8 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -6,8 +6,6 @@
 
 library dart2js.js_model.strategy;
 
-import 'package:kernel/ast.dart' as ir;
-
 import '../common.dart';
 import '../common/codegen.dart';
 import '../common/elements.dart' show CommonElements, ElementEnvironment;
@@ -22,7 +20,6 @@
 import '../io/kernel_source_information.dart'
     show KernelSourceInformationStrategy;
 import '../io/source_information.dart';
-import '../inferrer/abstract_value_domain.dart';
 import '../inferrer/type_graph_inferrer.dart';
 import '../inferrer/types.dart';
 import '../inferrer_experimental/types.dart' as experimentalInferrer;
@@ -56,7 +53,6 @@
 import '../js/js.dart' as js;
 import '../kernel/kernel_strategy.dart';
 import '../kernel/kernel_world.dart';
-import '../native/behavior.dart';
 import '../native/enqueue.dart';
 import '../options.dart';
 import '../serialization/serialization.dart';
@@ -64,10 +60,8 @@
 import '../ssa/metrics.dart';
 import '../ssa/nodes.dart';
 import '../ssa/ssa.dart';
-import '../ssa/types.dart';
 import '../tracer.dart';
 import '../universe/codegen_world_builder.dart';
-import '../universe/selector.dart';
 import '../universe/world_impact.dart';
 import 'closure.dart';
 import 'element_map.dart';
@@ -556,103 +550,3 @@
     });
   }
 }
-
-class KernelToTypeInferenceMapImpl implements KernelToTypeInferenceMap {
-  final GlobalTypeInferenceResults _globalInferenceResults;
-  GlobalTypeInferenceMemberResult _targetResults;
-
-  KernelToTypeInferenceMapImpl(
-      MemberEntity target, this._globalInferenceResults) {
-    _targetResults = _resultOf(target);
-  }
-
-  GlobalTypeInferenceMemberResult _resultOf(MemberEntity e) =>
-      _globalInferenceResults
-          .resultOfMember(e is ConstructorBodyEntity ? e.constructor : e);
-
-  @override
-  AbstractValue getReturnTypeOf(FunctionEntity function) {
-    return AbstractValueFactory.inferredReturnTypeForElement(
-        function, _globalInferenceResults);
-  }
-
-  @override
-  AbstractValue receiverTypeOfInvocation(
-      ir.Expression node, AbstractValueDomain abstractValueDomain) {
-    return _targetResults.typeOfReceiver(node);
-  }
-
-  @override
-  AbstractValue receiverTypeOfGet(ir.Expression node) {
-    return _targetResults.typeOfReceiver(node);
-  }
-
-  @override
-  AbstractValue receiverTypeOfSet(
-      ir.Expression node, AbstractValueDomain abstractValueDomain) {
-    return _targetResults.typeOfReceiver(node);
-  }
-
-  @override
-  AbstractValue typeOfListLiteral(
-      ir.ListLiteral listLiteral, AbstractValueDomain abstractValueDomain) {
-    return _globalInferenceResults.typeOfListLiteral(listLiteral) ??
-        abstractValueDomain.dynamicType;
-  }
-
-  @override
-  AbstractValue typeOfIterator(ir.ForInStatement node) {
-    return _targetResults.typeOfIterator(node);
-  }
-
-  @override
-  AbstractValue typeOfIteratorCurrent(ir.ForInStatement node) {
-    return _targetResults.typeOfIteratorCurrent(node);
-  }
-
-  @override
-  AbstractValue typeOfIteratorMoveNext(ir.ForInStatement node) {
-    return _targetResults.typeOfIteratorMoveNext(node);
-  }
-
-  @override
-  bool isJsIndexableIterator(
-      ir.ForInStatement node, AbstractValueDomain abstractValueDomain) {
-    AbstractValue mask = typeOfIterator(node);
-    // TODO(sra): Investigate why mask is sometimes null.
-    if (mask == null) return false;
-    return abstractValueDomain.isJsIndexableAndIterable(mask).isDefinitelyTrue;
-  }
-
-  @override
-  AbstractValue inferredIndexType(ir.ForInStatement node) {
-    return AbstractValueFactory.inferredResultTypeForSelector(
-        Selector.index(), typeOfIterator(node), _globalInferenceResults);
-  }
-
-  @override
-  AbstractValue getInferredTypeOf(MemberEntity member) {
-    return AbstractValueFactory.inferredTypeForMember(
-        member, _globalInferenceResults);
-  }
-
-  @override
-  AbstractValue getInferredTypeOfParameter(Local parameter) {
-    return AbstractValueFactory.inferredTypeForParameter(
-        parameter, _globalInferenceResults);
-  }
-
-  @override
-  AbstractValue resultTypeOfSelector(Selector selector, AbstractValue mask) {
-    return AbstractValueFactory.inferredResultTypeForSelector(
-        selector, mask, _globalInferenceResults);
-  }
-
-  @override
-  AbstractValue typeFromNativeBehavior(
-      // TODO(48820): remove covariant once interface and implementation match.
-      NativeBehavior nativeBehavior,
-      covariant JClosedWorld closedWorld) {
-    return AbstractValueFactory.fromNativeBehavior(nativeBehavior, closedWorld);
-  }
-}
diff --git a/pkg/compiler/lib/src/js_model/js_strategy_migrated.dart b/pkg/compiler/lib/src/js_model/js_strategy_migrated.dart
new file mode 100644
index 0000000..82f38506
--- /dev/null
+++ b/pkg/compiler/lib/src/js_model/js_strategy_migrated.dart
@@ -0,0 +1,114 @@
+// 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 'package:kernel/ast.dart' as ir;
+
+import '../elements/entities.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../inferrer/types.dart';
+import '../native/behavior.dart';
+import '../ssa/types.dart';
+import '../universe/selector.dart';
+import 'element_map.dart';
+import 'js_world.dart';
+
+class KernelToTypeInferenceMapImpl implements KernelToTypeInferenceMap {
+  final GlobalTypeInferenceResults _globalInferenceResults;
+  late final GlobalTypeInferenceMemberResult _targetResults;
+
+  KernelToTypeInferenceMapImpl(
+      MemberEntity target, this._globalInferenceResults) {
+    _targetResults = _resultOf(target);
+  }
+
+  GlobalTypeInferenceMemberResult _resultOf(MemberEntity e) =>
+      _globalInferenceResults
+          .resultOfMember(e is ConstructorBodyEntity ? e.constructor : e);
+
+  @override
+  AbstractValue getReturnTypeOf(FunctionEntity function) {
+    return AbstractValueFactory.inferredReturnTypeForElement(
+        function, _globalInferenceResults);
+  }
+
+  @override
+  AbstractValue? receiverTypeOfInvocation(
+      ir.Expression node, AbstractValueDomain abstractValueDomain) {
+    return _targetResults.typeOfReceiver(node);
+  }
+
+  @override
+  AbstractValue? receiverTypeOfGet(ir.Expression node) {
+    return _targetResults.typeOfReceiver(node);
+  }
+
+  @override
+  AbstractValue? receiverTypeOfSet(
+      ir.Expression node, AbstractValueDomain abstractValueDomain) {
+    return _targetResults.typeOfReceiver(node);
+  }
+
+  @override
+  AbstractValue typeOfListLiteral(
+      ir.ListLiteral listLiteral, AbstractValueDomain abstractValueDomain) {
+    return _globalInferenceResults.typeOfListLiteral(listLiteral) ??
+        abstractValueDomain.dynamicType;
+  }
+
+  @override
+  AbstractValue? typeOfIterator(ir.ForInStatement node) {
+    return _targetResults.typeOfIterator(node);
+  }
+
+  @override
+  AbstractValue? typeOfIteratorCurrent(ir.ForInStatement node) {
+    return _targetResults.typeOfIteratorCurrent(node);
+  }
+
+  @override
+  AbstractValue? typeOfIteratorMoveNext(ir.ForInStatement node) {
+    return _targetResults.typeOfIteratorMoveNext(node);
+  }
+
+  @override
+  bool isJsIndexableIterator(
+      ir.ForInStatement node, AbstractValueDomain abstractValueDomain) {
+    final mask = typeOfIterator(node);
+    // TODO(sra): Investigate why mask is sometimes null.
+    if (mask == null) return false;
+    return abstractValueDomain.isJsIndexableAndIterable(mask).isDefinitelyTrue;
+  }
+
+  @override
+  AbstractValue inferredIndexType(ir.ForInStatement node) {
+    return AbstractValueFactory.inferredResultTypeForSelector(
+        Selector.index(), typeOfIterator(node)!, _globalInferenceResults);
+  }
+
+  @override
+  AbstractValue getInferredTypeOf(MemberEntity member) {
+    return AbstractValueFactory.inferredTypeForMember(
+        member, _globalInferenceResults);
+  }
+
+  @override
+  AbstractValue getInferredTypeOfParameter(Local parameter) {
+    return AbstractValueFactory.inferredTypeForParameter(
+        parameter, _globalInferenceResults);
+  }
+
+  @override
+  AbstractValue resultTypeOfSelector(Selector selector, AbstractValue mask) {
+    return AbstractValueFactory.inferredResultTypeForSelector(
+        selector, mask, _globalInferenceResults);
+  }
+
+  @override
+  AbstractValue typeFromNativeBehavior(
+      // TODO(48820): remove covariant once interface and implementation match.
+      NativeBehavior nativeBehavior,
+      covariant JClosedWorld closedWorld) {
+    return AbstractValueFactory.fromNativeBehavior(nativeBehavior, closedWorld);
+  }
+}
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index d65a3ab..a878ba5c 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -42,7 +42,7 @@
 import '../js_model/class_type_variable_access.dart';
 import '../js_model/element_map.dart';
 import '../js_model/elements.dart' show JGeneratorBody;
-import '../js_model/js_strategy.dart';
+import '../js_model/js_strategy_migrated.dart';
 import '../js_model/js_world.dart' show JClosedWorld;
 import '../js_model/locals.dart' show GlobalLocalsMap, JumpVisitor;
 import '../js_model/type_recipe.dart';
@@ -265,7 +265,7 @@
   /// The current block to add instructions to. Might be null, if we are
   /// visiting dead code, but see [_isReachable].
   @override
-  HBasicBlock get current => _current /*!*/;
+  HBasicBlock get current => _current;
 
   void set current(c) {
     _isReachable = c != null;