[kernel,vm] Migrate first part of vm transformations

Since the VM package isn't opted in, the individual libraries have
been annotated with `@dart=2.12` to opt in to null safety.

TEST=existing

Change-Id: I0bfbcf69cb80d32bb6b80a171f7bdb62fde7ca65
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/195277
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Aske Simon Christensen <askesc@google.com>
diff --git a/pkg/kernel/lib/core_types.dart b/pkg/kernel/lib/core_types.dart
index 4123eec..30c0329 100644
--- a/pkg/kernel/lib/core_types.dart
+++ b/pkg/kernel/lib/core_types.dart
@@ -119,8 +119,8 @@
   CoreTypes(Component component)
       : index = new LibraryIndex.coreLibraries(component);
 
-  late final Procedure asyncErrorWrapperHelperProcedure = index
-      .getTopLevelMember('dart:async', '_asyncErrorWrapperHelper') as Procedure;
+  late final Procedure asyncErrorWrapperHelperProcedure =
+      index.getTopLevelProcedure('dart:async', '_asyncErrorWrapperHelper');
 
   late final Library asyncLibrary = index.getLibrary('dart:async');
 
@@ -139,33 +139,33 @@
   late final Member asyncStarStreamControllerClose =
       index.getMember('dart:async', '_AsyncStarStreamController', 'close');
 
-  late final Constructor asyncStarStreamControllerDefaultConstructor = index
-      .getMember('dart:async', '_AsyncStarStreamController', '') as Constructor;
+  late final Constructor asyncStarStreamControllerDefaultConstructor =
+      index.getConstructor('dart:async', '_AsyncStarStreamController', '');
 
   late final Member asyncStarStreamControllerStream =
       index.getMember('dart:async', '_AsyncStarStreamController', 'get:stream');
 
-  late final Procedure asyncStarMoveNextHelper = index.getTopLevelMember(
-      'dart:async', '_asyncStarMoveNextHelper') as Procedure;
+  late final Procedure asyncStarMoveNextHelper =
+      index.getTopLevelProcedure('dart:async', '_asyncStarMoveNextHelper');
 
-  late final Procedure asyncThenWrapperHelperProcedure = index
-      .getTopLevelMember('dart:async', '_asyncThenWrapperHelper') as Procedure;
+  late final Procedure asyncThenWrapperHelperProcedure =
+      index.getTopLevelProcedure('dart:async', '_asyncThenWrapperHelper');
 
   late final Procedure awaitHelperProcedure =
-      index.getTopLevelMember('dart:async', '_awaitHelper') as Procedure;
+      index.getTopLevelProcedure('dart:async', '_awaitHelper');
 
   late final Class boolClass = index.getClass('dart:core', 'bool');
 
   late final Class futureImplClass = index.getClass('dart:async', '_Future');
 
   late final Constructor futureImplConstructor =
-      index.getMember('dart:async', '_Future', '') as Constructor;
+      index.getConstructor('dart:async', '_Future', '');
 
-  late final Procedure completeOnAsyncReturn = index.getTopLevelMember(
-      'dart:async', '_completeOnAsyncReturn') as Procedure;
+  late final Procedure completeOnAsyncReturn =
+      index.getTopLevelProcedure('dart:async', '_completeOnAsyncReturn');
 
-  late final Procedure completeOnAsyncError = index.getTopLevelMember(
-      'dart:async', '_completeOnAsyncError') as Procedure;
+  late final Procedure completeOnAsyncError =
+      index.getTopLevelProcedure('dart:async', '_completeOnAsyncError');
 
   late final Library coreLibrary = index.getLibrary('dart:core');
 
@@ -180,7 +180,7 @@
       index.getClass('dart:async', 'FutureOr');
 
   late final Procedure identicalProcedure =
-      index.getTopLevelMember('dart:core', 'identical') as Procedure;
+      index.getTopLevelProcedure('dart:core', 'identical');
 
   late final Class intClass = index.getClass('dart:core', 'int');
 
@@ -192,47 +192,46 @@
   late final Class invocationMirrorClass =
       index.getClass('dart:core', '_InvocationMirror');
 
-  late final Constructor invocationMirrorWithTypeConstructor = index.getMember(
-      'dart:core', '_InvocationMirror', '_withType') as Constructor;
+  late final Constructor invocationMirrorWithTypeConstructor =
+      index.getConstructor('dart:core', '_InvocationMirror', '_withType');
 
   late final Class iterableClass = index.getClass('dart:core', 'Iterable');
 
   late final Procedure iterableGetIterator =
-      index.getMember('dart:core', 'Iterable', 'get:iterator') as Procedure;
+      index.getProcedure('dart:core', 'Iterable', 'get:iterator');
 
   late final Class iteratorClass = index.getClass('dart:core', 'Iterator');
 
   late final Procedure iteratorMoveNext =
-      index.getMember('dart:core', 'Iterator', 'moveNext') as Procedure;
+      index.getProcedure('dart:core', 'Iterator', 'moveNext');
 
   late final Procedure iteratorGetCurrent =
-      index.getMember('dart:core', 'Iterator', 'get:current') as Procedure;
+      index.getProcedure('dart:core', 'Iterator', 'get:current');
 
   late final Class listClass = index.getClass('dart:core', 'List');
 
   late final Procedure listDefaultConstructor =
-      index.getMember('dart:core', 'List', '') as Procedure;
+      index.getProcedure('dart:core', 'List', '');
 
   late final Procedure listFromConstructor =
-      index.getMember('dart:core', 'List', 'from') as Procedure;
+      index.getProcedure('dart:core', 'List', 'from');
 
   late final Procedure listUnmodifiableConstructor =
