[dart2js] Migrate ssa/ssa.dart to null safety.

Change-Id: Iab3caf10b2cb26ab22c4f97a64f540b70ca15bf9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/277261
Reviewed-by: Stephen Adams <sra@google.com>
diff --git a/pkg/compiler/lib/src/common/codegen.dart b/pkg/compiler/lib/src/common/codegen.dart
index 82eddc3..f048cbe 100644
--- a/pkg/compiler/lib/src/common/codegen.dart
+++ b/pkg/compiler/lib/src/common/codegen.dart
@@ -396,7 +396,7 @@
     _expressions.add(expression);
   }
 
-  CodegenResult close(js.Fun code) {
+  CodegenResult close(js.Fun? code) {
     return CodegenResult(code, _worldImpact, _names.isEmpty ? const [] : _names,
         _expressions.isEmpty ? const [] : _expressions);
   }
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 4905b98..a90ea9f 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -384,6 +384,7 @@
   }
 
   /// Creates the [SsaBuilder] used for the element model.
+  @override
   SsaBuilder createSsaBuilder(
       CompilerTask task, SourceInformationStrategy sourceInformationStrategy) {
     return KernelSsaBuilder(
diff --git a/pkg/compiler/lib/src/js_model/js_strategy_interfaces.dart b/pkg/compiler/lib/src/js_model/js_strategy_interfaces.dart
index 0e0c6b3..db28658 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy_interfaces.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy_interfaces.dart
@@ -14,6 +14,7 @@
 import '../js_model/js_world.dart' show JClosedWorld;
 import '../native/enqueue.dart';
 import '../serialization/serialization.dart';
+import '../ssa/ssa.dart';
 import 'locals.dart';
 
 abstract class JsBackendStrategy {
@@ -31,4 +32,6 @@
   Map<MemberEntity, js.Expression> get generatedCode;
   void prepareCodegenReader(DataSourceReader source);
   EntityWriter forEachCodegenMember(void Function(MemberEntity member) f);
+  SsaBuilder createSsaBuilder(SsaBuilderTask ssaBuilderTask,
+      SourceInformationStrategy sourceInformationFactory);
 }
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index 2f7ecad..2cfa4d4 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.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 ssa;
 
 import 'package:compiler/src/ssa/metrics.dart';
@@ -28,7 +26,7 @@
 import '../js_emitter/startup_emitter/emitter.dart' show ModularEmitterImpl;
 import '../js_model/elements.dart';
 import '../js_model/type_recipe.dart' show TypeExpressionRecipe;
-import '../js_model/js_strategy.dart';
+import '../js_model/js_strategy_interfaces.dart';
 import '../js_model/js_world.dart' show JClosedWorld;
 import '../options.dart';
 import '../universe/call_structure.dart' show CallStructure;
@@ -48,8 +46,8 @@
   final SsaBuilderTask _builder;
   final SsaOptimizerTask optimizer;
   final SourceInformationStrategy sourceInformationStrategy;
-  /*late*/ GlobalTypeInferenceResults _globalInferenceResults;
-  CodegenInputs _codegen;
+  late final GlobalTypeInferenceResults _globalInferenceResults;
+  late final CodegenInputs _codegen;
 
   SsaFunctionCompiler(
       this._options,
@@ -88,11 +86,12 @@
       return registry.close(null);
     }
 
-    HGraph graph = _builder.build(member, closedWorld, _globalInferenceResults,
+    final graph = _builder.build(member, closedWorld, _globalInferenceResults,
         _codegen, registry, namer, emitter);
     if (graph == null) {
       return registry.close(null);
     }
+
     optimizer.optimize(member, graph, _codegen, closedWorld,
         _globalInferenceResults, registry, _metrics);
     js.Expression result = generator.generateCode(
@@ -107,7 +106,7 @@
           registry,
           namer,
           emitter,
-          member,
+          member as FunctionEntity,
           result,
           graph.asyncElementType,
           sourceInformationBuilder.buildAsyncBody(),
@@ -120,7 +119,7 @@
           sourceInformationStrategy.buildSourceMappedMarker());
     }
 
-    return registry.close(result);
+    return registry.close(result as js.Fun);
   }
 
   js.Expression _rewriteAsync(
@@ -132,12 +131,12 @@
       ModularEmitter emitter,
       FunctionEntity element,
       js.Expression code,
-      DartType asyncTypeParameter,
-      SourceInformation bodySourceInformation,
-      SourceInformation exitSourceInformation) {
+      DartType? asyncTypeParameter,
+      SourceInformation? bodySourceInformation,
+      SourceInformation? exitSourceInformation) {
     if (element.asyncMarker == AsyncMarker.SYNC) return code;
 
-    AsyncRewriterBase rewriter = null;
+    late final AsyncRewriterBase rewriter;
     js.Name name = namer.methodPropertyName(
         element is JGeneratorBody ? element.function : element);
 
@@ -182,7 +181,8 @@
             name);
         break;
     }
