[dart2js] Migrate startup_emitter/emitter.dart and js_emitter/code_emitter_task.dart to null safety.

Change-Id: Iabad108c88a4e900fcb0c05dc23bb7318b04472b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/270341
Reviewed-by: Mayank Patke <fishythefish@google.com>
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index 2e53482..a399d2a 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -40,11 +40,11 @@
   /// Constructs a literal expression that evaluates to the constant. Uses a
   /// canonical name unless the constant can be emitted multiple times (as for
   /// numbers and strings).
-  jsAst.Expression generate(ConstantValue constant) {
+  jsAst.Expression? generate(ConstantValue constant) {
     return _visit(constant);
   }
 
-  jsAst.Expression _visit(ConstantValue constant) {
+  jsAst.Expression? _visit(ConstantValue constant) {
     return constant.accept(this, null);
   }
 
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index ec7eacd..6f103af 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -2,11 +2,11 @@
 // 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_emitter.code_emitter_task;
 
-import '../common.dart';
+import 'package:compiler/src/dump_info.dart';
+import 'package:compiler/src/native/enqueue.dart';
+
 import '../common/metrics.dart' show Metric, Metrics, CountMetric;
 import '../common/tasks.dart' show CompilerTask;
 import '../compiler_interfaces.dart' show CompilerEmitterFacade;
@@ -37,11 +37,13 @@
 /// The code for the containing (used) methods must exist in the `universe`.
 class CodeEmitterTask extends CompilerTask
     implements interfaces.CodeEmitterTask {
-  RuntimeTypesChecks _rtiChecks;
-  NativeEmitter _nativeEmitter;
+  late final RuntimeTypesChecks _rtiChecks;
   @override
-  MetadataCollector metadataCollector;
-  Emitter _emitter;
+  late final NativeEmitter nativeEmitter;
+  @override
+  late final MetadataCollector metadataCollector;
+  @override
+  late final Emitter emitter;
   final CompilerEmitterFacade _compiler;
   final bool _generateSourceMap;
 
@@ -53,11 +55,11 @@
   /// Contains a list of all classes that are emitted.
   /// Currently used for testing and dump-info.
   @override
-  Set<ClassEntity> neededClasses;
+  late final Set<ClassEntity> neededClasses;
 
   /// See [neededClasses] but for class types.
   @override
-  Set<ClassEntity> neededClassTypes;
+  late final Set<ClassEntity> neededClassTypes;
 
   @override
   final _EmitterMetrics metrics = _EmitterMetrics();
@@ -66,22 +68,6 @@
       : super(_compiler.measurer);
 
   @override
-  NativeEmitter get nativeEmitter {
-    assert(
-        _nativeEmitter != null,
-        failedAt(
-            NO_LOCATION_SPANNABLE, "NativeEmitter has not been created yet."));
-    return _nativeEmitter;
-  }
-
-  @override
-  Emitter /*!*/ get emitter {
-    assert(_emitter != null,
-        failedAt(NO_LOCATION_SPANNABLE, "Emitter has not been created yet."));
-    return _emitter;
-  }
-
-  @override
   String get name => 'Code emitter';
 
   void _finalizeRti(CodegenInputs codegen, CodegenWorld codegenWorld) {
@@ -95,22 +81,22 @@
   void createEmitter(
       Namer namer, CodegenInputs codegen, JClosedWorld closedWorld) {
     measure(() {
-      _nativeEmitter = NativeEmitter(
-          this, closedWorld, _backendStrategy.nativeCodegenEnqueuer);
-      _emitter = startup_js_emitter.EmitterImpl(
+      nativeEmitter = NativeEmitter(this, closedWorld,
+          _backendStrategy.nativeCodegenEnqueuer as NativeCodegenEnqueuer);
+      emitter = startup_js_emitter.EmitterImpl(
           _compiler.options,
           _compiler.reporter,
           _compiler.outputProvider,
-          _compiler.dumpInfoTask,
+          _compiler.dumpInfoTask as DumpInfoTask,
           namer,
           closedWorld,
           codegen.rtiRecipeEncoder,
-          _nativeEmitter,
+          nativeEmitter,
           _backendStrategy.sourceInformationStrategy,
           this,
           _generateSourceMap);
       metadataCollector = MetadataCollector(
-          _compiler.reporter, _emitter, codegen.rtiRecipeEncoder);
+          _compiler.reporter, emitter, codegen.rtiRecipeEncoder);
     });
   }
 
@@ -130,7 +116,7 @@
           closedWorld.commonElements,
           closedWorld.outputUnitData,
           codegenWorld,
-          _backendStrategy.nativeCodegenEnqueuer,
+          _backendStrategy.nativeCodegenEnqueuer as NativeCodegenEnqueuer,
           closedWorld.backendUsage,
           closedWorld.nativeData,
           closedWorld.rtiNeed,
@@ -148,7 +134,7 @@
           _backendStrategy.sourceInformationStrategy,
           closedWorld.sorter,
           _rtiChecks.requiredClasses,
-          closedWorld.elementEnvironment.mainFunction);
+          closedWorld.elementEnvironment.mainFunction!);
       int size = emitter.emitProgram(programBuilder, codegenWorld);
       neededClasses = programBuilder.collector.neededClasses;
       neededClassTypes = programBuilder.collector.neededClassTypes;
@@ -215,9 +201,9 @@
 ///
 /// These methods are _not_ available during modular code generation.
 abstract class Emitter implements ModularEmitter, interfaces.Emitter {
-  Program get programForTesting;
+  Program? get programForTesting;
 
-  List<PreFragment> get preDeferredFragmentsForTesting;
+  List<PreFragment>? get preDeferredFragmentsForTesting;
 
   /// The set of omitted [OutputUnits].
   Set<OutputUnit> get omittedOutputUnits;
diff --git a/pkg/compiler/lib/src/js_emitter/js_emitter.dart b/pkg/compiler/lib/src/js_emitter/js_emitter.dart
index 2371dee..b5d4f85 100644
--- a/pkg/compiler/lib/src/js_emitter/js_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/js_emitter.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_emitter;
 
 export 'class_stub_generator.dart';
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
index 60a9091..b97cef2 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.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_emitter.startup_emitter;
 
 import '../../../compiler_api.dart' as api;
@@ -71,7 +69,7 @@
   @override
   js.PropertyAccess prototypeAccess(ClassEntity element) {
     js.Expression constructor = constructorAccess(element);
-    return js.js('#.prototype', constructor);
+    return js.js('#.prototype', constructor) as js.PropertyAccess;
   }
 
   @override
@@ -103,28 +101,27 @@
   final CodegenRegistry _registry;
   final ModularConstantEmitter _constantEmitter;
 
-  ModularEmitterImpl(
-      ModularNamer namer, this._registry, CompilerOptions options)
-      : _constantEmitter = ModularConstantEmitter(options, namer),
-        super(namer);
+  ModularEmitterImpl(super.namer, this._registry, CompilerOptions options)
+      : _constantEmitter = ModularConstantEmitter(options, namer);
 
   @override
   js.Expression constantReference(ConstantValue constant) {
     if (constant is FunctionConstantValue) {
       return staticClosureAccess(constant.element);
     }
-    js.Expression expression = _constantEmitter.generate(constant);
+    js.Expression? expression = _constantEmitter.generate(constant);
     if (expression != null) {
       return expression;
     }
-    expression = ModularExpression(ModularExpressionKind.constant, constant);
-    _registry.registerModularExpression(expression);
-    return expression;
+    final modularExpression =
+        ModularExpression(ModularExpressionKind.constant, constant);
+    _registry.registerModularExpression(modularExpression);
+    return modularExpression;
   }
 
   @override
   js.Expression generateEmbeddedGlobalAccess(String global) {
-    js.Expression expression =
+    final expression =
         ModularExpression(ModularExpressionKind.embeddedGlobalAccess, global);
     _registry.registerModularExpression(expression);
     return expression;
@@ -136,23 +133,23 @@
   final JClosedWorld _closedWorld;
   final RecipeEncoder _rtiRecipeEncoder;
   final CodeEmitterTask _task;
-  ModelEmitter _emitter;
+  late final ModelEmitter _emitter;
   final NativeEmitter _nativeEmitter;
 
   @override
-  Program programForTesting;
+  Program? programForTesting;
 
   @override
-  List<PreFragment> preDeferredFragmentsForTesting;
+  List<PreFragment>? preDeferredFragmentsForTesting;
 
   @override
-  Set<OutputUnit> omittedOutputUnits;
+  late final Set<OutputUnit> omittedOutputUnits;
 
   @override
-  Map<String, List<FinalizedFragment>> finalizedFragmentsToLoad;
+  late final Map<String, List<FinalizedFragment>> finalizedFragmentsToLoad;
 
   @override
-  FragmentMerger fragmentMerger;
+  late final FragmentMerger fragmentMerger;
 
   EmitterImpl(
       CompilerOptions options,
@@ -183,9 +180,6 @@
   }
 
   @override
-  Namer get _namer => super._namer;
-
-  @override
   int emitProgram(ProgramBuilder programBuilder, CodegenWorld codegenWorld) {
     Program program = _task.measureSubtask('build program', () {
       return programBuilder.buildProgram();
@@ -250,6 +244,6 @@
     if (_emitter.omittedOutputUnits.contains(unit)) {
       return 0;
     }
-    return _emitter.emittedOutputBuffers[unit].length;
+    return _emitter.emittedOutputBuffers[unit]!.length;
   }
 }
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index 5ee2de9..75f92c7 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -224,7 +224,7 @@
     // We are only interested in the "isInlined" part, but it does not hurt to
     // test for the other predicates.
     if (isConstantInlinedOrAlreadyEmitted(value)) {
-      return constantEmitter.generate(value);
+      return constantEmitter.generate(value)!;
     }
     return js.js('#.#',
         [_namer.globalObjectForConstant(value), _namer.constantName(value)]);