-      index.getMember('dart:core', 'List', 'unmodifiable') as Procedure;
+      index.getProcedure('dart:core', 'List', 'unmodifiable');
 
   late final Class setClass = index.getClass('dart:core', 'Set');
 
   late final Class mapClass = index.getClass('dart:core', 'Map');
 
   late final Procedure mapUnmodifiable =
-      index.getMember('dart:core', 'Map', 'unmodifiable') as Procedure;
+      index.getProcedure('dart:core', 'Map', 'unmodifiable');
 
   /// The `dart:mirrors` library, or `null` if the component does not use it.
   late final Library? mirrorsLibrary = index.tryGetLibrary('dart:mirrors');
 
   late final Constructor noSuchMethodErrorDefaultConstructor =
       // TODO(regis): Replace 'withInvocation' with '' after dart2js is fixed.
-      index.getMember('dart:core', 'NoSuchMethodError', 'withInvocation')
-          as Constructor;
+      index.getConstructor('dart:core', 'NoSuchMethodError', 'withInvocation');
 
   late final Class deprecatedNullClass = index.getClass('dart:core', 'Null');
 
@@ -241,18 +240,17 @@
   late final Class objectClass = index.getClass('dart:core', 'Object');
 
   late final Procedure objectEquals =
-      index.getMember('dart:core', 'Object', '==') as Procedure;
+      index.getProcedure('dart:core', 'Object', '==');
 
   late final Class pragmaClass = index.getClass('dart:core', 'pragma');
 
-  late final Field pragmaName =
-      index.getMember('dart:core', 'pragma', 'name') as Field;
+  late final Field pragmaName = index.getField('dart:core', 'pragma', 'name');
 
   late final Field pragmaOptions =
-      index.getMember('dart:core', 'pragma', 'options') as Field;
+      index.getField('dart:core', 'pragma', 'options');
 
   late final Constructor pragmaConstructor =
-      index.getMember('dart:core', 'pragma', '_') as Constructor;
+      index.getConstructor('dart:core', 'pragma', '_');
 
   late final Class stackTraceClass = index.getClass('dart:core', 'StackTrace');
 
@@ -268,7 +266,7 @@
       index.getClass('dart:async', '_StreamIterator');
 
   late final Constructor streamIteratorDefaultConstructor =
-      index.getMember('dart:async', '_StreamIterator', '') as Constructor;
+      index.getConstructor('dart:async', '_StreamIterator', '');
 
   late final Member streamIteratorMoveNext =
       index.getMember('dart:async', '_StreamIterator', 'moveNext');
@@ -281,7 +279,7 @@
   late final Class symbolClass = index.getClass('dart:core', 'Symbol');
 
   late final Constructor syncIterableDefaultConstructor =
-      index.getMember('dart:core', '_SyncIterable', '') as Constructor;
+      index.getConstructor('dart:core', '_SyncIterable', '');
 
   late final Class syncIteratorClass =
       index.getClass('dart:core', '_SyncIterator');
@@ -294,40 +292,40 @@
 
   late final Class typeClass = index.getClass('dart:core', 'Type');
 
-  late final Constructor fallThroughErrorUrlAndLineConstructor = index
-      .getMember('dart:core', 'FallThroughError', '_create') as Constructor;
+  late final Constructor fallThroughErrorUrlAndLineConstructor =
+      index.getConstructor('dart:core', 'FallThroughError', '_create');
 
   late final Procedure boolFromEnvironment =
-      index.getMember('dart:core', 'bool', 'fromEnvironment') as Procedure;
+      index.getProcedure('dart:core', 'bool', 'fromEnvironment');
 
   late final Procedure createSentinelMethod =
-      index.getTopLevelMember('dart:_internal', 'createSentinel') as Procedure;
+      index.getTopLevelProcedure('dart:_internal', 'createSentinel');
 
   late final Procedure isSentinelMethod =
-      index.getTopLevelMember('dart:_internal', 'isSentinel') as Procedure;
+      index.getTopLevelProcedure('dart:_internal', 'isSentinel');
 
   late final Constructor
       lateInitializationFieldAssignedDuringInitializationConstructor =
-      index.getMember('dart:_internal', 'LateError', 'fieldADI') as Constructor;
+      index.getConstructor('dart:_internal', 'LateError', 'fieldADI');
 
   late final Constructor
       lateInitializationLocalAssignedDuringInitializationConstructor =
-      index.getMember('dart:_internal', 'LateError', 'localADI') as Constructor;
+      index.getConstructor('dart:_internal', 'LateError', 'localADI');
 
   late final Constructor lateInitializationFieldNotInitializedConstructor =
-      index.getMember('dart:_internal', 'LateError', 'fieldNI') as Constructor;
+      index.getConstructor('dart:_internal', 'LateError', 'fieldNI');
 
   late final Constructor lateInitializationLocalNotInitializedConstructor =
-      index.getMember('dart:_internal', 'LateError', 'localNI') as Constructor;
+      index.getConstructor('dart:_internal', 'LateError', 'localNI');
 
   late final Constructor lateInitializationFieldAlreadyInitializedConstructor =
-      index.getMember('dart:_internal', 'LateError', 'fieldAI') as Constructor;
+      index.getConstructor('dart:_internal', 'LateError', 'fieldAI');
 
   late final Constructor lateInitializationLocalAlreadyInitializedConstructor =
-      index.getMember('dart:_internal', 'LateError', 'localAI') as Constructor;
+      index.getConstructor('dart:_internal', 'LateError', 'localAI');
 
   late final Constructor reachabilityErrorConstructor =
-      index.getMember('dart:_internal', 'ReachabilityError', '') as Constructor;
+      index.getConstructor('dart:_internal', 'ReachabilityError', '');
 
   late final Class cellClass = index.getClass('dart:_late_helper', '_Cell');
 