-    return rewriter.rewrite(code, bodySourceInformation, exitSourceInformation);
+    return rewriter.rewrite(
+        code as js.Fun, bodySourceInformation, exitSourceInformation);
   }
 
   /// Returns an optional expression that evaluates [type].  Returns `null` if
@@ -190,8 +190,8 @@
   /// added as a function parameter to the rewritten code.
   // TODO(sra): We could also return an empty list if the generator takes no
   // type (e.g. due to rtiNeed optimization).
-  List<js.Expression> _fetchItemTypeNewRti(
-      CommonElements commonElements, CodegenRegistry registry, DartType type) {
+  List<js.Expression>? _fetchItemTypeNewRti(
+      CommonElements commonElements, CodegenRegistry registry, DartType? type) {
     if (type == null) return null;
     registry.registerStaticUse(
         StaticUse.staticInvoke(commonElements.findType, CallStructure.ONE_ARG));
@@ -207,12 +207,12 @@
       ModularEmitter emitter,
       FunctionEntity element,
       js.Expression code,
-      DartType elementType,
+      DartType? elementType,
       js.Name name) {
     FunctionEntity startFunction = commonElements.asyncHelperStartSync;
     FunctionEntity completerFactory = commonElements.asyncAwaitCompleterFactory;
 
-    List<js.Expression> itemTypeExpression =
+    final itemTypeExpression =
         _fetchItemTypeNewRti(commonElements, registry, elementType);
 
     AsyncRewriter rewriter = AsyncRewriter(_reporter, element,
@@ -246,9 +246,9 @@
       ModularEmitter emitter,
       FunctionEntity element,
       js.Expression code,
-      DartType asyncTypeParameter,
+      DartType? asyncTypeParameter,
       js.Name name) {
-    List<js.Expression> itemTypeExpression =
+    final itemTypeExpression =
         _fetchItemTypeNewRti(commonElements, registry, asyncTypeParameter);
 
     SyncStarRewriter rewriter = SyncStarRewriter(_reporter, element,
@@ -281,9 +281,9 @@
       ModularEmitter emitter,
       FunctionEntity element,
       js.Expression code,
-      DartType asyncTypeParameter,
+      DartType? asyncTypeParameter,
       js.Name name) {
-    List<js.Expression> itemTypeExpression =
+    final itemTypeExpression =
         _fetchItemTypeNewRti(commonElements, registry, asyncTypeParameter);
 
     AsyncStarRewriter rewriter = AsyncStarRewriter(_reporter, element,
@@ -319,7 +319,7 @@
 abstract class SsaBuilder {
   /// Creates the [HGraph] for [member] or returns `null` if no code is needed
   /// for [member].
-  HGraph build(
+  HGraph? build(
       MemberEntity member,
       JClosedWorld closedWorld,
       GlobalTypeInferenceResults globalInferenceResults,
@@ -332,16 +332,15 @@
 class SsaBuilderTask extends CompilerTask {
   final JsBackendStrategy _backendStrategy;
   final SourceInformationStrategy _sourceInformationFactory;
-  SsaBuilder _builder;
+  late SsaBuilder _builder;
 
   final SsaMetrics _metrics;
 
   @override
   Metrics get metrics => _metrics;
 
-  SsaBuilderTask(Measurer measurer, this._backendStrategy,
-      this._sourceInformationFactory, this._metrics)
-      : super(measurer);
+  SsaBuilderTask(super.measurer, this._backendStrategy,
+      this._sourceInformationFactory, this._metrics);
 
   @override
   String get name => 'SSA builder';
@@ -353,7 +352,7 @@
 
   /// Creates the [HGraph] for [member] or returns `null` if no code is needed
   /// for [member].
-  HGraph build(
+  HGraph? build(
       MemberEntity member,
       JClosedWorld closedWorld,
       GlobalTypeInferenceResults globalInferenceResults,