[dart2js] Migrate kernel_impact.dart to null safety

Change-Id: I26e35b22035d22dcc8b46432af1dc8f45f185dc6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/252963
Reviewed-by: Mayank Patke <fishythefish@google.com>
Commit-Queue: Sigmund Cherem <sigmund@google.com>
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
index e1e7473..abe548f 100644
--- a/pkg/compiler/lib/src/ir/impact.dart
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -162,12 +162,12 @@
   void registerInstanceSet(
       ir.DartType receiverType, ClassRelation relation, ir.Member target);
 
-  void registerSuperInvocation(ir.Member target, int positionalArguments,
+  void registerSuperInvocation(ir.Member? target, int positionalArguments,
       List<String> namedArguments, List<ir.DartType> typeArguments);
 
-  void registerSuperGet(ir.Member target);
+  void registerSuperGet(ir.Member? target);
 
-  void registerSuperSet(ir.Member target);
+  void registerSuperSet(ir.Member? target);
 
   void registerSuperInitializer(
       ir.Constructor source,
diff --git a/pkg/compiler/lib/src/ir/impact_data.dart b/pkg/compiler/lib/src/ir/impact_data.dart
index 2a65114..5704733 100644
--- a/pkg/compiler/lib/src/ir/impact_data.dart
+++ b/pkg/compiler/lib/src/ir/impact_data.dart
@@ -606,19 +606,19 @@
   }
 
   @override
-  void registerSuperSet(ir.Member target) {
-    (_data._superSets ??= []).add(target);
+  void registerSuperSet(ir.Member? target) {
+    (_data._superSets ??= []).add(target!);
   }
 
   @override
-  void registerSuperGet(ir.Member target) {
-    (_data._superGets ??= []).add(target);
+  void registerSuperGet(ir.Member? target) {
+    (_data._superGets ??= []).add(target!);
   }
 
   @override
-  void registerSuperInvocation(ir.Member target, int positionalArguments,
+  void registerSuperInvocation(ir.Member? target, int positionalArguments,
       List<String> namedArguments, List<ir.DartType> typeArguments) {
-    (_data._superInvocations ??= []).add(_SuperInvocation(target,
+    (_data._superInvocations ??= []).add(_SuperInvocation(target!,
         _CallStructure(positionalArguments, namedArguments, typeArguments)));
   }
 
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index dc09e06..eb27551 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -8,10 +8,4 @@
 export 'element_map_impl.dart';
 
 /// Kinds of foreign functions.
-enum ForeignKind {
-  JS,
-  JS_BUILTIN,
-  JS_EMBEDDED_GLOBAL,
-  JS_INTERCEPTOR_CONSTANT,
-  NONE,
-}
+export 'element_map_interfaces.dart' show ForeignKind;
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 45f3683..c0e7df0 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -61,6 +61,7 @@
         KernelElementEnvironment,
         KernelToElementMapForClassHierarchy,
         KernelToElementMapForImpactData,
+        KernelToElementMapForKernelImpact,
         KernelToElementMapForNativeData,
         KernelToElementMapForDeferredLoading;
 import 'env.dart';
@@ -75,6 +76,7 @@
         interfaces.KernelToElementMapForImpactData,
         interfaces.KernelToElementMapForNativeData,
         interfaces.KernelToElementMapForDeferredLoading,
+        interfaces.KernelToElementMapForKernelImpact,
         IrToElementMap {
   @override
   final CompilerOptions options;
@@ -502,6 +504,7 @@
   /// Kernel will say that C()'s super initializer resolves to Object(), but
   /// this function will return an entity representing the unnamed mixin
   /// application "Object+M"'s constructor.
+  @override
   ConstructorEntity getSuperConstructor(
       ir.Constructor sourceNode, ir.Member targetNode) {
     ConstructorEntity source = getConstructor(sourceNode);
@@ -548,6 +551,7 @@
   }
 
   /// Returns the [InterfaceType] corresponding to [type].
+  @override
   InterfaceType getInterfaceType(ir.InterfaceType type) =>
       _typeConverter.visitType(type).withoutNullability;
 
@@ -867,6 +871,7 @@
   ir.CoreTypes get coreTypes => _coreTypes ??= ir.CoreTypes(env.mainComponent);
 
   /// Returns the type environment for the underlying kernel model.
+  @override
   ir.TypeEnvironment get typeEnvironment =>
       _typeEnvironment ??= ir.TypeEnvironment(coreTypes, classHierarchy);
 
@@ -894,6 +899,7 @@
   }
 
   /// Returns the [Name] corresponding to [name].
+  @override
   Name getName(ir.Name name) {
     return Name(name.text, name.isPrivate ? getLibrary(name.library) : null);
   }
@@ -934,6 +940,7 @@
 
   /// Returns the [Selector] corresponding to the invocation of [name] with
   /// [arguments].
+  @override
   Selector getInvocationSelector(ir.Name irName, int positionalArguments,
       List<String> namedArguments, int typeArguments) {
     Name name = getName(irName);
@@ -1042,6 +1049,7 @@
 
   /// Computes the [NativeBehavior] for a call to the [JS] function.
   /// TODO(johnniwinther): Cache this for later use.
+  @override
   NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node) {
     if (node.arguments.positional.length < 2 ||
         node.arguments.named.isNotEmpty) {
@@ -1075,6 +1083,7 @@
   /// TODO(johnniwinther): Cache this for later use.
   /// Computes the [NativeBehavior] for a call to the [JS_BUILTIN]
   /// function.
+  @override
   NativeBehavior getNativeBehaviorForJsBuiltinCall(ir.StaticInvocation node) {
     if (node.arguments.positional.length < 1) {
       reporter.internalError(
@@ -1103,6 +1112,7 @@
   /// Computes the [NativeBehavior] for a call to the
   /// [JS_EMBEDDED_GLOBAL] function.
   /// TODO(johnniwinther): Cache this for later use.
+  @override
   NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
       ir.StaticInvocation node) {
     if (node.arguments.positional.length < 1) {
@@ -1207,6 +1217,7 @@
 
   /// Returns the `noSuchMethod` [FunctionEntity] call from a
   /// `super.noSuchMethod` invocation within [cls].
+  @override
   FunctionEntity getSuperNoSuchMethod(ClassEntity cls) {
     while (cls != null) {
       cls = elementEnvironment.getSuperClass(cls);
@@ -1471,6 +1482,7 @@
   }
 
   /// NativeBasicData is need for computation of the default super class.
+  @override
   NativeBasicData get nativeBasicData {
     var data = _nativeBasicData;
     if (data == null) {
@@ -1557,6 +1569,7 @@
   }
 
   /// Returns the [Local] corresponding to the local function [node].
+  @override
   Local getLocalFunction(ir.LocalFunction node) {
     KLocalFunction localFunction = localFunctionMap[node];
     if (localFunction == null) {
@@ -1622,6 +1635,7 @@
   }
 
   /// Compute the kind of foreign helper function called by [node], if any.
+  @override
   ForeignKind getForeignKind(ir.StaticInvocation node) {
     if (commonElements.isForeignHelper(getMember(node.target))) {
       switch (node.target.name.text) {
@@ -1640,6 +1654,7 @@
 
   /// Computes the [InterfaceType] referenced by a call to the
   /// [JS_INTERCEPTOR_CONSTANT] function, if any.
+  @override
   InterfaceType getInterfaceTypeForJsInterceptorCall(ir.StaticInvocation node) {
     if (node.arguments.positional.length != 1 ||
         node.arguments.named.isNotEmpty) {
diff --git a/pkg/compiler/lib/src/kernel/element_map_interfaces.dart b/pkg/compiler/lib/src/kernel/element_map_interfaces.dart
index ac78b1f..12453f5 100644
--- a/pkg/compiler/lib/src/kernel/element_map_interfaces.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_interfaces.dart
@@ -9,26 +9,53 @@
 import 'package:kernel/ast.dart' as ir
     show
         Class,
+        Constructor,
         DartType,
+        Expression,
         Field,
+        InterfaceType,
+        LibraryDependency,
+        LocalFunction,
         Member,
+        Name,
         Procedure,
         ProcedureStubKind,
-        LibraryDependency,
-        Expression;
-import 'package:kernel/type_environment.dart' as ir show StaticTypeContext;
+        StaticInvocation;
+import 'package:kernel/type_environment.dart' as ir
+    show TypeEnvironment, StaticTypeContext;
 import '../common.dart' show DiagnosticReporter;
 import '../common/elements.dart' show CommonElements, ElementEnvironment;
 import '../elements/entities.dart'
-    show ClassEntity, ConstructorEntity, MemberEntity, ImportEntity;
+    show
+        ClassEntity,
+        ConstructorEntity,
+        FieldEntity,
+        FunctionEntity,
+        Local,
+        MemberEntity,
+        ImportEntity;
 import '../constants/values.dart';
 import '../elements/indexed.dart' show IndexedClass;
+import '../elements/names.dart' show Name;
 import '../elements/types.dart' show DartType, DartTypes, InterfaceType;
 import '../ir/constants.dart' show Dart2jsConstantEvaluator;
 import '../native/behavior.dart';
+import '../js_backend/native_data.dart' show NativeBasicData;
 import '../options.dart';
+import '../universe/selector.dart';
 
-abstract class KernelElementEnvironment implements ElementEnvironment {}
+enum ForeignKind {
+  JS,
+  JS_BUILTIN,
+  JS_EMBEDDED_GLOBAL,
+  JS_INTERCEPTOR_CONSTANT,
+  NONE,
+}
+
+abstract class KernelElementEnvironment implements ElementEnvironment {
+  Iterable<ConstantValue> getMemberMetadata(MemberEntity member,
+      {bool includeParameterMetadata = false});
+}
 
 abstract class KernelToElementMapForNativeData {
   KernelElementEnvironment get elementEnvironment;
@@ -75,6 +102,48 @@
   ir.StaticTypeContext getStaticTypeContext(MemberEntity member);
 }
 
+abstract class KernelToElementMapForKernelImpact {
+  CommonElements get commonElements;
+  KernelElementEnvironment get elementEnvironment;
+  NativeBasicData get nativeBasicData;
+  ir.TypeEnvironment get typeEnvironment;
+  InterfaceType createInterfaceType(
+      ir.Class cls, List<ir.DartType> typeArguments);
+  ClassEntity getClass(ir.Class node);
+  ConstantValue? getConstantValue(
+      ir.StaticTypeContext staticTypeContext, ir.Expression node,
+      {bool requireConstant = true,
+      bool implicitNull = false,
+      bool checkCasts = true});
+  ConstructorEntity getConstructor(ir.Member node);
+  ConstructorEntity getSuperConstructor(
+      ir.Constructor sourceNode, ir.Member targetNode);
+  DartType getDartType(ir.DartType type);
+  FieldEntity getField(ir.Field node);
+  ForeignKind getForeignKind(ir.StaticInvocation node);
+  FunctionEntity getMethod(ir.Procedure node);
+  FunctionEntity getSuperNoSuchMethod(ClassEntity cls);
+  InterfaceType getInterfaceType(ir.InterfaceType type);
+  ImportEntity? getImport(ir.LibraryDependency? node);
+  InterfaceType? getInterfaceTypeForJsInterceptorCall(ir.StaticInvocation node);
+  Local getLocalFunction(ir.LocalFunction node);
+  MemberEntity getMember(ir.Member node);
+  Name getName(ir.Name name);
+  NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field,
+      Iterable<String> createsAnnotations, Iterable<String> returnsAnnotations,
+      {required bool isJsInterop});
+  NativeBehavior getNativeBehaviorForFieldStore(ir.Field field);
+  NativeBehavior getNativeBehaviorForJsBuiltinCall(ir.StaticInvocation node);
+  NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node);
+  NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
+      ir.StaticInvocation node);
+  NativeBehavior getNativeBehaviorForMethod(ir.Member member,
+      Iterable<String> createsAnnotations, Iterable<String> returnsAnnotations,
+      {required bool isJsInterop});
+  Selector getInvocationSelector(ir.Name irName, int positionalArguments,
+      List<String> namedArguments, int typeArguments);
+}
+
 // Members which dart2js ignores.
 bool memberIsIgnorable(ir.Member node, {ir.Class? cls}) {
   if (node is! ir.Procedure) return false;
diff --git a/pkg/compiler/lib/src/kernel/kernel_impact.dart b/pkg/compiler/lib/src/kernel/kernel_impact.dart
index 7f95d06..c4c4f4c 100644
--- a/pkg/compiler/lib/src/kernel/kernel_impact.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_impact.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
-
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
 
@@ -35,7 +33,9 @@
 import '../universe/use.dart';
 import '../universe/world_builder.dart';
 import '../universe/world_impact.dart';
-import 'element_map.dart';
+import 'element_map_interfaces.dart';
+
+typedef KernelToElementMap = KernelToElementMapForKernelImpact;
 
 /// [ImpactRegistry] that converts kernel based impact data to world impact
 /// object based on the K model.
@@ -82,7 +82,7 @@
   String typeToString(DartType type) =>
       type.toStructuredText(dartTypes, _options);
 
-  Object _computeReceiverConstraint(
+  Object? _computeReceiverConstraint(
       ir.DartType receiverType, ClassRelation relation) {
     if (receiverType is ir.InterfaceType) {
       return StrongModeConstraint(commonElements, _nativeBasicData,
@@ -142,7 +142,7 @@
     }
   }
 
-  List<DartType> _getTypeArguments(List<ir.DartType> types) {
+  List<DartType>? _getTypeArguments(List<ir.DartType> types) {
     if (types.isEmpty) return null;
     return types.map(elementMap.getDartType).toList();
   }
@@ -156,12 +156,12 @@
   void registerFieldNode(ir.Field field) {
     if (field.isInstanceMember &&
         _nativeBasicData
-            .isNativeClass(elementMap.getClass(field.enclosingClass))) {
+            .isNativeClass(elementMap.getClass(field.enclosingClass!))) {
       MemberEntity member = elementMap.getMember(field);
       // TODO(johnniwinther): NativeDataBuilder already has the native behavior
       // at this point. Use that instead.
       bool isJsInterop = _nativeBasicData.isJsInteropMember(member);
-      List<ConstantValue> metadata =
+      Iterable<ConstantValue> metadata =
           elementMap.elementEnvironment.getMemberMetadata(member);
       Iterable<String> createsAnnotations =
           getCreatesAnnotations(dartTypes, reporter, commonElements, metadata);
@@ -181,7 +181,7 @@
       // TODO(johnniwinther): NativeDataBuilder already has the native behavior
       // at this point. Use that instead.
       bool isJsInterop = _nativeBasicData.isJsInteropMember(member);
-      List<ConstantValue> metadata =
+      Iterable<ConstantValue> metadata =
           elementMap.elementEnvironment.getMemberMetadata(member);
       Iterable<String> createsAnnotations =
           getCreatesAnnotations(dartTypes, reporter, commonElements, metadata);
@@ -227,7 +227,7 @@
       // TODO(johnniwinther): NativeDataBuilder already has the native behavior
       // at this point. Use that instead.
       bool isJsInterop = _nativeBasicData.isJsInteropMember(member);
-      List<ConstantValue> metadata =
+      Iterable<ConstantValue> metadata =
           elementMap.elementEnvironment.getMemberMetadata(member);
       Iterable<String> createsAnnotations =
           getCreatesAnnotations(dartTypes, reporter, commonElements, metadata);
@@ -271,7 +271,7 @@
 
   @override
   void registerListLiteral(ir.DartType elementType,
-      {bool isConst, bool isEmpty}) {
+      {required bool isConst, required bool isEmpty}) {
     // TODO(johnniwinther): Use the [isConstant] and [isEmpty] property when
     // factory constructors are registered directly.
     impactBuilder.registerTypeUse(TypeUse.instantiation(
@@ -280,7 +280,7 @@
 
   @override
   void registerSetLiteral(ir.DartType elementType,
-      {bool isConst, bool isEmpty}) {
+      {required bool isConst, required bool isEmpty}) {
     // TODO(johnniwinther): Use the [isEmpty] property when factory
     // constructors are registered directly.
     if (isConst) {
@@ -293,7 +293,7 @@
 
   @override
   void registerMapLiteral(ir.DartType keyType, ir.DartType valueType,
-      {bool isConst, bool isEmpty}) {
+      {required bool isConst, required bool isEmpty}) {
     // TODO(johnniwinther): Use the [isEmpty] property when factory
     // constructors are registered directly.
     if (isConst) {
@@ -312,19 +312,19 @@
       int positionalArguments,
       List<String> namedArguments,
       List<ir.DartType> typeArguments,
-      ir.LibraryDependency import,
-      {bool isConst}) {
+      ir.LibraryDependency? import,
+      {required bool isConst}) {
     ConstructorEntity constructor = elementMap.getConstructor(target);
     CallStructure callStructure = CallStructure(
         positionalArguments + namedArguments.length,
         namedArguments,
         typeArguments.length);
-    ImportEntity deferredImport = elementMap.getImport(import);
+    ImportEntity? deferredImport = elementMap.getImport(import);
     impactBuilder.registerStaticUse(isConst
         ? StaticUse.constConstructorInvoke(constructor, callStructure,
-            elementMap.getDartType(type).withoutNullability, deferredImport)
+            elementMap.getInterfaceType(type), deferredImport)
         : StaticUse.typedConstructorInvoke(constructor, callStructure,
-            elementMap.getDartType(type).withoutNullability, deferredImport));
+            elementMap.getInterfaceType(type), deferredImport));
     if (type.typeArguments.any((ir.DartType type) => type is! ir.DynamicType)) {
       registerBackendImpact(_impacts.typeVariableBoundCheck);
     }
@@ -340,8 +340,8 @@
 
   @override
   void registerConstInstantiation(ir.Class cls, List<ir.DartType> typeArguments,
-      ir.LibraryDependency import) {
-    ImportEntity deferredImport = elementMap.getImport(import);
+      ir.LibraryDependency? import) {
+    ImportEntity? deferredImport = elementMap.getImport(import);
     InterfaceType type = elementMap.createInterfaceType(cls, typeArguments);
     impactBuilder
         .registerTypeUse(TypeUse.constInstantiation(type, deferredImport));
@@ -377,18 +377,18 @@
       int positionalArguments,
       List<String> namedArguments,
       List<ir.DartType> typeArguments,
-      ir.LibraryDependency import) {
+      ir.LibraryDependency? import) {
     FunctionEntity target = elementMap.getMethod(procedure);
     CallStructure callStructure = CallStructure(
         positionalArguments + namedArguments.length,
         namedArguments,
         typeArguments.length);
-    List<DartType> dartTypeArguments = _getTypeArguments(typeArguments);
+    List<DartType>? dartTypeArguments = _getTypeArguments(typeArguments);
     if (commonElements.isExtractTypeArguments(target)) {
-      _handleExtractTypeArguments(target, dartTypeArguments, callStructure);
+      _handleExtractTypeArguments(target, dartTypeArguments!, callStructure);
       return;
     } else {
-      ImportEntity deferredImport = elementMap.getImport(import);
+      ImportEntity? deferredImport = elementMap.getImport(import);
       impactBuilder.registerStaticUse(StaticUse.staticInvoke(
           target, callStructure, dartTypeArguments, deferredImport));
     }
@@ -409,7 +409,7 @@
             elementMap.getNativeBehaviorForJsEmbeddedGlobalCall(node));
         break;
       case ForeignKind.JS_INTERCEPTOR_CONSTANT:
-        InterfaceType type =
+        InterfaceType? type =
             elementMap.getInterfaceTypeForJsInterceptorCall(node);
         if (type != null) {
           impactBuilder.registerTypeUse(TypeUse.instantiation(type));
@@ -449,29 +449,29 @@
 
   @override
   void registerStaticTearOff(
-      ir.Procedure procedure, ir.LibraryDependency import) {
+      ir.Procedure procedure, ir.LibraryDependency? import) {
     impactBuilder.registerStaticUse(StaticUse.staticTearOff(
         elementMap.getMethod(procedure), elementMap.getImport(import)));
   }
 
   @override
-  void registerStaticGet(ir.Member member, ir.LibraryDependency import) {
+  void registerStaticGet(ir.Member member, ir.LibraryDependency? import) {
     impactBuilder.registerStaticUse(StaticUse.staticGet(
         elementMap.getMember(member), elementMap.getImport(import)));
   }
 
   @override
-  void registerStaticSet(ir.Member member, ir.LibraryDependency import) {
+  void registerStaticSet(ir.Member member, ir.LibraryDependency? import) {
     impactBuilder.registerStaticUse(StaticUse.staticSet(
         elementMap.getMember(member), elementMap.getImport(import)));
   }
 
   @override
-  void registerSuperInvocation(ir.Member target, int positionalArguments,
+  void registerSuperInvocation(ir.Member? target, int positionalArguments,
       List<String> namedArguments, List<ir.DartType> typeArguments) {
     if (target != null) {
-      FunctionEntity method = elementMap.getMember(target);
-      List<DartType> dartTypeArguments = _getTypeArguments(typeArguments);
+      FunctionEntity method = elementMap.getMember(target) as FunctionEntity;
+      List<DartType>? dartTypeArguments = _getTypeArguments(typeArguments);
       impactBuilder.registerStaticUse(StaticUse.superInvoke(
           method,
           CallStructure(positionalArguments + namedArguments.length,
@@ -481,18 +481,19 @@
       // TODO(johnniwinther): Remove this when the CFE checks for missing
       //  concrete super targets.
       impactBuilder.registerStaticUse(StaticUse.superInvoke(
-          elementMap.getSuperNoSuchMethod(currentMember.enclosingClass),
+          elementMap.getSuperNoSuchMethod(currentMember.enclosingClass!),
           CallStructure.ONE_ARG));
       registerBackendImpact(_impacts.superNoSuchMethod);
     }
   }
 
   @override
-  void registerSuperGet(ir.Member target) {
+  void registerSuperGet(ir.Member? target) {
     if (target != null) {
       MemberEntity member = elementMap.getMember(target);
       if (member.isFunction) {
-        impactBuilder.registerStaticUse(StaticUse.superTearOff(member));
+        impactBuilder.registerStaticUse(
+            StaticUse.superTearOff(member as FunctionEntity));
       } else {
         impactBuilder.registerStaticUse(StaticUse.superGet(member));
       }
@@ -500,26 +501,28 @@
       // TODO(johnniwinther): Remove this when the CFE checks for missing
       //  concrete super targets.
       impactBuilder.registerStaticUse(StaticUse.superInvoke(
-          elementMap.getSuperNoSuchMethod(currentMember.enclosingClass),
+          elementMap.getSuperNoSuchMethod(currentMember.enclosingClass!),
           CallStructure.ONE_ARG));
       registerBackendImpact(_impacts.superNoSuchMethod);
     }
   }
 
   @override
-  void registerSuperSet(ir.Member target) {
+  void registerSuperSet(ir.Member? target) {
     if (target != null) {
       MemberEntity member = elementMap.getMember(target);
       if (member.isField) {
-        impactBuilder.registerStaticUse(StaticUse.superFieldSet(member));
+        impactBuilder
+            .registerStaticUse(StaticUse.superFieldSet(member as FieldEntity));
       } else {
-        impactBuilder.registerStaticUse(StaticUse.superSetterSet(member));
+        impactBuilder.registerStaticUse(
+            StaticUse.superSetterSet(member as FunctionEntity));
       }
     } else {
       // TODO(johnniwinther): Remove this when the CFE checks for missing
       //  concrete super targets.
       impactBuilder.registerStaticUse(StaticUse.superInvoke(
-          elementMap.getSuperNoSuchMethod(currentMember.enclosingClass),
+          elementMap.getSuperNoSuchMethod(currentMember.enclosingClass!),
           CallStructure.ONE_ARG));
       registerBackendImpact(_impacts.superNoSuchMethod);
     }
@@ -535,7 +538,7 @@
         positionalArguments + namedArguments.length,
         namedArguments,
         typeArguments.length);
-    List<DartType> dartTypeArguments = _getTypeArguments(typeArguments);
+    List<DartType>? dartTypeArguments = _getTypeArguments(typeArguments);
     // Invocation of a local function. No need for dynamic use, but
     // we need to track the type arguments.
     impactBuilder.registerStaticUse(StaticUse.closureCall(
@@ -559,7 +562,7 @@
       List<ir.DartType> typeArguments) {
     Selector selector = elementMap.getInvocationSelector(
         name, positionalArguments, namedArguments, typeArguments.length);
-    List<DartType> dartTypeArguments = _getTypeArguments(typeArguments);
+    List<DartType>? dartTypeArguments = _getTypeArguments(typeArguments);
     impactBuilder.registerDynamicUse(DynamicUse(selector,
         _computeReceiverConstraint(receiverType, relation), dartTypeArguments));
   }
@@ -574,7 +577,7 @@
         positionalArguments + namedArguments.length,
         namedArguments,
         typeArguments.length);
-    List<DartType> dartTypeArguments = _getTypeArguments(typeArguments);
+    List<DartType>? dartTypeArguments = _getTypeArguments(typeArguments);
     impactBuilder.registerDynamicUse(DynamicUse(
         callStructure.callSelector,
         _computeReceiverConstraint(receiverType, ClassRelation.subtype),
@@ -589,7 +592,7 @@
       int positionalArguments,
       List<String> namedArguments,
       List<ir.DartType> typeArguments) {
-    List<DartType> dartTypeArguments = _getTypeArguments(typeArguments);
+    List<DartType>? dartTypeArguments = _getTypeArguments(typeArguments);
     impactBuilder.registerDynamicUse(DynamicUse(
         elementMap.getInvocationSelector(target.name, positionalArguments,
             namedArguments, typeArguments.length),
@@ -635,9 +638,9 @@
 
   @override
   void registerRuntimeTypeUse(RuntimeTypeUseKind kind, ir.DartType receiverType,
-      ir.DartType argumentType) {
+      ir.DartType? argumentType) {
     DartType receiverDartType = elementMap.getDartType(receiverType);
-    DartType argumentDartType =
+    DartType? argumentDartType =
         argumentType == null ? null : elementMap.getDartType(argumentType);
 
     // Enable runtime type support if we discover a getter called
@@ -649,7 +652,7 @@
   }
 
   @override
-  void registerAssert({bool withMessage}) {
+  void registerAssert({required bool withMessage}) {
     registerBackendImpact(withMessage
         ? _impacts.assertWithMessage
         : _impacts.assertWithoutMessage);
@@ -660,7 +663,8 @@
       ir.FunctionType expressionType, List<ir.DartType> typeArguments) {
     // TODO(johnniwinther): Track which arities are used in instantiation.
     final instantiation = GenericInstantiation(
-        elementMap.getDartType(expressionType).withoutNullability,
+        elementMap.getDartType(expressionType).withoutNullability
+            as FunctionType,
         typeArguments.map(elementMap.getDartType).toList());
     registerBackendImpact(
         _impacts.getGenericInstantiation(instantiation.typeArguments.length));
@@ -674,7 +678,7 @@
   }
 
   @override
-  void registerLocalFunction(ir.TreeNode node) {
+  void registerLocalFunction(covariant ir.LocalFunction node) {
     Local function = elementMap.getLocalFunction(node);
     impactBuilder.registerStaticUse(StaticUse.closure(function));
     registerBackendImpact(_impacts.closure);
@@ -727,7 +731,7 @@
   @override
   void registerSyncForIn(ir.DartType iterableType, ir.DartType iteratorType,
       ClassRelation iteratorClassRelation) {
-    Object receiverConstraint =
+    Object? receiverConstraint =
         _computeReceiverConstraint(iteratorType, iteratorClassRelation);
     registerBackendImpact(_impacts.syncForIn);
     impactBuilder.registerDynamicUse(
@@ -741,7 +745,7 @@
   @override
   void registerAsyncForIn(ir.DartType iterableType, ir.DartType iteratorType,
       ClassRelation iteratorClassRelation) {
-    Object receiverConstraint =
+    Object? receiverConstraint =
         _computeReceiverConstraint(iteratorType, iteratorClassRelation);
     registerBackendImpact(_impacts.asyncForIn);
     impactBuilder.registerDynamicUse(
@@ -770,8 +774,8 @@
   }
 
   @override
-  void registerTypeLiteral(ir.DartType irType, ir.LibraryDependency import) {
-    ImportEntity deferredImport = elementMap.getImport(import);
+  void registerTypeLiteral(ir.DartType irType, ir.LibraryDependency? import) {
+    ImportEntity? deferredImport = elementMap.getImport(import);
     DartType type = elementMap.getDartType(irType);
     impactBuilder.registerTypeUse(TypeUse.typeLiteral(type, deferredImport));
     _customElementsResolutionAnalysis.registerTypeLiteral(type);
@@ -825,10 +829,10 @@
         // Treat symbol constants as if Symbol doesn't override `==`.
         return false;
       }
-      ClassEntity cls = type.element;
+      ClassEntity? cls = type.element;
       while (cls != null) {
         MemberEntity member =
-            elementMap.elementEnvironment.lookupClassMember(cls, '==');
+            elementMap.elementEnvironment.lookupClassMember(cls, '==')!;
         if (member.isAbstract) {
           cls = elementMap.elementEnvironment.getSuperClass(cls);
         } else {
@@ -842,7 +846,7 @@
     for (ir.SwitchCase switchCase in node.cases) {
       for (ir.Expression expression in switchCase.expressions) {
         ConstantValue value =
-            elementMap.getConstantValue(staticTypeContext, expression);
+            elementMap.getConstantValue(staticTypeContext, expression)!;
         DartType type = value.getType(elementMap.commonElements);
         if (type == commonElements.doubleType) {
           reporter.reportErrorMessage(
@@ -854,7 +858,7 @@
               MessageKind.SWITCH_CASE_FORBIDDEN, {'type': "Function"});
         } else if (value is ObjectConstantValue &&
             type != commonElements.typeLiteralType &&
-            overridesEquals(type)) {
+            overridesEquals(type as InterfaceType)) {
           reporter.reportErrorMessage(
               computeSourceSpanFromTreeNode(expression),
               MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS,
diff --git a/pkg/compiler/lib/src/universe/use.dart b/pkg/compiler/lib/src/universe/use.dart
index b4ebace..fb60943 100644
--- a/pkg/compiler/lib/src/universe/use.dart
+++ b/pkg/compiler/lib/src/universe/use.dart
@@ -561,7 +561,7 @@
       ConstructorEntity element,
       CallStructure callStructure,
       InterfaceType type,
-      ImportEntity deferredImport) {
+      ImportEntity? deferredImport) {
     assert(
         (type as dynamic) != null, // TODO(48820): remove when sound
         failedAt(element, "No type provided for constructor invocation."));
@@ -583,7 +583,7 @@
       ConstructorEntity element,
       CallStructure callStructure,
       InterfaceType type,
-      ImportEntity deferredImport) {
+      ImportEntity? deferredImport) {
     assert(
         (type as dynamic) != null, // TODO(48820): remove when sound
         failedAt(element, "No type provided for constructor invocation."));
@@ -645,7 +645,7 @@
   /// An invocation of a local function [element] with the provided
   /// [callStructure] and [typeArguments].
   factory StaticUse.closureCall(Local element, CallStructure callStructure,
-      List<DartType> typeArguments) {
+      List<DartType>? typeArguments) {
     StaticUse staticUse = StaticUse.internal(
         element, StaticUseKind.CLOSURE_CALL,
         callStructure: callStructure, typeArguments: typeArguments);
@@ -836,7 +836,7 @@
   }
 
   /// [type] used as a type literal, like `foo() => T;`.
-  factory TypeUse.typeLiteral(DartType type, ImportEntity deferredImport) {
+  factory TypeUse.typeLiteral(DartType type, ImportEntity? deferredImport) {
     return TypeUse.internal(type, TypeUseKind.TYPE_LITERAL, deferredImport);
   }
 
@@ -847,7 +847,7 @@
 
   /// [type] used in a constant instantiation, like `const T();`.
   factory TypeUse.constInstantiation(
-      InterfaceType type, ImportEntity deferredImport) {
+      InterfaceType type, ImportEntity? deferredImport) {
     return TypeUse.internal(
         type, TypeUseKind.CONST_INSTANTIATION, deferredImport);
   }