diff --git a/pkg/kernel/lib/library_index.dart b/pkg/kernel/lib/library_index.dart
index 6ee654d..e2f89df 100644
--- a/pkg/kernel/lib/library_index.dart
+++ b/pkg/kernel/lib/library_index.dart
@@ -108,6 +108,19 @@
     return _libraries[library]?.tryGetMember(className, memberName);
   }
 
+  Constructor getConstructor(
+      String library, String className, String memberName) {
+    return _getLibraryIndex(library).getConstructor(className, memberName);
+  }
+
+  Procedure getProcedure(String library, String className, String memberName) {
+    return _getLibraryIndex(library).getProcedure(className, memberName);
+  }
+
+  Field getField(String library, String className, String memberName) {
+    return _getLibraryIndex(library).getField(className, memberName);
+  }
+
   /// Returns the top-level member with the given name, in the given library.
   ///
   /// If a getter or setter is wanted, the `get:` or `set:` prefix must be
@@ -127,6 +140,14 @@
       String library, String className, String memberName) {
     return tryGetMember(library, topLevel, memberName);
   }
+
+  Procedure getTopLevelProcedure(String library, String memberName) {
+    return getProcedure(library, topLevel, memberName);
+  }
+
+  Field getTopLevelField(String library, String memberName) {
+    return getField(library, topLevel, memberName);
+  }
 }
 
 class _ClassTable {
@@ -186,6 +207,18 @@
   Member? tryGetMember(String className, String memberName) {
     return classes[className]?.tryGetMember(memberName);
   }
+
+  Constructor getConstructor(String className, String memberName) {
+    return _getClassIndex(className).getConstructor(memberName);
+  }
+
+  Procedure getProcedure(String className, String memberName) {
+    return _getClassIndex(className).getProcedure(memberName);
+  }
+
+  Field getField(String className, String memberName) {
+    return _getClassIndex(className).getField(memberName);
+  }
 }
 
 class _MemberTable {
@@ -290,4 +323,31 @@
   }
 
   Member? tryGetMember(String name) => members[name];
+
+  Constructor getConstructor(String name) {
+    Member member = getMember(name);
+    if (member is! Constructor) {
+      throw "Member '$name' in $containerName is not a Constructor: "
+          "${member} (${member.runtimeType}).";
+    }
+    return member;
+  }
+
+  Procedure getProcedure(String name) {
+    Member member = getMember(name);
+    if (member is! Procedure) {
+      throw "Member '$name' in $containerName is not a Procedure: "
+          "${member} (${member.runtimeType}).";
+    }
+    return member;
+  }
+
+  Field getField(String name) {
+    Member member = getMember(name);
+    if (member is! Field) {
+      throw "Member '$name' in $containerName is not a Field: "
+          "${member} (${member.runtimeType}).";
+    }
+    return member;
+  }
 }
diff --git a/pkg/kernel/lib/vm/constants_native_effects.dart b/pkg/kernel/lib/vm/constants_native_effects.dart
index f4efb71..911f2cc 100644
--- a/pkg/kernel/lib/vm/constants_native_effects.dart
+++ b/pkg/kernel/lib/vm/constants_native_effects.dart
@@ -25,8 +25,8 @@
         .firstWhere((Class klass) => klass.name == '_ImmutableMap');
     // ignore: unnecessary_null_comparison
     assert(immutableMapClass != null);
-    Field unmodifiableSetMap = coreTypes.index
-        .getMember('dart:collection', '_UnmodifiableSet', '_map') as Field;
+    Field unmodifiableSetMap =
+        coreTypes.index.getField('dart:collection', '_UnmodifiableSet', '_map');
 
     return new VmConstantsBackend._(immutableMapClass, unmodifiableSetMap,
         unmodifiableSetMap.enclosingClass!);
diff --git a/pkg/vm/lib/metadata/call_site_attributes.dart b/pkg/vm/lib/metadata/call_site_attributes.dart
index 10acd75..7ef8c93 100644
--- a/pkg/vm/lib/metadata/call_site_attributes.dart
+++ b/pkg/vm/lib/metadata/call_site_attributes.dart
@@ -2,6 +2,8 @@
 // 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.12
+
 library vm.metadata.call_site_attributes;
 
 import 'package:kernel/ast.dart';
@@ -11,7 +13,7 @@
 class CallSiteAttributesMetadata {
   final DartType receiverType;
 
-  const CallSiteAttributesMetadata({this.receiverType});
+  const CallSiteAttributesMetadata({required this.receiverType});
 
   @override
   String toString() =>
diff --git a/pkg/vm/lib/transformations/call_site_annotator.dart b/pkg/vm/lib/transformations/call_site_annotator.dart
index 8a45c5a..e3722a1 100644
--- a/pkg/vm/lib/transformations/call_site_annotator.dart
+++ b/pkg/vm/lib/transformations/call_site_annotator.dart
@@ -2,6 +2,8 @@
 // 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.12
+
 // This transformation annotates call sites with the receiver type.
 // This is done to avoid reimplementing [Expression.getStaticType] in
 // C++.
@@ -19,8 +21,9 @@
 
 CallSiteAttributesMetadataRepository addRepositoryTo(Component component) {
   return component.metadata.putIfAbsent(
-      CallSiteAttributesMetadataRepository.repositoryTag,
-      () => new CallSiteAttributesMetadataRepository());
+          CallSiteAttributesMetadataRepository.repositoryTag,
+          () => new CallSiteAttributesMetadataRepository())
+      as CallSiteAttributesMetadataRepository;
 }
 
 void transformLibraries(Component component, List<Library> libraries,
@@ -33,7 +36,7 @@
 class AnnotateWithStaticTypes extends RecursiveVisitor {
   final CallSiteAttributesMetadataRepository _metadata;
   final TypeEnvironment env;
-  StaticTypeContext _staticTypeContext;
+  StaticTypeContext? _staticTypeContext;
 
   AnnotateWithStaticTypes(
       Component component, CoreTypes coreTypes, ClassHierarchy hierarchy)
@@ -49,7 +52,7 @@
 
   void annotateWithType(TreeNode node, Expression receiver) {
     _metadata.mapping[node] = new CallSiteAttributesMetadata(
-        receiverType: receiver.getStaticType(_staticTypeContext));
+        receiverType: receiver.getStaticType(_staticTypeContext!));
   }
 
   @override
@@ -80,7 +83,7 @@
 
   /// Returns [true] if the given [member] has any parameters annotated with
   /// generic-covariant-impl attribute.
-  static bool hasGenericCovariantParameters(Member member) {
+  static bool hasGenericCovariantParameters(Member? member) {
     if (member is Procedure) {
       return containsGenericCovariantImpl(
               member.function.positionalParameters) ||
diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi.dart
index 3012c7a..f4bc7eb 100644
--- a/pkg/vm/lib/transformations/ffi.dart
+++ b/pkg/vm/lib/transformations/ffi.dart
@@ -2,6 +2,8 @@
 // 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.12
+
 // This file contains logic which is shared between the ffi_definition and
 // ffi_use_site transformers.
 
@@ -195,7 +197,7 @@
   final LibraryIndex index;
   final ClassHierarchy hierarchy;
   final DiagnosticReporter diagnosticReporter;
-  final ReferenceFromIndex referenceFromIndex;
+  final ReferenceFromIndex? referenceFromIndex;
 
   final Class objectClass;
   final Class intClass;
@@ -288,8 +290,8 @@
   /// Classes corresponding to [NativeType], indexed by [NativeType].
   final List<Class> nativeTypesClasses;
 
-  Library currentLibrary;
-  IndexedLibrary currentLibraryIndex;
+  Library? currentLibrary;
+  IndexedLibrary? currentLibraryIndex;
 
   FfiTransformer(this.index, this.coreTypes, this.hierarchy,
       this.diagnosticReporter, this.referenceFromIndex)
@@ -300,23 +302,25 @@
         listClass = coreTypes.listClass,
         typeClass = coreTypes.typeClass,
         unsafeCastMethod =
-            index.getTopLevelMember('dart:_internal', 'unsafeCast'),
+            index.getTopLevelProcedure('dart:_internal', 'unsafeCast'),
         nativeEffectMethod =
-            index.getTopLevelMember('dart:_internal', '_nativeEffect'),
+            index.getTopLevelProcedure('dart:_internal', '_nativeEffect'),
         typedDataClass = index.getClass('dart:typed_data', 'TypedData'),
         typedDataBufferGetter =
-            index.getMember('dart:typed_data', 'TypedData', 'get:buffer'),
-        typedDataOffsetInBytesGetter = index.getMember(
+            index.getProcedure('dart:typed_data', 'TypedData', 'get:buffer'),
+        typedDataOffsetInBytesGetter = index.getProcedure(
             'dart:typed_data', 'TypedData', 'get:offsetInBytes'),
         byteBufferAsUint8List =
-            index.getMember('dart:typed_data', 'ByteBuffer', 'asUint8List'),
-        uint8ListFactory = index.getMember('dart:typed_data', 'Uint8List', ''),
+            index.getProcedure('dart:typed_data', 'ByteBuffer', 'asUint8List'),
+        uint8ListFactory =
+            index.getProcedure('dart:typed_data', 'Uint8List', ''),
         pragmaClass = coreTypes.pragmaClass,
         pragmaName = coreTypes.pragmaName,
         pragmaOptions = coreTypes.pragmaOptions,
-        listElementAt = coreTypes.index.getMember('dart:core', 'List', '[]'),
-        numAddition = coreTypes.index.getMember('dart:core', 'num', '+'),
-        numMultiplication = coreTypes.index.getMember('dart:core', 'num', '*'),
+        listElementAt = coreTypes.index.getProcedure('dart:core', 'List', '[]'),
+        numAddition = coreTypes.index.getProcedure('dart:core', 'num', '+'),
+        numMultiplication =
+            coreTypes.index.getProcedure('dart:core', 'num', '*'),
         ffiLibrary = index.getLibrary('dart:ffi'),
         allocatorClass = index.getClass('dart:ffi', 'Allocator'),
         nativeFunctionClass = index.getClass('dart:ffi', 'NativeFunction'),
@@ -324,120 +328,128 @@
         arrayClass = index.getClass('dart:ffi', 'Array'),
         arraySizeClass = index.getClass('dart:ffi', '_ArraySize'),
         arraySizeDimension1Field =
-            index.getMember('dart:ffi', '_ArraySize', 'dimension1'),
+            index.getField('dart:ffi', '_ArraySize', 'dimension1'),
         arraySizeDimension2Field =
-            index.getMember('dart:ffi', '_ArraySize', 'dimension2'),
+            index.getField('dart:ffi', '_ArraySize', 'dimension2'),
         arraySizeDimension3Field =
-            index.getMember('dart:ffi', '_ArraySize', 'dimension3'),
+            index.getField('dart:ffi', '_ArraySize', 'dimension3'),
         arraySizeDimension4Field =
-            index.getMember('dart:ffi', '_ArraySize', 'dimension4'),
+            index.getField('dart:ffi', '_ArraySize', 'dimension4'),
         arraySizeDimension5Field =
-            index.getMember('dart:ffi', '_ArraySize', 'dimension5'),
+            index.getField('dart:ffi', '_ArraySize', 'dimension5'),
         arraySizeDimensionsField =
-            index.getMember('dart:ffi', '_ArraySize', 'dimensions'),
+            index.getField('dart:ffi', '_ArraySize', 'dimensions'),
         pointerClass = index.getClass('dart:ffi', 'Pointer'),
         compoundClass = index.getClass('dart:ffi', '_Compound'),
         structClass = index.getClass('dart:ffi', 'Struct'),
         unionClass = index.getClass('dart:ffi', 'Union'),
         ffiStructLayoutClass = index.getClass('dart:ffi', '_FfiStructLayout'),
         ffiStructLayoutTypesField =
-            index.getMember('dart:ffi', '_FfiStructLayout', 'fieldTypes'),
+            index.getField('dart:ffi', '_FfiStructLayout', 'fieldTypes'),
         ffiStructLayoutPackingField =
-            index.getMember('dart:ffi', '_FfiStructLayout', 'packing'),
+            index.getField('dart:ffi', '_FfiStructLayout', 'packing'),
         ffiInlineArrayClass = index.getClass('dart:ffi', '_FfiInlineArray'),
         ffiInlineArrayElementTypeField =
-            index.getMember('dart:ffi', '_FfiInlineArray', 'elementType'),
+            index.getField('dart:ffi', '_FfiInlineArray', 'elementType'),
         ffiInlineArrayLengthField =
-            index.getMember('dart:ffi', '_FfiInlineArray', 'length'),
+            index.getField('dart:ffi', '_FfiInlineArray', 'length'),
         packedClass = index.getClass('dart:ffi', 'Packed'),
         packedMemberAlignmentField =
-            index.getMember('dart:ffi', 'Packed', 'memberAlignment'),
-        allocateMethod = index.getMember('dart:ffi', 'AllocatorAlloc', 'call'),
+            index.getField('dart:ffi', 'Packed', 'memberAlignment'),
+        allocateMethod =
+            index.getProcedure('dart:ffi', 'AllocatorAlloc', 'call'),
         allocatorAllocateMethod =
-            index.getMember('dart:ffi', 'Allocator', 'allocate'),
-        castMethod = index.getMember('dart:ffi', 'Pointer', 'cast'),
-        offsetByMethod = index.getMember('dart:ffi', 'Pointer', '_offsetBy'),
-        elementAtMethod = index.getMember('dart:ffi', 'Pointer', 'elementAt'),
-        addressGetter = index.getMember('dart:ffi', 'Pointer', 'get:address'),
+            index.getProcedure('dart:ffi', 'Allocator', 'allocate'),
+        castMethod = index.getProcedure('dart:ffi', 'Pointer', 'cast'),
+        offsetByMethod = index.getProcedure('dart:ffi', 'Pointer', '_offsetBy'),
+        elementAtMethod =
+            index.getProcedure('dart:ffi', 'Pointer', 'elementAt'),
+        addressGetter =
+            index.getProcedure('dart:ffi', 'Pointer', 'get:address'),
         compoundTypedDataBaseField =
-            index.getMember('dart:ffi', '_Compound', '_typedDataBase'),
+            index.getField('dart:ffi', '_Compound', '_typedDataBase'),
         arrayTypedDataBaseField =
-            index.getMember('dart:ffi', 'Array', '_typedDataBase'),
-        arraySizeField = index.getMember('dart:ffi', 'Array', '_size'),
+            index.getField('dart:ffi', 'Array', '_typedDataBase'),
+        arraySizeField = index.getField('dart:ffi', 'Array', '_size'),
         arrayNestedDimensionsField =
-            index.getMember('dart:ffi', 'Array', '_nestedDimensions'),
-        arrayCheckIndex = index.getMember('dart:ffi', 'Array', '_checkIndex'),
+            index.getField('dart:ffi', 'Array', '_nestedDimensions'),
+        arrayCheckIndex =
+            index.getProcedure('dart:ffi', 'Array', '_checkIndex'),
         arrayNestedDimensionsFlattened =
-            index.getMember('dart:ffi', 'Array', '_nestedDimensionsFlattened'),
+            index.getField('dart:ffi', 'Array', '_nestedDimensionsFlattened'),
         arrayNestedDimensionsFirst =
-            index.getMember('dart:ffi', 'Array', '_nestedDimensionsFirst'),
+            index.getField('dart:ffi', 'Array', '_nestedDimensionsFirst'),
         arrayNestedDimensionsRest =
-            index.getMember('dart:ffi', 'Array', '_nestedDimensionsRest'),
+            index.getField('dart:ffi', 'Array', '_nestedDimensionsRest'),
         structFromTypedDataBase =
-            index.getMember('dart:ffi', 'Struct', '_fromTypedDataBase'),
+            index.getConstructor('dart:ffi', 'Struct', '_fromTypedDataBase'),
         unionFromTypedDataBase =
-            index.getMember('dart:ffi', 'Union', '_fromTypedDataBase'),
-        arrayConstructor = index.getMember('dart:ffi', 'Array', '_'),
+            index.getConstructor('dart:ffi', 'Union', '_fromTypedDataBase'),
+        arrayConstructor = index.getConstructor('dart:ffi', 'Array', '_'),
         fromAddressInternal =
-            index.getTopLevelMember('dart:ffi', '_fromAddress'),
+            index.getTopLevelProcedure('dart:ffi', '_fromAddress'),
         structPointerRef =
-            index.getMember('dart:ffi', 'StructPointer', 'get:ref'),
+            index.getProcedure('dart:ffi', 'StructPointer', 'get:ref'),
         structPointerElemAt =
-            index.getMember('dart:ffi', 'StructPointer', '[]'),
+            index.getProcedure('dart:ffi', 'StructPointer', '[]'),
         unionPointerRef =
-            index.getMember('dart:ffi', 'UnionPointer', 'get:ref'),
-        unionPointerElemAt = index.getMember('dart:ffi', 'UnionPointer', '[]'),
-        structArrayElemAt = index.getMember('dart:ffi', 'StructArray', '[]'),
-        unionArrayElemAt = index.getMember('dart:ffi', 'UnionArray', '[]'),
-        arrayArrayElemAt = index.getMember('dart:ffi', 'ArrayArray', '[]'),
-        arrayArrayAssignAt = index.getMember('dart:ffi', 'ArrayArray', '[]='),
-        asFunctionMethod =
-            index.getMember('dart:ffi', 'NativeFunctionPointer', 'asFunction'),
+            index.getProcedure('dart:ffi', 'UnionPointer', 'get:ref'),
+        unionPointerElemAt =
+            index.getProcedure('dart:ffi', 'UnionPointer', '[]'),
+        structArrayElemAt = index.getProcedure('dart:ffi', 'StructArray', '[]'),
+        unionArrayElemAt = index.getProcedure('dart:ffi', 'UnionArray', '[]'),
+        arrayArrayElemAt = index.getProcedure('dart:ffi', 'ArrayArray', '[]'),
+        arrayArrayAssignAt =
+            index.getProcedure('dart:ffi', 'ArrayArray', '[]='),
+        asFunctionMethod = index.getProcedure(
+            'dart:ffi', 'NativeFunctionPointer', 'asFunction'),
         asFunctionInternal =
-            index.getTopLevelMember('dart:ffi', '_asFunctionInternal'),
-        sizeOfMethod = index.getTopLevelMember('dart:ffi', 'sizeOf'),
-        lookupFunctionMethod = index.getMember(
+            index.getTopLevelProcedure('dart:ffi', '_asFunctionInternal'),
+        sizeOfMethod = index.getTopLevelProcedure('dart:ffi', 'sizeOf'),
+        lookupFunctionMethod = index.getProcedure(
             'dart:ffi', 'DynamicLibraryExtension', 'lookupFunction'),
         fromFunctionMethod =
-            index.getMember('dart:ffi', 'Pointer', 'fromFunction'),
+            index.getProcedure('dart:ffi', 'Pointer', 'fromFunction'),
         libraryLookupMethod =
-            index.getMember('dart:ffi', 'DynamicLibrary', 'lookup'),
-        abiMethod = index.getTopLevelMember('dart:ffi', '_abi'),
+            index.getProcedure('dart:ffi', 'DynamicLibrary', 'lookup'),
+        abiMethod = index.getTopLevelProcedure('dart:ffi', '_abi'),
         pointerFromFunctionProcedure =
-            index.getTopLevelMember('dart:ffi', '_pointerFromFunction'),
+            index.getTopLevelProcedure('dart:ffi', '_pointerFromFunction'),
         nativeCallbackFunctionProcedure =
-            index.getTopLevelMember('dart:ffi', '_nativeCallbackFunction'),
+            index.getTopLevelProcedure('dart:ffi', '_nativeCallbackFunction'),
         nativeTypesClasses = nativeTypeClassNames
             .map((name) => index.getClass('dart:ffi', name))
             .toList(),
         loadMethods = Map.fromIterable(optimizedTypes, value: (t) {
           final name = nativeTypeClassNames[t.index];
-          return index.getTopLevelMember('dart:ffi', "_load$name");
+          return index.getTopLevelProcedure('dart:ffi', "_load$name");
         }),
         loadUnalignedMethods =
             Map.fromIterable(unalignedLoadsStores, value: (t) {
           final name = nativeTypeClassNames[t.index];
-          return index.getTopLevelMember('dart:ffi', "_load${name}Unaligned");
+          return index.getTopLevelProcedure(
+              'dart:ffi', "_load${name}Unaligned");
         }),
         storeMethods = Map.fromIterable(optimizedTypes, value: (t) {
           final name = nativeTypeClassNames[t.index];
-          return index.getTopLevelMember('dart:ffi', "_store$name");
+          return index.getTopLevelProcedure('dart:ffi', "_store$name");
         }),
         storeUnalignedMethods =
             Map.fromIterable(unalignedLoadsStores, value: (t) {
           final name = nativeTypeClassNames[t.index];
-          return index.getTopLevelMember('dart:ffi', "_store${name}Unaligned");
+          return index.getTopLevelProcedure(
+              'dart:ffi', "_store${name}Unaligned");
         }),
         elementAtMethods = Map.fromIterable(optimizedTypes, value: (t) {
           final name = nativeTypeClassNames[t.index];
-          return index.getTopLevelMember('dart:ffi', "_elementAt$name");
+          return index.getTopLevelProcedure('dart:ffi', "_elementAt$name");
         }),
-        memCopy = index.getTopLevelMember('dart:ffi', '_memCopy'),
-        allocationTearoff = index.getMember(
+        memCopy = index.getTopLevelProcedure('dart:ffi', '_memCopy'),
+        allocationTearoff = index.getProcedure(
             'dart:ffi', 'AllocatorAlloc', LibraryIndex.tearoffPrefix + 'call'),
-        asFunctionTearoff = index.getMember('dart:ffi', 'NativeFunctionPointer',
-            LibraryIndex.tearoffPrefix + 'asFunction'),
-        lookupFunctionTearoff = index.getMember(
+        asFunctionTearoff = index.getProcedure('dart:ffi',
+            'NativeFunctionPointer', LibraryIndex.tearoffPrefix + 'asFunction'),
+        lookupFunctionTearoff = index.getProcedure(
             'dart:ffi',
             'DynamicLibraryExtension',
             LibraryIndex.tearoffPrefix + 'lookupFunction');
@@ -472,7 +484,7 @@
   /// [Handle]                             -> [Object]
   /// [NativeFunction]<T1 Function(T2, T3) -> S1 Function(S2, S3)
   ///    where DartRepresentationOf(Tn) -> Sn
-  DartType convertNativeTypeToDartType(DartType nativeType,
+  DartType? convertNativeTypeToDartType(DartType nativeType,
       {bool allowCompounds = false,
       bool allowHandle = false,
       bool allowInlineArray = false}) {
@@ -481,7 +493,7 @@
     }
     final InterfaceType native = nativeType;
     final Class nativeClass = native.classNode;
-    final NativeType nativeType_ = getType(nativeClass);
+    final NativeType? nativeType_ = getType(nativeClass);
 
     if (nativeClass == arrayClass) {
       if (!allowInlineArray) {
@@ -519,27 +531,29 @@
       return null;
     }
 
-    final FunctionType fun = native.typeArguments[0];
+    final FunctionType fun = native.typeArguments[0] as FunctionType;
     if (fun.namedParameters.isNotEmpty) return null;
     if (fun.positionalParameters.length != fun.requiredParameterCount) {
       return null;
     }
     if (fun.typeParameters.length != 0) return null;
 
-    final DartType returnType = convertNativeTypeToDartType(fun.returnType,
+    final DartType? returnType = convertNativeTypeToDartType(fun.returnType,
         allowCompounds: true, allowHandle: true);
     if (returnType == null) return null;
     final List<DartType> argumentTypes = fun.positionalParameters
-        .map((t) => convertNativeTypeToDartType(t,
-            allowCompounds: true, allowHandle: true))
+        .map((t) =>
+            convertNativeTypeToDartType(t,
+                allowCompounds: true, allowHandle: true) ??
+            dummyDartType)
         .toList();
-    if (argumentTypes.contains(null)) return null;
+    if (argumentTypes.contains(dummyDartType)) return null;
     return FunctionType(argumentTypes, returnType, Nullability.legacy);
   }
 
   /// The [NativeType] corresponding to [c]. Returns `null` for user-defined
   /// structs.
-  NativeType getType(Class c) {
+  NativeType? getType(Class c) {
     final int index = nativeTypesClasses.indexOf(c);
     if (index == -1) {
       return null;
@@ -559,9 +573,9 @@
   Expression runtimeBranchOnLayout(Map<Abi, int> values) {
     return MethodInvocation(
         intListConstantExpression([
-          values[Abi.wordSize64],
-          values[Abi.wordSize32Align32],
-          values[Abi.wordSize32Align64]
+          values[Abi.wordSize64]!,
+          values[Abi.wordSize32Align32]!,
+          values[Abi.wordSize32Align64]!
         ]),
         Name("[]"),
         Arguments([StaticInvocation(abiMethod, Arguments([]))]),
diff --git a/pkg/vm/lib/transformations/late_var_init_transformer.dart b/pkg/vm/lib/transformations/late_var_init_transformer.dart
index 4acb7e4..88d8a25 100644
--- a/pkg/vm/lib/transformations/late_var_init_transformer.dart
+++ b/pkg/vm/lib/transformations/late_var_init_transformer.dart
@@ -2,6 +2,8 @@
 // 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.12
+
 import 'package:kernel/ast.dart';
 
 /// Wraps the initializers of late local variables in closures.
@@ -18,7 +20,7 @@
 
       // Variables with no initializer or a trivial initializer are ignored.
       if (s.initializer == null) return false;
-      final Expression init = s.initializer;
+      final Expression? init = s.initializer;
       if (init is StringLiteral) return false;
       if (init is BoolLiteral) return false;
       if (init is IntLiteral) return false;
@@ -47,12 +49,13 @@
     return [fn, node];
   }
 
-  List<Statement> _transformStatements(List<Statement> statements) {
+  List<Statement>? _transformStatements(List<Statement> statements) {
     if (!statements.any((s) => _shouldApplyTransform(s))) return null;
     final List<Statement> newStatements = <Statement>[];
     for (Statement s in statements) {
       if (_shouldApplyTransform(s)) {
-        newStatements.addAll(_transformVariableDeclaration(s));
+        newStatements
+            .addAll(_transformVariableDeclaration(s as VariableDeclaration));
       } else {
         newStatements.add(s);
       }
diff --git a/pkg/vm/lib/transformations/specializer/factory_specializer.dart b/pkg/vm/lib/transformations/specializer/factory_specializer.dart
index 02a3cfe..7475638 100644
--- a/pkg/vm/lib/transformations/specializer/factory_specializer.dart
+++ b/pkg/vm/lib/transformations/specializer/factory_specializer.dart
@@ -2,6 +2,8 @@
 // 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.12
+
 library vm.transformations.specializer.factory_specializer;
 
 import 'package:kernel/kernel.dart';
@@ -33,6 +35,7 @@
 
   TreeNode transformStaticInvocation(StaticInvocation invocation) {
     final target = invocation.target;
+    // ignore: unnecessary_null_comparison
     if (target == null) {
       return invocation;
     }
diff --git a/pkg/vm/lib/transformations/specializer/list_factory_specializer.dart b/pkg/vm/lib/transformations/specializer/list_factory_specializer.dart
index 672d618..248c192 100644
--- a/pkg/vm/lib/transformations/specializer/list_factory_specializer.dart
+++ b/pkg/vm/lib/transformations/specializer/list_factory_specializer.dart
@@ -2,6 +2,8 @@
 // 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.12
+
 library vm.transformations.specializer.list_factory_specializer;
 
 import 'package:kernel/ast.dart';
@@ -39,28 +41,29 @@
 
   ListFactorySpecializer(CoreTypes coreTypes)
       : _defaultListFactory =
-            coreTypes.index.getMember('dart:core', 'List', ''),
+            coreTypes.index.getProcedure('dart:core', 'List', ''),
         _listEmptyFactory =
-            coreTypes.index.getMember('dart:core', 'List', 'empty'),
+            coreTypes.index.getProcedure('dart:core', 'List', 'empty'),
         _listFilledFactory =
-            coreTypes.index.getMember('dart:core', 'List', 'filled'),
+            coreTypes.index.getProcedure('dart:core', 'List', 'filled'),
         _listGenerateFactory =
-            coreTypes.index.getMember('dart:core', 'List', 'generate'),
+            coreTypes.index.getProcedure('dart:core', 'List', 'generate'),
         _growableListFactory =
-            coreTypes.index.getMember('dart:core', '_GrowableList', ''),
+            coreTypes.index.getProcedure('dart:core', '_GrowableList', ''),
         _growableListEmptyFactory =
-            coreTypes.index.getMember('dart:core', '_GrowableList', 'empty'),
-        _growableListFilledFactory =
-            coreTypes.index.getMember('dart:core', '_GrowableList', 'filled'),
-        _growableListGenerateFactory =
-            coreTypes.index.getMember('dart:core', '_GrowableList', 'generate'),
-        _fixedListFactory = coreTypes.index.getMember('dart:core', '_List', ''),
+            coreTypes.index.getProcedure('dart:core', '_GrowableList', 'empty'),
+        _growableListFilledFactory = coreTypes.index
+            .getProcedure('dart:core', '_GrowableList', 'filled'),
+        _growableListGenerateFactory = coreTypes.index
+            .getProcedure('dart:core', '_GrowableList', 'generate'),
+        _fixedListFactory =
+            coreTypes.index.getProcedure('dart:core', '_List', ''),
         _fixedListEmptyFactory =
-            coreTypes.index.getMember('dart:core', '_List', 'empty'),
+            coreTypes.index.getProcedure('dart:core', '_List', 'empty'),
         _fixedListFilledFactory =
-            coreTypes.index.getMember('dart:core', '_List', 'filled'),
+            coreTypes.index.getProcedure('dart:core', '_List', 'filled'),
         _fixedListGenerateFactory =
-            coreTypes.index.getMember('dart:core', '_List', 'generate') {
+            coreTypes.index.getProcedure('dart:core', '_List', 'generate') {
     assert(_defaultListFactory.isFactory);
     assert(_listEmptyFactory.isFactory);
     assert(_listFilledFactory.isFactory);
@@ -96,7 +99,8 @@
   TreeNode transformListEmptyFactory(StaticInvocation node) {
     final args = node.arguments;
     assert(args.positional.length == 0);
-    final bool growable = _getConstantOptionalArgument(args, 'growable', false);
+    final bool? growable =
+        _getConstantOptionalArgument(args, 'growable', false);
     if (growable == null) {
       return node;
     }
@@ -118,7 +122,8 @@
     final fill = args.positional[1];
     final fillingWithNull = fill is NullLiteral ||
         (fill is ConstantExpression && fill.constant is NullConstant);
-    final bool growable = _getConstantOptionalArgument(args, 'growable', false);
+    final bool? growable =
+        _getConstantOptionalArgument(args, 'growable', false);
     if (growable == null) {
       return node;
     }
@@ -150,7 +155,7 @@
     assert(args.positional.length == 2);
     final length = args.positional[0];
     final generator = args.positional[1];
-    final bool growable = _getConstantOptionalArgument(args, 'growable', true);
+    final bool? growable = _getConstantOptionalArgument(args, 'growable', true);
     if (growable == null) {
       return node;
     }
@@ -168,7 +173,7 @@
   /// Returns constant value of the only optional argument in [args],
   /// or null if it is not a constant. Returns [defaultValue] if optional
   /// argument is not passed. Argument is asserted to have the given [name].
-  bool /*?*/ _getConstantOptionalArgument(
+  bool? _getConstantOptionalArgument(
       Arguments args, String name, bool defaultValue) {
     if (args.named.isEmpty) {
       return defaultValue;
diff --git a/pkg/vm/lib/transformations/specializer/map_factory_specializer.dart b/pkg/vm/lib/transformations/specializer/map_factory_specializer.dart
index 5779807..8a01984 100644
--- a/pkg/vm/lib/transformations/specializer/map_factory_specializer.dart
+++ b/pkg/vm/lib/transformations/specializer/map_factory_specializer.dart
@@ -2,6 +2,8 @@
 // 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.12
+
 library vm.transformations.specializer.map_factory_specializer;
 
 import 'package:kernel/ast.dart';
@@ -19,14 +21,14 @@
 
   MapFactorySpecializer(CoreTypes coreTypes)
       : _linkedHashMapDefaultFactory = assertNotNull(
-          coreTypes.index.getMember(
+          coreTypes.index.getProcedure(
             'dart:collection',
             'LinkedHashMap',
             '',
           ),
         ),
         _internalLinkedHashMapConstructor = assertNotNull(
-          coreTypes.index.getMember(
+          coreTypes.index.getConstructor(
             'dart:collection',
             '_InternalLinkedHashMap',
             '',
diff --git a/pkg/vm/lib/transformations/specializer/set_factory_specializer.dart b/pkg/vm/lib/transformations/specializer/set_factory_specializer.dart
index 0e6a855..a508435 100644
--- a/pkg/vm/lib/transformations/specializer/set_factory_specializer.dart
+++ b/pkg/vm/lib/transformations/specializer/set_factory_specializer.dart
@@ -2,6 +2,8 @@
 // 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.12
+
 library vm.transformations.specializer.set_factory_specializer;
 
 import 'package:kernel/ast.dart';
@@ -19,14 +21,14 @@
 
   SetFactorySpecializer(CoreTypes coreTypes)
       : _linkedHashSetDefaultFactory = assertNotNull(
-          coreTypes.index.getMember(
+          coreTypes.index.getProcedure(
             'dart:collection',
             'LinkedHashSet',
             '',
           ),
         ),
         _compactLinkedHashSetConstructor = assertNotNull(
-          coreTypes.index.getMember(
+          coreTypes.index.getConstructor(
             'dart:collection',
             '_CompactLinkedHashSet',
             '',