diff --git a/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart b/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
index 4baea51..68ad3ab 100644
--- a/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
@@ -637,11 +637,11 @@
 
 typedef Future<Map<String, TestResult<T>>> RunTestFunction<T>(TestData testData,
     {required bool testAfterFailures,
-    bool verbose,
-    bool succinct,
-    bool printCode,
+    required bool verbose,
+    required bool succinct,
+    required bool printCode,
     Map<String, List<String>>? skipMap,
-    Uri nullUri});
+    required Uri nullUri});
 
 /// Compute the file: URI of the file located at `path`, where `path` is
 /// relative to the root of the SDK repository.
diff --git a/pkg/front_end/lib/src/api_prototype/compiler_options.dart b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
index 69ba280..370f581 100644
--- a/pkg/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
@@ -364,7 +364,7 @@
 
 /// Parse experimental flag arguments of the form 'flag' or 'no-flag' into a map
 /// from 'flag' to `true` or `false`, respectively.
-Map<String, bool> parseExperimentalArguments(List<String>? arguments) {
+Map<String, bool> parseExperimentalArguments(Iterable<String>? arguments) {
   Map<String, bool> result = {};
   if (arguments != null) {
     for (String argument in arguments) {
diff --git a/pkg/front_end/lib/src/api_prototype/constant_evaluator.dart b/pkg/front_end/lib/src/api_prototype/constant_evaluator.dart
index 5427e63..98dd0ab 100644
--- a/pkg/front_end/lib/src/api_prototype/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/api_prototype/constant_evaluator.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.9
-
 library front_end.constant_evaluator;
 
 export '../fasta/kernel/constant_evaluator.dart'
diff --git a/pkg/front_end/lib/src/api_prototype/file_system.dart b/pkg/front_end/lib/src/api_prototype/file_system.dart
index e4195c5..4d90308 100644
--- a/pkg/front_end/lib/src/api_prototype/file_system.dart
+++ b/pkg/front_end/lib/src/api_prototype/file_system.dart
@@ -104,3 +104,12 @@
   @override
   String toString() => 'FileSystemException(uri=$uri; message=$message)';
 }
+
+class NullFileSystem implements FileSystem {
+  const NullFileSystem();
+
+  @override
+  FileSystemEntity entityForUri(Uri uri) {
+    throw new UnsupportedError('$runtimeType.entityForUri');
+  }
+}
diff --git a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
index 1e2a446..12614bb 100644
--- a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.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.9
-
 import 'package:_fe_analyzer_shared/src/scanner/string_scanner.dart'
     show StringScanner;
 
@@ -28,9 +26,9 @@
 
 abstract class IncrementalKernelGenerator {
   factory IncrementalKernelGenerator(CompilerOptions options, Uri entryPoint,
-      [Uri initializeFromDillUri,
-      bool outlineOnly,
-      IncrementalSerializer incrementalSerializer]) {
+      [Uri? initializeFromDillUri,
+      bool? outlineOnly,
+      IncrementalSerializer? incrementalSerializer]) {
     return new IncrementalCompiler(
         new CompilerContext(
             new ProcessedOptions(options: options, inputs: [entryPoint])),
@@ -45,7 +43,7 @@
   /// platform will be loaded.
   factory IncrementalKernelGenerator.fromComponent(
       CompilerOptions options, Uri entryPoint, Component component,
-      [bool outlineOnly, IncrementalSerializer incrementalSerializer]) {
+      [bool? outlineOnly, IncrementalSerializer? incrementalSerializer]) {
     return new IncrementalCompiler.fromComponent(
         new CompilerContext(
             new ProcessedOptions(options: options, inputs: [entryPoint])),
@@ -78,11 +76,11 @@
 
   /// Returns [CoreTypes] used during compilation.
   /// Valid after [computeDelta] is called.
-  CoreTypes getCoreTypes();
+  CoreTypes? getCoreTypes();
 
   /// Returns [ClassHierarchy] used during compilation.
   /// Valid after [computeDelta] is called.
-  ClassHierarchy getClassHierarchy();
+  ClassHierarchy? getClassHierarchy();
 
   /// Remove the file associated with the given file [uri] from the set of
   /// valid files.  This guarantees that those files will be re-read on the
@@ -132,7 +130,7 @@
   /// [compileExpression] will return [null] if the library or class for
   /// [enclosingNode] could not be found. Otherwise, errors are reported in the
   /// normal way.
-  Future<Procedure> compileExpression(
+  Future<Procedure?> compileExpression(
       String expression,
       Map<String, DartType> definitions,
       List<TypeParameter> typeDefinitions,
diff --git a/pkg/front_end/lib/src/api_prototype/language_version.dart b/pkg/front_end/lib/src/api_prototype/language_version.dart
index bc5d353..3aa685b 100644
--- a/pkg/front_end/lib/src/api_prototype/language_version.dart
+++ b/pkg/front_end/lib/src/api_prototype/language_version.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.9
-
 import 'dart:typed_data' show Uint8List;
 
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
@@ -42,13 +40,14 @@
     // Get largest valid version / default version.
     String currentSdkVersion = context.options.currentSdkVersion;
     bool good = false;
-    int currentSdkVersionMajor;
-    int currentSdkVersionMinor;
+    late final int currentSdkVersionMajor;
+    late final int currentSdkVersionMinor;
+    // ignore: unnecessary_null_comparison
     if (currentSdkVersion != null) {
       List<String> dotSeparatedParts = currentSdkVersion.split(".");
       if (dotSeparatedParts.length >= 2) {
-        currentSdkVersionMajor = int.tryParse(dotSeparatedParts[0]);
-        currentSdkVersionMinor = int.tryParse(dotSeparatedParts[1]);
+        currentSdkVersionMajor = int.parse(dotSeparatedParts[0]);
+        currentSdkVersionMinor = int.parse(dotSeparatedParts[1]);
         good = true;
       }
     }
@@ -58,8 +57,8 @@
 
     // Get file uri.
     UriTranslator uriTranslator = await context.options.getUriTranslator();
-    Uri fileUri;
-    Package package;
+    Uri? fileUri;
+    Package? package;
     if (uri.scheme == "package") {
       fileUri = uriTranslator.translate(uri);
       package = uriTranslator.getPackage(uri);
@@ -71,15 +70,16 @@
     if (packageUri.scheme != 'dart' &&
         packageUri.scheme != 'package' &&
         package != null &&
+        // ignore: unnecessary_null_comparison
         package.name != null) {
       packageUri = new Uri(scheme: 'package', path: package.name);
     }
 
     // Check file content for @dart annotation.
-    int major;
-    int minor;
+    int? major;
+    int? minor;
     if (fileUri != null) {
-      List<int> rawBytes;
+      List<int>? rawBytes;
       try {
         FileSystem fileSystem = context.options.fileSystem;
         rawBytes = await fileSystem.entityForUri(fileUri).readAsBytes();
@@ -103,32 +103,34 @@
 
     if (major != null && minor != null) {
       // Verify OK.
-      if (major > currentSdkVersionMajor ||
-          (major == currentSdkVersionMajor && minor > currentSdkVersionMinor)) {
+      if (major! > currentSdkVersionMajor ||
+          (major == currentSdkVersionMajor &&
+              minor! > currentSdkVersionMinor)) {
         major = null;
         minor = null;
       }
     }
     if (major != null && minor != null) {
       // The file decided. Return result.
-      return new VersionAndPackageUri(new Version(major, minor), packageUri);
+      return new VersionAndPackageUri(new Version(major!, minor!), packageUri);
     }
 
     // Check package.
     if (package != null &&
         package.languageVersion != null &&
         package.languageVersion is! InvalidLanguageVersion) {
-      major = package.languageVersion.major;
-      minor = package.languageVersion.minor;
-      if (major > currentSdkVersionMajor ||
-          (major == currentSdkVersionMajor && minor > currentSdkVersionMinor)) {
+      major = package.languageVersion!.major;
+      minor = package.languageVersion!.minor;
+      if (major! > currentSdkVersionMajor ||
+          (major == currentSdkVersionMajor &&
+              minor! > currentSdkVersionMinor)) {
         major = null;
         minor = null;
       }
     }
     if (major != null && minor != null) {
       // The package decided. Return result.
-      return new VersionAndPackageUri(new Version(major, minor), packageUri);
+      return new VersionAndPackageUri(new Version(major!, minor!), packageUri);
     }
 
     // Return default.
diff --git a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
index 4d44607..46566f1 100644
--- a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
+++ b/pkg/front_end/lib/src/api_unstable/bazel_worker.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.9
-
 /// API needed by `utils/front_end/summary_worker.dart`, a tool used to compute
 /// summaries in build systems like bazel, pub-build, and package-build.
 
@@ -12,7 +10,7 @@
 
 import 'package:front_end/src/api_prototype/compiler_options.dart';
 
-import 'package:kernel/kernel.dart' show Component, Library;
+import 'package:kernel/kernel.dart' show Component, Library, dummyComponent;
 
 import 'package:kernel/target/targets.dart' show Target;
 
@@ -69,14 +67,14 @@
     Map<Uri, List<int>> workerInputDigests,
     Target target,
     FileSystem fileSystem,
-    Iterable<String> experiments,
+    Iterable<String>? experiments,
     bool outlineOnly,
     Map<String, String> environmentDefines,
     {bool trackNeededDillLibraries: false,
     bool verbose: false,
     NnbdMode nnbdMode: NnbdMode.Weak}) async {
   List<Component> outputLoadedAdditionalDills =
-      new List<Component>.filled(additionalDills.length, null);
+      new List<Component>.filled(additionalDills.length, dummyComponent);
   Map<ExperimentalFlag, bool> experimentalFlags = parseExperimentalFlags(
       parseExperimentalArguments(experiments),
       onError: (e) => throw e);
@@ -139,7 +137,7 @@
 
 Future<CompilerResult> _compile(InitializedCompilerState compilerState,
     List<Uri> inputs, DiagnosticMessageHandler diagnosticMessageHandler,
-    {bool summaryOnly, bool includeOffsets: true}) {
+    {bool? summaryOnly, bool includeOffsets: true}) {
   summaryOnly ??= true;
   CompilerOptions options = compilerState.options;
   options..onDiagnostic = diagnosticMessageHandler;
@@ -154,22 +152,22 @@
       includeOffsets: includeOffsets);
 }
 
-Future<List<int>> compileSummary(InitializedCompilerState compilerState,
+Future<List<int>?> compileSummary(InitializedCompilerState compilerState,
     List<Uri> inputs, DiagnosticMessageHandler diagnosticMessageHandler,
     {bool includeOffsets: false}) async {
   CompilerResult result = await _compile(
       compilerState, inputs, diagnosticMessageHandler,
       summaryOnly: true, includeOffsets: includeOffsets);
-  return result?.summary;
+  return result.summary;
 }
 
-Future<Component> compileComponent(InitializedCompilerState compilerState,
+Future<Component?> compileComponent(InitializedCompilerState compilerState,
     List<Uri> inputs, DiagnosticMessageHandler diagnosticMessageHandler) async {
   CompilerResult result = await _compile(
       compilerState, inputs, diagnosticMessageHandler,
       summaryOnly: false);
 
-  Component component = result?.component;
+  Component? component = result.component;
   if (component != null) {
     for (Library lib in component.libraries) {
       if (!inputs.contains(lib.importUri)) {
diff --git a/pkg/front_end/lib/src/api_unstable/compiler_state.dart b/pkg/front_end/lib/src/api_unstable/compiler_state.dart
index 97779f8..bbf4ea9 100644
--- a/pkg/front_end/lib/src/api_unstable/compiler_state.dart
+++ b/pkg/front_end/lib/src/api_unstable/compiler_state.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.9
-
 import '../api_prototype/compiler_options.dart' show CompilerOptions;
 
 import '../base/processed_options.dart' show ProcessedOptions;
@@ -16,14 +14,14 @@
 class InitializedCompilerState {
   final CompilerOptions options;
   final ProcessedOptions processedOpts;
-  final Map<Uri, WorkerInputComponent> workerInputCache;
+  final Map<Uri, WorkerInputComponent>? workerInputCache;
 
   /// A map from library import uri to dill uri, i.e. where a library came from,
   /// for all cached libraries.
-  final Map<Uri, Uri> workerInputCacheLibs;
-  final IncrementalCompiler incrementalCompiler;
-  final Set<String> tags;
-  final Map<Uri, Uri> libraryToInputDill;
+  final Map<Uri, Uri>? workerInputCacheLibs;
+  final IncrementalCompiler? incrementalCompiler;
+  final Set<String>? tags;
+  final Map<Uri, Uri>? libraryToInputDill;
 
   InitializedCompilerState(this.options, this.processedOpts,
       {this.workerInputCache,
@@ -43,7 +41,7 @@
   WorkerInputComponent(this.digest, this.component);
 }
 
-bool digestsEqual(List<int> a, List<int> b) {
+bool digestsEqual(List<int>? a, List<int>? b) {
   if (a == null || b == null) return false;
   if (a.length != b.length) return false;
   for (int i = 0; i < a.length; i++) {
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index c9fbb930..d29d1ea 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.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.9
-
 import 'package:_fe_analyzer_shared/src/messages/codes.dart'
     show messageMissingMain;
 
@@ -25,7 +23,7 @@
 
 import '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
 
-import '../api_prototype/file_system.dart' show FileSystem;
+import '../api_prototype/file_system.dart' show FileSystem, NullFileSystem;
 
 import '../api_prototype/kernel_generator.dart' show CompilerResult;
 
@@ -139,14 +137,14 @@
 }
 
 InitializedCompilerState initializeCompiler(
-    InitializedCompilerState oldState,
+    InitializedCompilerState? oldState,
     Target target,
     Uri librariesSpecificationUri,
     List<Uri> additionalDills,
     Uri packagesFileUri,
-    {Map<ExperimentalFlag, bool> explicitExperimentalFlags,
+    {required Map<ExperimentalFlag, bool> explicitExperimentalFlags,
     bool verify: false,
-    NnbdMode nnbdMode,
+    NnbdMode? nnbdMode,
     Set<InvocationMode> invocationModes: const <InvocationMode>{},
     Verbosity verbosity: Verbosity.all}) {
   additionalDills.sort((a, b) => a.toString().compareTo(b.toString()));
@@ -183,7 +181,7 @@
   return new InitializedCompilerState(options, processedOpts);
 }
 
-Future<Component> compile(
+Future<Component?> compile(
     InitializedCompilerState state,
     bool verbose,
     FileSystem fileSystem,
@@ -200,10 +198,10 @@
   processedOpts.inputs.add(input);
   processedOpts.clearFileSystemCache();
 
-  CompilerResult compilerResult = await CompilerContext.runWithOptions(
+  CompilerResult? compilerResult = await CompilerContext.runWithOptions(
       processedOpts, (CompilerContext context) async {
     CompilerResult compilerResult = await generateKernelInternal();
-    Component component = compilerResult?.component;
+    Component? component = compilerResult.component;
     if (component == null) return null;
     if (component.mainMethod == null) {
       context.options.report(
@@ -216,7 +214,7 @@
   // Remove these parameters from [options] - they are no longer needed and
   // retain state from the previous compile. (http://dartbug.com/33708)
   options.onDiagnostic = null;
-  options.fileSystem = null;
+  options.fileSystem = const NullFileSystem();
   return compilerResult?.component;
 }
 
@@ -246,7 +244,7 @@
 // is implemented correctly for patch files (Issue #33495).
 bool isRedirectingFactory(ir.Procedure member) {
   if (member.kind == ir.ProcedureKind.Factory) {
-    Statement body = member.function.body;
+    Statement? body = member.function.body;
     if (body is redirecting.RedirectingFactoryBody) return true;
     if (body is ir.ExpressionStatement) {
       ir.Expression expression = body.expression;
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index c3de146..d59fef2 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.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.9
-
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show DiagnosticMessageHandler;
 
@@ -77,12 +75,13 @@
 
 class DdcResult {
   final Component component;
-  final Component sdkSummary;
+  final Component? sdkSummary;
   final List<Component> additionalDills;
   final ClassHierarchy classHierarchy;
 
   DdcResult(this.component, this.sdkSummary, this.additionalDills,
       this.classHierarchy)
+      // ignore: unnecessary_null_comparison
       : assert(classHierarchy != null);
 
   Set<Library> computeLibrariesFromDill() {
@@ -94,7 +93,7 @@
       }
     }
     if (sdkSummary != null) {
-      for (Library lib in sdkSummary.libraries) {
+      for (Library lib in sdkSummary!.libraries) {
         librariesFromDill.add(lib);
       }
     }
@@ -104,7 +103,7 @@
 }
 
 Future<InitializedCompilerState> initializeCompiler(
-    InitializedCompilerState oldState,
+    InitializedCompilerState? oldState,
     bool compileSdk,
     Uri sdkRoot,
     Uri sdkSummary,
@@ -112,10 +111,11 @@
     Uri librariesSpecificationUri,
     List<Uri> additionalDills,
     Target target,
-    {FileSystem fileSystem,
-    Map<ExperimentalFlag, bool> explicitExperimentalFlags,
-    Map<String, String> environmentDefines,
-    NnbdMode nnbdMode}) async {
+    {FileSystem? fileSystem,
+    Map<ExperimentalFlag, bool>? explicitExperimentalFlags,
+    Map<String, String>? environmentDefines,
+    required NnbdMode nnbdMode}) async {
+  // ignore: unnecessary_null_comparison
   assert(nnbdMode != null, "No NnbdMode provided.");
   additionalDills.sort((a, b) => a.toString().compareTo(b.toString()));
 
@@ -169,11 +169,11 @@
     List<Uri> additionalDills,
     Map<Uri, List<int>> workerInputDigests,
     Target target,
-    {FileSystem fileSystem,
-    Map<ExperimentalFlag, bool> explicitExperimentalFlags,
-    Map<String, String> environmentDefines,
+    {FileSystem? fileSystem,
+    required Map<ExperimentalFlag, bool> explicitExperimentalFlags,
+    required Map<String, String> environmentDefines,
     bool trackNeededDillLibraries: false,
-    NnbdMode nnbdMode}) async {
+    required NnbdMode nnbdMode}) async {
   return modular.initializeIncrementalCompiler(
       oldState,
       tags,
@@ -188,15 +188,14 @@
       sdkRoot: sdkRoot,
       fileSystem: fileSystem ?? StandardFileSystem.instance,
       explicitExperimentalFlags: explicitExperimentalFlags,
-      environmentDefines:
-          environmentDefines ?? const <ExperimentalFlag, bool>{},
+      environmentDefines: environmentDefines,
       outlineOnly: false,
       omitPlatform: false,
       trackNeededDillLibraries: trackNeededDillLibraries,
       nnbdMode: nnbdMode);
 }
 
-Future<DdcResult> compile(InitializedCompilerState compilerState,
+Future<DdcResult?> compile(InitializedCompilerState compilerState,
     List<Uri> inputs, DiagnosticMessageHandler diagnosticMessageHandler) async {
   CompilerOptions options = compilerState.options;
   options..onDiagnostic = diagnosticMessageHandler;
@@ -208,12 +207,12 @@
   CompilerResult compilerResult =
       await generateKernel(processedOpts, includeHierarchyAndCoreTypes: true);
 
-  Component component = compilerResult?.component;
+  Component? component = compilerResult.component;
   if (component == null) return null;
 
   // These should be cached.
-  Component sdkSummary = await processedOpts.loadSdkSummary(null);
+  Component? sdkSummary = await processedOpts.loadSdkSummary(null);
   List<Component> summaries = await processedOpts.loadAdditionalDills(null);
   return new DdcResult(
-      component, sdkSummary, summaries, compilerResult.classHierarchy);
+      component, sdkSummary, summaries, compilerResult.classHierarchy!);
 }
diff --git a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
index 7086aad..65eceae 100644
--- a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
+++ b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.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.9
-
 import 'package:kernel/kernel.dart' show Component, CanonicalName, Library;
 
 import 'package:kernel/target/targets.dart' show Target;
@@ -39,7 +37,7 @@
 ///   [outputLoadedAdditionalDills] after this call corresponds to the component
 ///   loaded from the `i`-th entry in [additionalDills].
 Future<InitializedCompilerState> initializeIncrementalCompiler(
-    InitializedCompilerState oldState,
+    InitializedCompilerState? oldState,
     Set<String> tags,
     List<Component> outputLoadedAdditionalDills,
     Uri sdkSummary,
@@ -49,11 +47,11 @@
     Map<Uri, List<int>> workerInputDigests,
     Target target,
     {bool compileSdk: false,
-    Uri sdkRoot: null,
-    FileSystem fileSystem,
-    Map<ExperimentalFlag, bool> explicitExperimentalFlags,
+    Uri? sdkRoot: null,
+    required FileSystem fileSystem,
+    required Map<ExperimentalFlag, bool> explicitExperimentalFlags,
     Map<String, String> environmentDefines: const {},
-    bool outlineOnly,
+    bool? outlineOnly,
     bool omitPlatform: false,
     bool trackNeededDillLibraries: false,
     bool verbose: false,
@@ -61,7 +59,7 @@
   bool isRetry = false;
   while (true) {
     try {
-      final List<int> sdkDigest = workerInputDigests[sdkSummary];
+      final List<int>? sdkDigest = workerInputDigests[sdkSummary];
       if (sdkDigest == null) {
         throw new StateError("Expected to get digest for $sdkSummary");
       }
@@ -71,7 +69,7 @@
       Map<Uri, Uri> workerInputCacheLibs =
           oldState?.workerInputCacheLibs ?? new Map<Uri, Uri>();
 
-      WorkerInputComponent cachedSdkInput = workerInputCache[sdkSummary];
+      WorkerInputComponent? cachedSdkInput = workerInputCache[sdkSummary];
 
       IncrementalCompiler incrementalCompiler;
       CompilerOptions options;
@@ -80,7 +78,7 @@
       if (oldState == null ||
           oldState.incrementalCompiler == null ||
           oldState.options.compileSdk != compileSdk ||
-          oldState.incrementalCompiler.outlineOnly != outlineOnly ||
+          oldState.incrementalCompiler!.outlineOnly != outlineOnly ||
           oldState.options.nnbdMode != nnbdMode ||
           !equalMaps(oldState.options.explicitExperimentalFlags,
               explicitExperimentalFlags) ||
@@ -110,7 +108,7 @@
 
         processedOpts = new ProcessedOptions(options: options);
         cachedSdkInput = new WorkerInputComponent(
-            sdkDigest, await processedOpts.loadSdkSummary(null));
+            sdkDigest, (await processedOpts.loadSdkSummary(null))!);
         workerInputCache[sdkSummary] = cachedSdkInput;
         for (Library lib in cachedSdkInput.component.libraries) {
           if (workerInputCacheLibs.containsKey(lib.importUri)) {
@@ -144,7 +142,7 @@
         }
 
         // Reuse the incremental compiler, but reset as needed.
-        incrementalCompiler = oldState.incrementalCompiler;
+        incrementalCompiler = oldState.incrementalCompiler!;
         incrementalCompiler.invalidateAllSources();
         incrementalCompiler.trackNeededDillLibraries = trackNeededDillLibraries;
         options.packagesFileUri = packagesFile;
@@ -154,7 +152,7 @@
 
       // Then read all the input summary components.
       CanonicalName nameRoot = cachedSdkInput.component.root;
-      Map<Uri, Uri> libraryToInputDill;
+      Map<Uri, Uri>? libraryToInputDill;
       if (trackNeededDillLibraries) {
         libraryToInputDill = new Map<Uri, Uri>();
       }
@@ -169,8 +167,8 @@
       for (int i = 0; i < additionalDills.length; i++) {
         Uri summaryUri = additionalDills[i];
         additionalDillsSet.add(summaryUri);
-        WorkerInputComponent cachedInput = workerInputCache[summaryUri];
-        List<int> digest = workerInputDigests[summaryUri];
+        WorkerInputComponent? cachedInput = workerInputCache[summaryUri];
+        List<int>? digest = workerInputDigests[summaryUri];
         if (digest == null) {
           throw new StateError("Expected to get digest for $summaryUri");
         }
@@ -178,7 +176,7 @@
             cachedInput.component.root != nameRoot ||
             !digestsEqual(digest, cachedInput.digest)) {
           // Remove any old libraries from workerInputCacheLibs.
-          Component component = cachedInput?.component;
+          Component? component = cachedInput?.component;
           if (component != null) {
             for (Library lib in component.libraries) {
               workerInputCacheLibs.remove(lib.importUri);
@@ -191,7 +189,7 @@
           Component component = cachedInput.component;
           if (trackNeededDillLibraries) {
             for (Library lib in component.libraries) {
-              libraryToInputDill[lib.importUri] = summaryUri;
+              libraryToInputDill![lib.importUri] = summaryUri;
             }
           }
           component.computeCanonicalNames(); // this isn't needed, is it?
@@ -202,7 +200,7 @@
       for (int i = 0; i < loadFromDillIndexes.length; i++) {
         int index = loadFromDillIndexes[i];
         Uri additionalDillUri = additionalDills[index];
-        List<int> digest = workerInputDigests[additionalDillUri];
+        List<int>? digest = workerInputDigests[additionalDillUri];
         if (digest == null) {
           throw new StateError("Expected to get digest for $additionalDillUri");
         }
@@ -217,7 +215,7 @@
         outputLoadedAdditionalDills[index] = cachedInput.component;
         for (Library lib in cachedInput.component.libraries) {
           if (workerInputCacheLibs.containsKey(lib.importUri)) {
-            Uri fromSummary = workerInputCacheLibs[lib.importUri];
+            Uri fromSummary = workerInputCacheLibs[lib.importUri]!;
             if (additionalDillsSet.contains(fromSummary)) {
               throw new StateError(
                   "Asked to load several summaries that contain the same "
@@ -225,7 +223,7 @@
             } else {
               // Library contained in old cached component. Flush that cache.
               Component component =
-                  workerInputCache.remove(fromSummary).component;
+                  workerInputCache.remove(fromSummary)!.component;
               for (Library lib in component.libraries) {
                 workerInputCacheLibs.remove(lib.importUri);
               }
@@ -235,7 +233,7 @@
           }
 
           if (trackNeededDillLibraries) {
-            libraryToInputDill[lib.importUri] = additionalDillUri;
+            libraryToInputDill![lib.importUri] = additionalDillUri;
           }
         }
       }
diff --git a/pkg/front_end/lib/src/api_unstable/vm.dart b/pkg/front_end/lib/src/api_unstable/vm.dart
index 6506633..35d7c8b 100644
--- a/pkg/front_end/lib/src/api_unstable/vm.dart
+++ b/pkg/front_end/lib/src/api_unstable/vm.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.9
-
 export 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show DiagnosticMessage, DiagnosticMessageHandler, getMessageUri;
 
diff --git a/pkg/front_end/lib/src/base/library_info.dart b/pkg/front_end/lib/src/base/library_info.dart
index a8186f3..ec1153a 100644
--- a/pkg/front_end/lib/src/base/library_info.dart
+++ b/pkg/front_end/lib/src/base/library_info.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.9
-
 /// A bit flag used by [LibraryInfo] indicating that a library is used by
 /// dart2js.
 ///
@@ -19,7 +17,7 @@
 /// Parse a category string in the SDK's "libraries.dart".
 ///
 /// This declaration duplicates the declaration in the SDK's "libraries.dart".
-Category parseCategory(String name) {
+Category? parseCategory(String name) {
   switch (name) {
     case 'Client':
       return Category.client;
@@ -59,11 +57,11 @@
 
   /// Path to the dart2js library's *.dart file relative to the SDK's "lib"
   /// directory, or null if dart2js uses the common library path defined above.
-  final String dart2jsPath;
+  final String? dart2jsPath;
 
   /// Path to the dart2js library's patch file relative to the SDK's "lib"
   /// directory, or null if no dart2js patch file associated with this library.
-  final String dart2jsPatchPath;
+  final String? dart2jsPatchPath;
 
   /// True if this library is documented and should be shown to the user.
   final bool documented;
@@ -98,7 +96,11 @@
   List<Category> get categories {
     // `''.split(',')` returns [''], not [], so we handle that case separately.
     if (_categories.isEmpty) return const <Category>[];
-    return _categories.split(',').map(parseCategory).toList();
+    return _categories
+        .split(',')
+        .map(parseCategory)
+        .whereType<Category>()
+        .toList();
   }
 
   /// The original "categories" String that was passed to the constructor.
@@ -123,25 +125,25 @@
       1,
       "Experimental",
       "This library is experimental and will likely change or be removed\n"
-      "in future versions.");
+          "in future versions.");
   static const Maturity UNSTABLE = const Maturity(
       2,
       "Unstable",
       "This library is in still changing and have not yet endured\n"
-      "sufficient real-world testing.\n"
-      "Backwards-compatibility is NOT guaranteed.");
+          "sufficient real-world testing.\n"
+          "Backwards-compatibility is NOT guaranteed.");
 
   static const Maturity WEB_STABLE = const Maturity(
       3,
       "Web Stable",
       "This library is tracking the DOM evolution as defined by WC3.\n"
-      "Backwards-compatibility is NOT guaranteed.");
+          "Backwards-compatibility is NOT guaranteed.");
 
   static const Maturity STABLE = const Maturity(
       4,
       "Stable",
       "The library is stable. API backwards-compatibility is guaranteed.\n"
-      "However implementation details might change.");
+          "However implementation details might change.");
 
   static const Maturity LOCKED = const Maturity(5, "Locked",
       "This library will not change except when serious bugs are encountered.");
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index a430965c..b3f9998 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -450,7 +450,7 @@
   /// Get the components for each of the underlying `additionalDill`
   /// provided via [CompilerOptions].
   // TODO(sigmund): move, this doesn't feel like an "option".
-  Future<List<Component>> loadAdditionalDills(CanonicalName nameRoot) async {
+  Future<List<Component>> loadAdditionalDills(CanonicalName? nameRoot) async {
     if (_additionalDillComponents == null) {
       List<Uri> uris = _raw.additionalDills;
       // ignore: unnecessary_null_comparison
diff --git a/pkg/front_end/lib/src/fasta/builder_graph.dart b/pkg/front_end/lib/src/fasta/builder_graph.dart
index f6f447a..d874063 100644
--- a/pkg/front_end/lib/src/fasta/builder_graph.dart
+++ b/pkg/front_end/lib/src/fasta/builder_graph.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.9
-
 library fasta.builder_graph;
 
 import 'package:kernel/kernel.dart' show LibraryDependency, LibraryPart;
@@ -30,7 +28,7 @@
   Iterable<Uri> get vertices => builders.keys;
 
   Iterable<Uri> neighborsOf(Uri vertex) sync* {
-    LibraryBuilder library = builders[vertex];
+    LibraryBuilder? library = builders[vertex];
     if (library == null) {
       throw "Library not found: $vertex";
     }
@@ -38,7 +36,7 @@
       for (Import import in library.imports) {
         // 'imported' can be null for fake imports, such as dart-ext:.
         if (import.imported != null) {
-          Uri uri = import.imported.importUri;
+          Uri uri = import.imported!.importUri;
           if (builders.containsKey(uri)) {
             yield uri;
           }
@@ -50,7 +48,7 @@
           yield uri;
         }
       }
-      for (SourceLibraryBuilder part in library.parts) {
+      for (LibraryBuilder part in library.parts) {
         Uri uri = part.importUri;
         if (builders.containsKey(uri)) {
           yield uri;
diff --git a/pkg/front_end/lib/src/fasta/get_dependencies.dart b/pkg/front_end/lib/src/fasta/get_dependencies.dart
index 903c1b0..78504b7 100644
--- a/pkg/front_end/lib/src/fasta/get_dependencies.dart
+++ b/pkg/front_end/lib/src/fasta/get_dependencies.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.9
-
 library fasta.get_dependencies;
 
 import 'package:kernel/kernel.dart' show Component, loadComponentFromBytes;
@@ -25,11 +23,11 @@
 import 'uri_translator.dart' show UriTranslator;
 
 Future<List<Uri>> getDependencies(Uri script,
-    {Uri sdk,
-    Uri packages,
-    Uri platform,
+    {Uri? sdk,
+    Uri? packages,
+    Uri? platform,
     bool verbose: false,
-    Target target}) async {
+    Target? target}) async {
   CompilerOptions options = new CompilerOptions()
     ..target = target
     ..verbose = verbose
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 70fdc54..cb1f2a1 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.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.9
-
 library fasta.incremental_compiler;
 
 import 'dart:async' show Completer;
@@ -137,41 +135,41 @@
   final bool resetTicker;
   final bool outlineOnly;
   bool trackNeededDillLibraries = false;
-  Set<Library> neededDillLibraries;
+  Set<Library>? neededDillLibraries;
 
-  Set<Uri> invalidatedUris = new Set<Uri>();
+  Set<Uri?> invalidatedUris = new Set<Uri?>();
 
-  DillTarget dillLoadedData;
-  List<LibraryBuilder> platformBuilders;
-  Map<Uri, LibraryBuilder> userBuilders;
-  final Uri initializeFromDillUri;
-  Component componentToInitializeFrom;
+  DillTarget? dillLoadedData;
+  List<LibraryBuilder>? platformBuilders;
+  Map<Uri, LibraryBuilder>? userBuilders;
+  final Uri? initializeFromDillUri;
+  Component? componentToInitializeFrom;
   bool initializedFromDill = false;
   bool initializedIncrementalSerializer = false;
-  Uri previousPackagesUri;
-  Map<String, Package> previousPackagesMap;
-  Map<String, Package> currentPackagesMap;
+  Uri? previousPackagesUri;
+  Map<String, Package>? previousPackagesMap;
+  Map<String, Package>? currentPackagesMap;
   bool hasToCheckPackageUris = false;
   final bool initializedForExpressionCompilationOnly;
   bool computeDeltaRunOnce = false;
   Map<Uri, List<DiagnosticMessageFromJson>> remainingComponentProblems =
       new Map<Uri, List<DiagnosticMessageFromJson>>();
-  List<Component> modulesToLoad;
-  IncrementalSerializer incrementalSerializer;
+  List<Component>? modulesToLoad;
+  IncrementalSerializer? incrementalSerializer;
 
   static final Uri debugExprUri =
       new Uri(scheme: "org-dartlang-debug", path: "synthetic_debug_expression");
 
-  IncrementalKernelTarget userCode;
-  Set<Library> previousSourceBuilders;
+  IncrementalKernelTarget? userCode;
+  Set<Library>? previousSourceBuilders;
 
   /// Guard against multiple computeDelta calls at the same time (possibly
   /// caused by lacking awaits etc).
-  Completer<dynamic> currentlyCompiling;
+  Completer<dynamic>? currentlyCompiling;
 
   IncrementalCompiler.fromComponent(
       this.context, this.componentToInitializeFrom,
-      [bool outlineOnly, this.incrementalSerializer])
+      [bool? outlineOnly, this.incrementalSerializer])
       : ticker = context.options.ticker,
         resetTicker = true,
         initializeFromDillUri = null,
@@ -182,7 +180,7 @@
 
   IncrementalCompiler(this.context,
       [this.initializeFromDillUri,
-      bool outlineOnly,
+      bool? outlineOnly,
       this.incrementalSerializer])
       : ticker = context.options.ticker,
         resetTicker = true,
@@ -194,7 +192,7 @@
 
   IncrementalCompiler.forExpressionCompilationOnly(
       this.context, this.componentToInitializeFrom,
-      [bool resetTicker])
+      [bool? resetTicker])
       : ticker = context.options.ticker,
         this.resetTicker = resetTicker ?? true,
         initializeFromDillUri = null,
@@ -204,7 +202,7 @@
     enableExperimentsBasedOnEnvironment();
   }
 
-  void enableExperimentsBasedOnEnvironment({Set<String> enabledExperiments}) {
+  void enableExperimentsBasedOnEnvironment({Set<String>? enabledExperiments}) {
     // Note that these are all experimental. Use at your own risk.
     enabledExperiments ??= getExperimentEnvironment();
     // Currently there's no live experiments.
@@ -217,9 +215,9 @@
 
   @override
   Future<Component> computeDelta(
-      {List<Uri> entryPoints, bool fullComponent: false}) async {
+      {List<Uri>? entryPoints, bool fullComponent: false}) async {
     while (currentlyCompiling != null) {
-      await currentlyCompiling.future;
+      await currentlyCompiling!.future;
     }
     currentlyCompiling = new Completer();
     if (resetTicker) {
@@ -238,41 +236,43 @@
           await ensurePlatformAndInitialize(uriTranslator, c);
 
       // Figure out what to keep and what to throw away.
-      Set<Uri> invalidatedUris = this.invalidatedUris.toSet();
+      Set<Uri?> invalidatedUris = this.invalidatedUris.toSet();
       invalidateNotKeptUserBuilders(invalidatedUris);
-      ReusageResult reusedResult =
-          computeReusedLibraries(invalidatedUris, uriTranslator, entryPoints);
+      ReusageResult? reusedResult =
+          computeReusedLibraries(invalidatedUris, uriTranslator, entryPoints!);
 
       // Use the reused libraries to re-write entry-points.
       if (reusedResult.arePartsUsedAsEntryPoints()) {
-        for (int i = 0; i < entryPoints.length; i++) {
-          Uri entryPoint = entryPoints[i];
-          Uri redirect =
+        for (int i = 0; i < entryPoints!.length; i++) {
+          Uri entryPoint = entryPoints![i];
+          Uri? redirect =
               reusedResult.getLibraryUriForPartUsedAsEntryPoint(entryPoint);
           if (redirect != null) {
-            entryPoints[i] = redirect;
+            entryPoints![i] = redirect;
           }
         }
       }
 
       // Experimental invalidation initialization (e.g. figure out if we can).
-      ExperimentalInvalidation experimentalInvalidation =
+      ExperimentalInvalidation? experimentalInvalidation =
           await initializeExperimentalInvalidation(reusedResult, c);
       recordRebuildBodiesCountForTesting(
-          experimentalInvalidation?.missingSources?.length ?? 0);
+          experimentalInvalidation?.missingSources.length ?? 0);
 
       // Cleanup: After (potentially) removing builders we have stuff to cleanup
       // to not leak, and we might need to re-create the dill target.
       cleanupRemovedBuilders(reusedResult, uriTranslator);
       recreateDillTargetIfPackageWasUpdated(uriTranslator, c);
-      ClassHierarchy hierarchy = userCode?.loader?.hierarchy;
+      ClassHierarchy? hierarchy = userCode?.loader.hierarchy;
       cleanupHierarchy(hierarchy, experimentalInvalidation, reusedResult);
       List<LibraryBuilder> reusedLibraries = reusedResult.reusedLibraries;
       reusedResult = null;
 
+      // TODO(jensj): Given the code below, [userCode] is assumed always to be
+      // non-null.
       if (userCode != null) {
         ticker.logMs("Decided to reuse ${reusedLibraries.length}"
-            " of ${userCode.loader.builders.length} libraries");
+            " of ${userCode!.loader.builders.length} libraries");
       }
 
       // For modular compilation we can be asked to load components and track
@@ -283,14 +283,14 @@
       // For each computeDelta call we create a new userCode object which needs
       // to be setup, and in the case of experimental invalidation some of the
       // builders needs to be patched up.
-      KernelTarget userCodeOld = userCode;
+      IncrementalKernelTarget? userCodeOld = userCode;
       setupNewUserCode(c, uriTranslator, hierarchy, reusedLibraries,
-          experimentalInvalidation, entryPoints.first);
-      Map<LibraryBuilder, List<LibraryBuilder>> rebuildBodiesMap =
+          experimentalInvalidation, entryPoints!.first);
+      Map<LibraryBuilder, List<LibraryBuilder>>? rebuildBodiesMap =
           experimentalInvalidationCreateRebuildBodiesBuilders(
               experimentalInvalidation, uriTranslator);
-      entryPoints = userCode.setEntryPoints(entryPoints);
-      await userCode.loader.buildOutlines();
+      entryPoints = userCode!.setEntryPoints(entryPoints!);
+      await userCode!.loader.buildOutlines();
       experimentalInvalidationPatchUpScopes(
           experimentalInvalidation, rebuildBodiesMap);
       rebuildBodiesMap = null;
@@ -301,49 +301,51 @@
       // libraries loaded from .dill files or directly from components.
       // Technically, it's the combination of userCode.loader.libraries and
       // dillLoadedData.loader.libraries.
-      Component componentWithDill = await userCode.buildOutlines();
+      Component? componentWithDill = await userCode!.buildOutlines();
 
       if (!outlineOnly) {
         // Checkpoint: Build the actual bodies.
         componentWithDill =
-            await userCode.buildComponent(verify: c.options.verify);
+            await userCode!.buildComponent(verify: c.options.verify);
       }
-      hierarchy ??= userCode.loader.hierarchy;
+      hierarchy ??= userCode!.loader.hierarchy;
+      // ignore: unnecessary_null_comparison
       if (hierarchy != null) {
-        if (userCode.classHierarchyChanges != null) {
-          hierarchy.applyTreeChanges([], [], userCode.classHierarchyChanges);
+        if (userCode!.classHierarchyChanges != null) {
+          hierarchy.applyTreeChanges([], [], userCode!.classHierarchyChanges!);
         }
-        if (userCode.classMemberChanges != null) {
-          hierarchy.applyMemberChanges(userCode.classMemberChanges,
+        if (userCode!.classMemberChanges != null) {
+          hierarchy.applyMemberChanges(userCode!.classMemberChanges!,
               findDescendants: true);
         }
       }
-      recordNonFullComponentForTesting(componentWithDill);
+      recordNonFullComponentForTesting(componentWithDill!);
 
       // Perform actual dill usage tracking.
       performDillUsageTracking(hierarchy);
 
       // If we actually got a result we can throw away the old userCode and the
       // list of invalidated uris.
+      // ignore: unnecessary_null_comparison
       if (componentWithDill != null) {
         this.invalidatedUris.clear();
         hasToCheckPackageUris = false;
-        userCodeOld?.loader?.releaseAncillaryResources();
+        userCodeOld?.loader.releaseAncillaryResources();
         userCodeOld = null;
       }
 
       // Compute which libraries to output and which (previous) errors/warnings
       // we have to reissue. In the process do some cleanup too.
       List<Library> compiledLibraries =
-          new List<Library>.from(userCode.loader.libraries);
-      Map<Uri, Source> uriToSource = componentWithDill?.uriToSource;
+          new List<Library>.from(userCode!.loader.libraries);
+      Map<Uri, Source> uriToSource = componentWithDill.uriToSource;
       experimentalCompilationPostCompilePatchup(
           experimentalInvalidation, compiledLibraries, uriToSource);
       List<Library> outputLibraries =
           calculateOutputLibrariesAndIssueLibraryProblems(
               data.component != null || fullComponent,
               compiledLibraries,
-              entryPoints,
+              entryPoints!,
               reusedLibraries,
               hierarchy,
               uriTranslator,
@@ -353,10 +355,11 @@
 
       // If we didn't get a result, go back to the previous one so expression
       // calculation has the potential to work.
+      // ignore: unnecessary_null_comparison
       if (componentWithDill == null) {
-        userCode.loader.builders.clear();
+        userCode!.loader.builders.clear();
         userCode = userCodeOld;
-        dillLoadedData.loader.currentSourceLoader = userCode.loader;
+        dillLoadedData!.loader.currentSourceLoader = userCode!.loader;
       } else {
         previousSourceBuilders =
             await convertSourceLibraryBuildersToDill(experimentalInvalidation);
@@ -365,19 +368,21 @@
       experimentalInvalidation = null;
 
       // Output result.
-      Procedure mainMethod = componentWithDill == null
+      // ignore: unnecessary_null_comparison
+      Procedure? mainMethod = componentWithDill == null
           ? data.component?.mainMethod
           : componentWithDill.mainMethod;
-      NonNullableByDefaultCompiledMode compiledMode = componentWithDill == null
+      // ignore: unnecessary_null_comparison
+      NonNullableByDefaultCompiledMode? compiledMode = componentWithDill == null
           ? data.component?.mode
           : componentWithDill.mode;
       Component result = context.options.target.configureComponent(
           new Component(libraries: outputLibraries, uriToSource: uriToSource))
-        ..setMainMethodAndMode(mainMethod?.reference, true, compiledMode)
+        ..setMainMethodAndMode(mainMethod?.reference, true, compiledMode!)
         ..problemsAsJson = problemsAsJson;
 
       // We're now done. Allow any waiting compile to start.
-      Completer<dynamic> currentlyCompilingLocal = currentlyCompiling;
+      Completer<dynamic> currentlyCompilingLocal = currentlyCompiling!;
       currentlyCompiling = null;
       currentlyCompilingLocal.complete();
 
@@ -394,22 +399,22 @@
   ///
   /// Returns the set of Libraries that now has new (dill) builders.
   Future<Set<Library>> convertSourceLibraryBuildersToDill(
-      ExperimentalInvalidation experimentalInvalidation) async {
+      ExperimentalInvalidation? experimentalInvalidation) async {
     bool changed = false;
     Set<Library> newDillLibraryBuilders = new Set<Library>();
     userBuilders ??= <Uri, LibraryBuilder>{};
-    Map<LibraryBuilder, List<LibraryBuilder>> convertedLibraries;
+    Map<LibraryBuilder, List<LibraryBuilder>>? convertedLibraries;
     for (MapEntry<Uri, LibraryBuilder> entry
-        in userCode.loader.builders.entries) {
+        in userCode!.loader.builders.entries) {
       if (entry.value is SourceLibraryBuilder) {
-        SourceLibraryBuilder builder = entry.value;
+        SourceLibraryBuilder builder = entry.value as SourceLibraryBuilder;
         DillLibraryBuilder dillBuilder =
-            dillLoadedData.loader.appendLibrary(builder.library);
-        userCode.loader.builders[entry.key] = dillBuilder;
-        userBuilders[entry.key] = dillBuilder;
+            dillLoadedData!.loader.appendLibrary(builder.library);
+        userCode!.loader.builders[entry.key] = dillBuilder;
+        userBuilders![entry.key] = dillBuilder;
         newDillLibraryBuilders.add(builder.library);
-        if (userCode.loader.first == builder) {
-          userCode.loader.first = dillBuilder;
+        if (userCode!.loader.first == builder) {
+          userCode!.loader.first = dillBuilder;
         }
         changed = true;
         if (experimentalInvalidation != null) {
@@ -422,9 +427,9 @@
     if (changed) {
       // We suppress finalization errors because they have already been
       // reported.
-      await dillLoadedData.buildOutlines(suppressFinalizationErrors: true);
+      await dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
       assert(_checkEquivalentScopes(
-          userCode.loader.builders, dillLoadedData.loader.builders));
+          userCode!.loader.builders, dillLoadedData!.loader.builders));
 
       if (experimentalInvalidation != null) {
         /// If doing experimental invalidation that means that some of the old
@@ -432,17 +437,17 @@
         /// source builders. Patch that up.
 
         // Maps from old library builder to map of new content.
-        Map<LibraryBuilder, Map<String, Builder>> replacementMap = {};
+        Map<LibraryBuilder, Map<String, Builder>>? replacementMap = {};
 
         // Maps from old library builder to map of new content.
-        Map<LibraryBuilder, Map<String, Builder>> replacementSettersMap = {};
+        Map<LibraryBuilder, Map<String, Builder>>? replacementSettersMap = {};
 
         experimentalInvalidationFillReplacementMaps(
-            convertedLibraries, replacementMap, replacementSettersMap);
+            convertedLibraries!, replacementMap, replacementSettersMap);
 
         for (LibraryBuilder builder
             in experimentalInvalidation.originalNotReusedLibraries) {
-          DillLibraryBuilder dillBuilder = builder;
+          DillLibraryBuilder dillBuilder = builder as DillLibraryBuilder;
           if (dillBuilder.isBuilt) {
             dillBuilder.exportScope
                 .patchUpScope(replacementMap, replacementSettersMap);
@@ -460,12 +465,12 @@
         replacementSettersMap = null;
       }
     }
-    userCode.loader.buildersCreatedWithReferences.clear();
-    userCode.loader.builderHierarchy.clear();
-    userCode.loader.referenceFromIndex = null;
+    userCode!.loader.buildersCreatedWithReferences.clear();
+    userCode!.loader.builderHierarchy.clear();
+    userCode!.loader.referenceFromIndex = null;
     convertedLibraries = null;
     experimentalInvalidation = null;
-    if (userBuilders.isEmpty) userBuilders = null;
+    if (userBuilders!.isEmpty) userBuilders = null;
     return newDillLibraryBuilders;
   }
 
@@ -473,7 +478,8 @@
       Map<Uri, LibraryBuilder> dillLibraries) {
     sourceLibraries.forEach((Uri uri, LibraryBuilder sourceLibraryBuilder) {
       if (sourceLibraryBuilder is SourceLibraryBuilder) {
-        DillLibraryBuilder dillLibraryBuilder = dillLibraries[uri];
+        DillLibraryBuilder dillLibraryBuilder =
+            dillLibraries[uri] as DillLibraryBuilder;
         assert(
             _hasEquivalentScopes(sourceLibraryBuilder, dillLibraryBuilder) ==
                 null,
@@ -483,14 +489,14 @@
     return true;
   }
 
-  String _hasEquivalentScopes(SourceLibraryBuilder sourceLibraryBuilder,
+  String? _hasEquivalentScopes(SourceLibraryBuilder sourceLibraryBuilder,
       DillLibraryBuilder dillLibraryBuilder) {
     bool isEquivalent = true;
     StringBuffer sb = new StringBuffer();
     sb.writeln('Mismatch on ${sourceLibraryBuilder.importUri}:');
     sourceLibraryBuilder.exportScope
         .forEachLocalMember((String name, Builder sourceBuilder) {
-      Builder dillBuilder =
+      Builder? dillBuilder =
           dillLibraryBuilder.exportScope.lookupLocalMember(name, setter: false);
       if (dillBuilder == null) {
         if ((name == 'dynamic' || name == 'Never') &&
@@ -506,7 +512,7 @@
     });
     dillLibraryBuilder.exportScope
         .forEachLocalMember((String name, Builder dillBuilder) {
-      Builder sourceBuilder = sourceLibraryBuilder.exportScope
+      Builder? sourceBuilder = sourceLibraryBuilder.exportScope
           .lookupLocalMember(name, setter: false);
       if (sourceBuilder == null) {
         sb.writeln('No source builder for ${name}: $dillBuilder');
@@ -515,7 +521,7 @@
     });
     sourceLibraryBuilder.exportScope
         .forEachLocalSetter((String name, Builder sourceBuilder) {
-      Builder dillBuilder =
+      Builder? dillBuilder =
           dillLibraryBuilder.exportScope.lookupLocalMember(name, setter: true);
       if (dillBuilder == null) {
         sb.writeln('No dill builder for ${name}=: $sourceBuilder');
@@ -524,7 +530,7 @@
     });
     dillLibraryBuilder.exportScope
         .forEachLocalSetter((String name, Builder dillBuilder) {
-      Builder sourceBuilder = sourceLibraryBuilder.exportScope
+      Builder? sourceBuilder = sourceLibraryBuilder.exportScope
           .lookupLocalMember(name, setter: true);
       if (sourceBuilder == null) {
         sourceBuilder = sourceLibraryBuilder.exportScope
@@ -561,8 +567,8 @@
           reusedLibraries, hierarchy, uriTranslator, uriToSource);
       allLibraries = outputLibraries.toSet();
       if (!c.options.omitPlatform) {
-        for (int i = 0; i < platformBuilders.length; i++) {
-          Library lib = platformBuilders[i].library;
+        for (int i = 0; i < platformBuilders!.length; i++) {
+          Library lib = platformBuilders![i].library;
           outputLibraries.add(lib);
         }
       }
@@ -591,7 +597,7 @@
   /// This might be a temporary thing, but we need to figure out if the VM
   /// can (always) work with only getting the actually rebuild stuff.
   void experimentalCompilationPostCompilePatchup(
-      ExperimentalInvalidation experimentalInvalidation,
+      ExperimentalInvalidation? experimentalInvalidation,
       List<Library> compiledLibraries,
       Map<Uri, Source> uriToSource) {
     if (experimentalInvalidation != null) {
@@ -600,7 +606,7 @@
       for (Uri uri in experimentalInvalidation.missingSources) {
         // TODO(jensj): KernelTargets "link" takes some "excludeSource"
         // setting into account.
-        uriToSource[uri] = CompilerContext.current.uriToSource[uri];
+        uriToSource[uri] = CompilerContext.current.uriToSource[uri]!;
       }
     }
   }
@@ -612,16 +618,16 @@
     if (trackNeededDillLibraries) {
       // Which dill builders were built?
       neededDillLibraries = new Set<Library>();
-      for (LibraryBuilder builder in dillLoadedData.loader.builders.values) {
+      for (LibraryBuilder builder in dillLoadedData!.loader.builders.values) {
         if (builder is DillLibraryBuilder) {
           if (builder.isBuiltAndMarked) {
-            neededDillLibraries.add(builder.library);
+            neededDillLibraries!.add(builder.library);
           }
         }
       }
 
       updateNeededDillLibrariesWithHierarchy(
-          hierarchy, userCode.loader.builderHierarchy);
+          hierarchy, userCode!.loader.builderHierarchy);
     }
   }
 
@@ -635,7 +641,7 @@
         in rebuildBodiesMap.entries) {
       Map<String, Builder> childReplacementMap = {};
       Map<String, Builder> childReplacementSettersMap = {};
-      List<LibraryBuilder> builders = rebuildBodiesMap[entry.key];
+      List<LibraryBuilder> builders = rebuildBodiesMap[entry.key]!;
       replacementMap[entry.key] = childReplacementMap;
       replacementSettersMap[entry.key] = childReplacementSettersMap;
       for (LibraryBuilder builder in builders) {
@@ -665,7 +671,7 @@
   /// references from the original [Library] for things to work.
   Map<LibraryBuilder, List<LibraryBuilder>>
       experimentalInvalidationCreateRebuildBodiesBuilders(
-          ExperimentalInvalidation experimentalInvalidation,
+          ExperimentalInvalidation? experimentalInvalidation,
           UriTranslator uriTranslator) {
     // Any builder(s) in [rebuildBodies] should be semi-reused: Create source
     // builders based on the underlying libraries.
@@ -674,8 +680,8 @@
         new Map<LibraryBuilder, List<LibraryBuilder>>.identity();
     if (experimentalInvalidation != null) {
       for (LibraryBuilder library in experimentalInvalidation.rebuildBodies) {
-        LibraryBuilder newBuilder = userCode.loader.read(library.importUri, -1,
-            accessor: userCode.loader.first,
+        LibraryBuilder newBuilder = userCode!.loader.read(library.importUri, -1,
+            accessor: userCode!.loader.first,
             fileUri: library.fileUri,
             referencesFrom: library.library);
         List<LibraryBuilder> builders = [newBuilder];
@@ -686,9 +692,9 @@
           // over written as the library for parts are temporary "fake"
           // libraries.
           Uri partUri = getPartUri(library.importUri, part);
-          Uri fileUri =
+          Uri? fileUri =
               getPartFileUri(library.library.fileUri, part, uriTranslator);
-          LibraryBuilder newPartBuilder = userCode.loader.read(partUri, -1,
+          LibraryBuilder newPartBuilder = userCode!.loader.read(partUri, -1,
               accessor: library,
               fileUri: fileUri,
               referencesFrom: library.library,
@@ -704,7 +710,7 @@
   /// the libraries we're not recompiling but should have recompiled if we
   /// didn't do anything special.
   void experimentalInvalidationPatchUpScopes(
-      ExperimentalInvalidation experimentalInvalidation,
+      ExperimentalInvalidation? experimentalInvalidation,
       Map<LibraryBuilder, List<LibraryBuilder>> rebuildBodiesMap) {
     if (experimentalInvalidation != null) {
       // Maps from old library builder to map of new content.
@@ -722,19 +728,19 @@
           builder.clearExtensionsInScopeCache();
           for (Import import in builder.imports) {
             assert(import.importer == builder);
-            List<LibraryBuilder> replacements =
+            List<LibraryBuilder>? replacements =
                 rebuildBodiesMap[import.imported];
             if (replacements != null) {
               import.imported = replacements.first;
             }
             if (import.prefixBuilder?.exportScope != null) {
-              Scope scope = import.prefixBuilder?.exportScope;
+              Scope scope = import.prefixBuilder!.exportScope;
               scope.patchUpScope(replacementMap, replacementSettersMap);
             }
           }
           for (Export export in builder.exports) {
             assert(export.exporter == builder);
-            List<LibraryBuilder> replacements =
+            List<LibraryBuilder>? replacements =
                 rebuildBodiesMap[export.exported];
 
             if (replacements != null) {
@@ -750,20 +756,20 @@
           while (iterator.moveNext()) {
             Builder childBuilder = iterator.current;
             if (childBuilder is SourceClassBuilder) {
-              TypeBuilder typeBuilder = childBuilder.supertypeBuilder;
+              TypeBuilder? typeBuilder = childBuilder.supertypeBuilder;
               replaceTypeBuilder(
                   replacementMap, replacementSettersMap, typeBuilder);
               typeBuilder = childBuilder.mixedInTypeBuilder;
               replaceTypeBuilder(
                   replacementMap, replacementSettersMap, typeBuilder);
               if (childBuilder.onTypes != null) {
-                for (typeBuilder in childBuilder.onTypes) {
+                for (typeBuilder in childBuilder.onTypes!) {
                   replaceTypeBuilder(
                       replacementMap, replacementSettersMap, typeBuilder);
                 }
               }
               if (childBuilder.interfaceBuilders != null) {
-                for (typeBuilder in childBuilder.interfaceBuilders) {
+                for (typeBuilder in childBuilder.interfaceBuilders!) {
                   replaceTypeBuilder(
                       replacementMap, replacementSettersMap, typeBuilder);
                 }
@@ -798,9 +804,9 @@
   void setupNewUserCode(
       CompilerContext c,
       UriTranslator uriTranslator,
-      ClassHierarchy hierarchy,
+      ClassHierarchy? hierarchy,
       List<LibraryBuilder> reusedLibraries,
-      ExperimentalInvalidation experimentalInvalidation,
+      ExperimentalInvalidation? experimentalInvalidation,
       Uri firstEntryPoint) {
     userCode = createIncrementalKernelTarget(
         new HybridFileSystem(
@@ -808,19 +814,19 @@
                 new Uri(scheme: "org-dartlang-debug", path: "/")),
             c.fileSystem),
         false,
-        dillLoadedData,
+        dillLoadedData!,
         uriTranslator);
-    userCode.loader.hierarchy = hierarchy;
-    dillLoadedData.loader.currentSourceLoader = userCode.loader;
+    userCode!.loader.hierarchy = hierarchy;
+    dillLoadedData!.loader.currentSourceLoader = userCode!.loader;
 
     // Re-use the libraries we've deemed re-usable.
     List<bool> seenModes = [false, false, false, false];
     for (LibraryBuilder library in reusedLibraries) {
       seenModes[library.library.nonNullableByDefaultCompiledMode.index] = true;
-      userCode.loader.builders[library.importUri] = library;
+      userCode!.loader.builders[library.importUri] = library;
       if (library.importUri.scheme == "dart" &&
           library.importUri.path == "core") {
-        userCode.loader.coreLibrary = library;
+        userCode!.loader.coreLibrary = library;
       }
     }
     // Check compilation mode up against what we've seen here and set
@@ -831,14 +837,14 @@
           // Don't expect strong or invalid.
           if (seenModes[NonNullableByDefaultCompiledMode.Strong.index] ||
               seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
-            userCode.loader.hasInvalidNnbdModeLibrary = true;
+            userCode!.loader.hasInvalidNnbdModeLibrary = true;
           }
           break;
         case NnbdMode.Strong:
           // Don't expect weak or invalid.
           if (seenModes[NonNullableByDefaultCompiledMode.Weak.index] ||
               seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
-            userCode.loader.hasInvalidNnbdModeLibrary = true;
+            userCode!.loader.hasInvalidNnbdModeLibrary = true;
           }
           break;
         case NnbdMode.Agnostic:
@@ -846,7 +852,7 @@
           if (seenModes[NonNullableByDefaultCompiledMode.Strong.index] ||
               seenModes[NonNullableByDefaultCompiledMode.Weak.index] ||
               seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
-            userCode.loader.hasInvalidNnbdModeLibrary = true;
+            userCode!.loader.hasInvalidNnbdModeLibrary = true;
           }
           break;
       }
@@ -854,7 +860,7 @@
       // Don't expect strong or invalid.
       if (seenModes[NonNullableByDefaultCompiledMode.Strong.index] ||
           seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
-        userCode.loader.hasInvalidNnbdModeLibrary = true;
+        userCode!.loader.hasInvalidNnbdModeLibrary = true;
       }
     }
 
@@ -862,13 +868,13 @@
     // correctly. If the first one is in the rebuildBodies, we have to add it
     // from there first.
     Uri firstEntryPointImportUri =
-        userCode.getEntryPointUri(firstEntryPoint, issueProblem: false);
+        userCode!.getEntryPointUri(firstEntryPoint, issueProblem: false);
     bool wasFirstSet = false;
     if (experimentalInvalidation != null) {
       for (LibraryBuilder library in experimentalInvalidation.rebuildBodies) {
         if (library.importUri == firstEntryPointImportUri) {
-          userCode.loader.read(library.importUri, -1,
-              accessor: userCode.loader.first,
+          userCode!.loader.read(library.importUri, -1,
+              accessor: userCode!.loader.first,
               fileUri: library.fileUri,
               referencesFrom: library.library);
           wasFirstSet = true;
@@ -877,26 +883,26 @@
       }
     }
     if (!wasFirstSet) {
-      userCode.loader.read(firstEntryPointImportUri, -1,
-          accessor: userCode.loader.first,
+      userCode!.loader.read(firstEntryPointImportUri, -1,
+          accessor: userCode!.loader.first,
           fileUri: firstEntryPointImportUri != firstEntryPoint
               ? firstEntryPoint
               : null);
     }
-    if (userCode.loader.first == null &&
-        userCode.loader.builders[firstEntryPointImportUri] != null) {
-      userCode.loader.first =
-          userCode.loader.builders[firstEntryPointImportUri];
+    if (userCode!.loader.first == null &&
+        userCode!.loader.builders[firstEntryPointImportUri] != null) {
+      userCode!.loader.first =
+          userCode!.loader.builders[firstEntryPointImportUri];
     }
   }
 
   /// When tracking used libraries we mark them when we use them. To track
   /// correctly we have to unmark before the next iteration to not have too much
   /// marked and therefore incorrectly marked something as used when it is not.
-  void resetTrackingOfUsedLibraries(ClassHierarchy hierarchy) {
+  void resetTrackingOfUsedLibraries(ClassHierarchy? hierarchy) {
     if (trackNeededDillLibraries) {
       // Reset dill loaders and kernel class hierarchy.
-      for (LibraryBuilder builder in dillLoadedData.loader.builders.values) {
+      for (LibraryBuilder builder in dillLoadedData!.loader.builders.values) {
         if (builder is DillLibraryBuilder) {
           if (builder.isBuiltAndMarked) {
             // Clear cached calculations in classes which upon calculation can
@@ -921,8 +927,8 @@
   /// invalidating (or would normally have invalidated if we hadn't done any
   /// experimental invalidation).
   void cleanupHierarchy(
-      ClassHierarchy hierarchy,
-      ExperimentalInvalidation experimentalInvalidation,
+      ClassHierarchy? hierarchy,
+      ExperimentalInvalidation? experimentalInvalidation,
       ReusageResult reusedResult) {
     if (hierarchy != null) {
       List<Library> removedLibraries = <Library>[];
@@ -951,19 +957,18 @@
     if (hasToCheckPackageUris) {
       // The package file was changed.
       // Make sure the dill loader is on the same page.
-      DillTarget oldDillLoadedData = dillLoadedData;
+      DillTarget oldDillLoadedData = dillLoadedData!;
       dillLoadedData = new DillTarget(ticker, uriTranslator, c.options.target);
-      for (DillLibraryBuilder library
-          in oldDillLoadedData.loader.builders.values) {
-        library.loader = dillLoadedData.loader;
-        dillLoadedData.loader.builders[library.importUri] = library;
+      for (LibraryBuilder library in oldDillLoadedData.loader.builders.values) {
+        (library as DillLibraryBuilder).loader = dillLoadedData!.loader;
+        dillLoadedData!.loader.builders[library.importUri] = library;
         if (library.importUri.scheme == "dart" &&
             library.importUri.path == "core") {
-          dillLoadedData.loader.coreLibrary = library;
+          dillLoadedData!.loader.coreLibrary = library;
         }
       }
-      dillLoadedData.loader.first = oldDillLoadedData.loader.first;
-      dillLoadedData.loader.libraries
+      dillLoadedData!.loader.first = oldDillLoadedData.loader.first;
+      dillLoadedData!.loader.libraries
           .addAll(oldDillLoadedData.loader.libraries);
     }
   }
@@ -983,8 +988,8 @@
           CompilerContext.current.uriToSource);
       incrementalSerializer?.invalidate(builder.fileUri);
 
-      LibraryBuilder dillBuilder =
-          dillLoadedData.loader.builders.remove(builder.importUri);
+      LibraryBuilder? dillBuilder =
+          dillLoadedData!.loader.builders.remove(builder.importUri);
       if (dillBuilder != null) {
         removedDillBuilders = true;
         userBuilders?.remove(builder.importUri);
@@ -1005,7 +1010,7 @@
   bool _importsFfi() {
     if (userBuilders == null) return false;
     final Uri dartFfiUri = Uri.parse("dart:ffi");
-    for (LibraryBuilder builder in userBuilders.values) {
+    for (LibraryBuilder builder in userBuilders!.values) {
       Library lib = builder.library;
       for (LibraryDependency dependency in lib.dependencies) {
         if (dependency.targetLibrary.importUri == dartFfiUri) {
@@ -1019,11 +1024,11 @@
   /// Figure out if we can (and was asked to) do experimental invalidation.
   /// Note that this returns (future or) [null] if we're not doing experimental
   /// invalidation.
-  Future<ExperimentalInvalidation> initializeExperimentalInvalidation(
+  Future<ExperimentalInvalidation?> initializeExperimentalInvalidation(
       ReusageResult reusedResult, CompilerContext c) async {
-    Set<LibraryBuilder> rebuildBodies;
+    Set<LibraryBuilder>? rebuildBodies;
     Set<LibraryBuilder> originalNotReusedLibraries;
-    Set<Uri> missingSources;
+    Set<Uri>? missingSources;
 
     if (!context.options.isExperimentEnabledGlobally(
         ExperimentalFlag.alternativeInvalidationStrategy)) return null;
@@ -1035,7 +1040,7 @@
     // rebuild the bodies.
     for (LibraryBuilder builder in reusedResult.directlyInvalidated) {
       if (builder.library.problemsAsJson != null) {
-        assert(builder.library.problemsAsJson.isNotEmpty);
+        assert(builder.library.problemsAsJson!.isNotEmpty);
         return null;
       }
       Iterator<Builder> iterator = builder.iterator;
@@ -1046,8 +1051,9 @@
         }
       }
 
-      List<int> previousSource =
-          CompilerContext.current.uriToSource[builder.fileUri].source;
+      List<int>? previousSource =
+          CompilerContext.current.uriToSource[builder.fileUri]!.source;
+      // ignore: unnecessary_null_comparison
       if (previousSource == null || previousSource.isEmpty) {
         return null;
       }
@@ -1060,12 +1066,12 @@
               /* this is effectively what the constant evaluator does */
               context.options
                   .isExperimentEnabledGlobally(ExperimentalFlag.tripleShift));
-      String before = textualOutline(previousSource, scannerConfiguration,
+      String? before = textualOutline(previousSource, scannerConfiguration,
           performModelling: true);
       if (before == null) {
         return null;
       }
-      String now;
+      String? now;
       FileSystemEntity entity =
           c.options.fileSystem.entityForUri(builder.fileUri);
       if (await entity.exists()) {
@@ -1080,7 +1086,7 @@
       CompilerContext.current.uriToSource.remove(builder.fileUri);
       missingSources ??= new Set<Uri>();
       missingSources.add(builder.fileUri);
-      LibraryBuilder partOfLibrary = builder.partOfLibrary;
+      LibraryBuilder? partOfLibrary = builder.partOfLibrary;
       rebuildBodies ??= new Set<LibraryBuilder>();
       if (partOfLibrary != null) {
         rebuildBodies.add(partOfLibrary);
@@ -1094,7 +1100,7 @@
     // we can't only recompile the changed file.
     // TODO(jensj): Check for mixins in a smarter and faster way.
     for (LibraryBuilder builder in reusedResult.notReusedLibraries) {
-      if (missingSources.contains(builder.fileUri)) {
+      if (missingSources!.contains(builder.fileUri)) {
         continue;
       }
       Library lib = builder.library;
@@ -1124,7 +1130,7 @@
     // Alternatively (https://github.com/dart-lang/sdk/issues/45899) we might
     // do something else entirely that doesn't require special handling.
     if (_importsFfi()) {
-      for (LibraryBuilder builder in rebuildBodies) {
+      for (LibraryBuilder builder in rebuildBodies!) {
         Library lib = builder.library;
         for (LibraryDependency dependency in lib.dependencies) {
           Library importLibrary = dependency.targetLibrary;
@@ -1133,7 +1139,7 @@
             return null;
           }
           for (Reference exportReference in importLibrary.additionalExports) {
-            NamedNode export = exportReference.node;
+            NamedNode? export = exportReference.node;
             if (export is Class) {
               Class c = export;
               if (c.enclosingLibrary.importUri == dartFfiUri) {
@@ -1151,16 +1157,16 @@
     for (LibraryBuilder builder in reusedResult.notReusedLibraries) {
       if (builder.isPart) continue;
       if (builder.isPatch) continue;
-      if (rebuildBodies.contains(builder)) continue;
+      if (rebuildBodies!.contains(builder)) continue;
       if (!seenUris.add(builder.importUri)) continue;
       reusedResult.reusedLibraries.add(builder);
       originalNotReusedLibraries.add(builder);
     }
     reusedResult.notReusedLibraries.clear();
-    reusedResult.notReusedLibraries.addAll(rebuildBodies);
+    reusedResult.notReusedLibraries.addAll(rebuildBodies!);
 
     return new ExperimentalInvalidation(
-        rebuildBodies, originalNotReusedLibraries, missingSources);
+        rebuildBodies, originalNotReusedLibraries, missingSources!);
   }
 
   /// Get UriTranslator, and figure out if the packages file was (potentially)
@@ -1208,7 +1214,7 @@
         initializeFromComponent(uriTranslator, c, data);
         componentToInitializeFrom = null;
       } else {
-        List<int> summaryBytes = await c.options.loadSdkSummaryBytes();
+        List<int>? summaryBytes = await c.options.loadSdkSummaryBytes();
         bytesLength = prepareSummary(summaryBytes, uriTranslator, c, data);
         if (initializeFromDillUri != null) {
           try {
@@ -1225,10 +1231,10 @@
                 e is CompilationModeError) {
               // Don't report any warning.
             } else {
-              Uri gzInitializedFrom;
+              Uri? gzInitializedFrom;
               if (c.options.writeFileOnCrashReport) {
                 gzInitializedFrom = saveAsGzip(
-                    data.initializationBytes, "initialize_from.dill");
+                    data.initializationBytes!, "initialize_from.dill");
                 recordTemporaryFileForTesting(gzInitializedFrom);
               }
               if (e is CanonicalNameError) {
@@ -1237,7 +1243,7 @@
                         initializeFromDillUri.toString(), gzInitializedFrom)
                     : templateInitializeFromDillNotSelfContainedNoDump
                         .withArguments(initializeFromDillUri.toString());
-                dillLoadedData.loader
+                dillLoadedData!.loader
                     .addProblem(message, TreeNode.noOffset, 1, null);
               } else {
                 // Unknown error: Report problem as such.
@@ -1250,7 +1256,7 @@
                     : templateInitializeFromDillUnknownProblemNoDump
                         .withArguments(
                             initializeFromDillUri.toString(), "$e", "$st");
-                dillLoadedData.loader
+                dillLoadedData!.loader
                     .addProblem(message, TreeNode.noOffset, 1, null);
               }
             }
@@ -1261,17 +1267,17 @@
 
       // We suppress finalization errors because they will reported via
       // problemsAsJson fields (with better precision).
-      await dillLoadedData.buildOutlines(suppressFinalizationErrors: true);
+      await dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
       userBuilders = <Uri, LibraryBuilder>{};
       platformBuilders = <LibraryBuilder>[];
-      dillLoadedData.loader.builders.forEach((uri, builder) {
+      dillLoadedData!.loader.builders.forEach((uri, builder) {
         if (builder.importUri.scheme == "dart") {
-          platformBuilders.add(builder);
+          platformBuilders!.add(builder);
         } else {
-          userBuilders[uri] = builder;
+          userBuilders![uri] = builder;
         }
       });
-      if (userBuilders.isEmpty) userBuilders = null;
+      if (userBuilders!.isEmpty) userBuilders = null;
     }
     data.initializationBytes = null;
     return data;
@@ -1280,28 +1286,29 @@
   void replaceTypeBuilder(
       Map<LibraryBuilder, Map<String, Builder>> replacementMap,
       Map<LibraryBuilder, Map<String, Builder>> replacementSettersMap,
-      TypeBuilder typeBuilder) {
-    TypeDeclarationBuilder declaration = typeBuilder?.declaration;
-    Builder parent = declaration?.parent;
+      TypeBuilder? typeBuilder) {
+    TypeDeclarationBuilder? declaration = typeBuilder?.declaration;
+    Builder? parent = declaration?.parent;
     if (parent == null) return;
-    Map<String, Builder> childReplacementMap;
-    if (declaration.isSetter) {
+    Map<String, Builder>? childReplacementMap;
+    if (declaration!.isSetter) {
       childReplacementMap = replacementSettersMap[parent];
     } else {
       childReplacementMap = replacementMap[parent];
     }
 
     if (childReplacementMap == null) return;
-    Builder replacement = childReplacementMap[declaration.name];
+    Builder replacement = childReplacementMap[declaration.name]!;
+    // ignore: unnecessary_null_comparison
     assert(replacement != null, "Didn't find the replacement for $typeBuilder");
-    typeBuilder.bind(replacement);
+    typeBuilder!.bind(replacement as TypeDeclarationBuilder);
   }
 
   @override
-  CoreTypes getCoreTypes() => userCode?.loader?.coreTypes;
+  CoreTypes? getCoreTypes() => userCode?.loader.coreTypes;
 
   @override
-  ClassHierarchy getClassHierarchy() => userCode?.loader?.hierarchy;
+  ClassHierarchy? getClassHierarchy() => userCode?.loader.hierarchy;
 
   /// Allows for updating the list of needed libraries.
   ///
@@ -1315,7 +1322,7 @@
   /// (though handling of the case where all bets are off should probably still
   /// live locally).
   void updateNeededDillLibrariesWithHierarchy(
-      ClassHierarchy hierarchy, ClassHierarchyBuilder builderHierarchy) {
+      ClassHierarchy hierarchy, ClassHierarchyBuilder? builderHierarchy) {
     if (hierarchy is ClosedWorldClassHierarchy && !hierarchy.allBetsOff) {
       neededDillLibraries ??= new Set<Library>();
       Set<Class> classes = new Set<Class>();
@@ -1341,13 +1348,13 @@
           }
         }
         if (c.mixedInType != null) {
-          if (classes.add(c.mixedInType.classNode)) {
-            worklist.add(c.mixedInType.classNode);
+          if (classes.add(c.mixedInType!.classNode)) {
+            worklist.add(c.mixedInType!.classNode);
           }
         }
         if (c.supertype != null) {
-          if (classes.add(c.supertype.classNode)) {
-            worklist.add(c.supertype.classNode);
+          if (classes.add(c.supertype!.classNode)) {
+            worklist.add(c.supertype!.classNode);
           }
         }
       }
@@ -1358,10 +1365,10 @@
         Library library = c.enclosingLibrary;
         // Only add if loaded from a dill file (and wasn't a 'dill' that was
         // converted from source builders to dill builders).
-        if (dillLoadedData.loader.builders.containsKey(library.importUri) &&
+        if (dillLoadedData!.loader.builders.containsKey(library.importUri) &&
             (previousSourceBuilders == null ||
-                !previousSourceBuilders.contains(library))) {
-          neededDillLibraries.add(library);
+                !previousSourceBuilders!.contains(library))) {
+          neededDillLibraries!.add(library);
         }
       }
     } else {
@@ -1369,24 +1376,24 @@
       // if all bets are off: Add everything (except for the libraries we just
       // converted from source builders to dill builders).
       neededDillLibraries = new Set<Library>();
-      for (LibraryBuilder builder in dillLoadedData.loader.builders.values) {
+      for (LibraryBuilder builder in dillLoadedData!.loader.builders.values) {
         if (builder is DillLibraryBuilder &&
             (previousSourceBuilders == null ||
-                !previousSourceBuilders.contains(builder.library))) {
-          neededDillLibraries.add(builder.library);
+                !previousSourceBuilders!.contains(builder.library))) {
+          neededDillLibraries!.add(builder.library);
         }
       }
     }
   }
 
   /// Internal method.
-  void invalidateNotKeptUserBuilders(Set<Uri> invalidatedUris) {
+  void invalidateNotKeptUserBuilders(Set<Uri?> invalidatedUris) {
     if (modulesToLoad != null && userBuilders != null) {
       Set<Library> loadedNotKept = new Set<Library>();
-      for (LibraryBuilder builder in userBuilders.values) {
+      for (LibraryBuilder builder in userBuilders!.values) {
         loadedNotKept.add(builder.library);
       }
-      for (Component module in modulesToLoad) {
+      for (Component module in modulesToLoad!) {
         loadedNotKept.removeAll(module.libraries);
       }
       for (Library lib in loadedNotKept) {
@@ -1400,35 +1407,35 @@
       List<LibraryBuilder> reusedLibraries) async {
     if (modulesToLoad != null) {
       bool loadedAnything = false;
-      for (Component module in modulesToLoad) {
+      for (Component module in modulesToLoad!) {
         bool usedComponent = false;
         for (Library lib in module.libraries) {
-          if (!dillLoadedData.loader.builders.containsKey(lib.importUri)) {
-            dillLoadedData.loader.libraries.add(lib);
-            dillLoadedData.addLibrary(lib);
-            reusedLibraries.add(dillLoadedData.loader.read(lib.importUri, -1));
+          if (!dillLoadedData!.loader.builders.containsKey(lib.importUri)) {
+            dillLoadedData!.loader.libraries.add(lib);
+            dillLoadedData!.addLibrary(lib);
+            reusedLibraries.add(dillLoadedData!.loader.read(lib.importUri, -1));
             usedComponent = true;
           }
         }
         if (usedComponent) {
-          dillLoadedData.uriToSource.addAll(module.uriToSource);
+          dillLoadedData!.uriToSource.addAll(module.uriToSource);
           loadedAnything = true;
         }
       }
       if (loadedAnything) {
         // We suppress finalization errors because they will reported via
         // problemsAsJson fields (with better precision).
-        await dillLoadedData.buildOutlines(suppressFinalizationErrors: true);
+        await dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
         userBuilders = <Uri, LibraryBuilder>{};
         platformBuilders = <LibraryBuilder>[];
-        dillLoadedData.loader.builders.forEach((uri, builder) {
+        dillLoadedData!.loader.builders.forEach((uri, builder) {
           if (builder.importUri.scheme == "dart") {
-            platformBuilders.add(builder);
+            platformBuilders!.add(builder);
           } else {
-            userBuilders[uri] = builder;
+            userBuilders![uri] = builder;
           }
         });
-        if (userBuilders.isEmpty) {
+        if (userBuilders!.isEmpty) {
           userBuilders = null;
         }
       }
@@ -1436,7 +1443,7 @@
     }
   }
 
-  bool dontReissueLibraryProblemsFor(Uri uri) {
+  bool dontReissueLibraryProblemsFor(Uri? uri) {
     return uri == debugExprUri;
   }
 
@@ -1449,7 +1456,7 @@
     allLibraries.removeAll(compiledLibraries);
     for (Library library in allLibraries) {
       if (library.problemsAsJson?.isNotEmpty == true) {
-        for (String jsonString in library.problemsAsJson) {
+        for (String jsonString in library.problemsAsJson!) {
           DiagnosticMessageFromJson message =
               new DiagnosticMessageFromJson.fromJson(jsonString);
           if (dontReissueLibraryProblemsFor(message.uri)) {
@@ -1466,12 +1473,12 @@
   List<String> reissueComponentProblems(Component componentWithDill) {
     // These problems have already been reported.
     Set<String> issuedProblems = new Set<String>();
-    if (componentWithDill?.problemsAsJson != null) {
-      issuedProblems.addAll(componentWithDill.problemsAsJson);
+    if (componentWithDill.problemsAsJson != null) {
+      issuedProblems.addAll(componentWithDill.problemsAsJson!);
     }
 
     // Report old problems that wasn't reported again.
-    Set<Uri> strongModeNNBDPackageOptOutUris;
+    Set<Uri>? strongModeNNBDPackageOptOutUris;
     for (MapEntry<Uri, List<DiagnosticMessageFromJson>> entry
         in remainingComponentProblems.entries) {
       List<DiagnosticMessageFromJson> messages = entry.value;
@@ -1494,7 +1501,7 @@
       // `SourceLoader.giveCombinedErrorForNonStrongLibraries` on them to issue
       // a new error.
       Set<LibraryBuilder> builders = {};
-      SourceLoader loader = userCode.loader;
+      SourceLoader loader = userCode!.loader;
       for (LibraryBuilder builder in loader.builders.values) {
         if (strongModeNNBDPackageOptOutUris.contains(builder.fileUri)) {
           builders.add(builder);
@@ -1502,20 +1509,20 @@
       }
       FormattedMessage message = loader.giveCombinedErrorForNonStrongLibraries(
           builders,
-          emitNonPackageErrors: false);
+          emitNonPackageErrors: false)!;
       issuedProblems.add(message.toJsonString());
       // The problem was issued by the call so don't re-issue it here.
     }
 
     // Save any new component-problems.
-    _addProblemsAsJsonToRemainingProblems(componentWithDill?.problemsAsJson);
+    _addProblemsAsJsonToRemainingProblems(componentWithDill.problemsAsJson);
     return new List<String>.from(issuedProblems);
   }
 
   /// Internal method.
-  Uri getPartFileUri(
+  Uri? getPartFileUri(
       Uri parentFileUri, LibraryPart part, UriTranslator uriTranslator) {
-    Uri fileUri = getPartUri(parentFileUri, part);
+    Uri? fileUri = getPartUri(parentFileUri, part);
     if (fileUri.scheme == "package") {
       // Part was specified via package URI and the resolve above thus
       // did not go as expected. Translate the package URI to get the
@@ -1537,7 +1544,7 @@
       ClassHierarchy hierarchy,
       UriTranslator uriTranslator,
       Map<Uri, Source> uriToSource,
-      [List<Library> inputLibrariesFiltered]) {
+      [List<Library>? inputLibrariesFiltered]) {
     List<Library> result = <Library>[];
     Map<Uri, Uri> partUriToLibraryImportUri = <Uri, Uri>{};
     Map<Uri, Library> libraryMap = <Uri, Library>{};
@@ -1576,7 +1583,7 @@
         worklist.add(entry);
       } else {
         // If the entry is a part redirect to the "main" entry.
-        Uri partTranslation = partUriToLibraryImportUri[entry];
+        Uri? partTranslation = partUriToLibraryImportUri[entry];
         if (partTranslation != null) {
           worklist.add(partTranslation);
         }
@@ -1584,7 +1591,7 @@
     }
 
     LibraryGraph graph = new LibraryGraph(libraryMap);
-    Set<Uri> partsUsed = new Set<Uri>();
+    Set<Uri?> partsUsed = new Set<Uri?>();
     while (worklist.isNotEmpty && potentiallyReferencedLibraries.isNotEmpty) {
       Uri uri = worklist.removeLast();
       if (libraryMap.containsKey(uri)) {
@@ -1592,14 +1599,14 @@
           worklist.add(neighbor);
         }
         libraryMap.remove(uri);
-        Library library = potentiallyReferencedLibraries.remove(uri);
+        Library? library = potentiallyReferencedLibraries.remove(uri);
         if (library != null) {
           result.add(library);
           if (potentiallyReferencedInputLibraries.remove(uri) != null) {
             inputLibrariesFiltered?.add(library);
           }
           for (LibraryPart part in library.parts) {
-            Uri partFileUri =
+            Uri? partFileUri =
                 getPartFileUri(library.fileUri, part, uriTranslator);
             partsUsed.add(partFileUri);
           }
@@ -1611,11 +1618,11 @@
     bool removedDillBuilders = false;
     for (Uri uri in potentiallyReferencedLibraries.keys) {
       if (uri.scheme == "package") continue;
-      LibraryBuilder builder = userCode.loader.builders.remove(uri);
+      LibraryBuilder? builder = userCode!.loader.builders.remove(uri);
       if (builder != null) {
         Library lib = builder.library;
         removedLibraries.add(lib);
-        if (dillLoadedData.loader.builders.remove(uri) != null) {
+        if (dillLoadedData!.loader.builders.remove(uri) != null) {
           removedDillBuilders = true;
         }
         cleanupSourcesForBuilder(null, builder, uriTranslator,
@@ -1628,7 +1635,7 @@
         incrementalSerializer?.invalidate(builder.fileUri);
       }
     }
-    hierarchy?.applyTreeChanges(removedLibraries, const [], const []);
+    hierarchy.applyTreeChanges(removedLibraries, const [], const []);
     if (removedDillBuilders) {
       makeDillLoaderLibrariesUpToDateWithBuildersMap();
     }
@@ -1642,9 +1649,9 @@
   /// in the compilation process.
   /// This method syncs the [libraries] list with the data in [builders].
   void makeDillLoaderLibrariesUpToDateWithBuildersMap() {
-    dillLoadedData.loader.libraries.clear();
-    for (LibraryBuilder builder in dillLoadedData.loader.builders.values) {
-      dillLoadedData.loader.libraries.add(builder.library);
+    dillLoadedData!.loader.libraries.clear();
+    for (LibraryBuilder builder in dillLoadedData!.loader.builders.values) {
+      dillLoadedData!.loader.libraries.add(builder.library);
     }
   }
 
@@ -1654,25 +1661,25 @@
   /// Those parts will not be cleaned up. This is useful when a part has been
   /// "moved" to be part of another library.
   void cleanupSourcesForBuilder(
-      ReusageResult reusedResult,
+      ReusageResult? reusedResult,
       LibraryBuilder builder,
       UriTranslator uriTranslator,
       Map<Uri, Source> uriToSource,
-      [Map<Uri, Source> uriToSourceExtra,
-      Set<Uri> partsUsed]) {
+      [Map<Uri, Source>? uriToSourceExtra,
+      Set<Uri?>? partsUsed]) {
     uriToSource.remove(builder.fileUri);
     uriToSourceExtra?.remove(builder.fileUri);
     Library lib = builder.library;
     for (LibraryPart part in lib.parts) {
-      Uri partFileUri = getPartFileUri(lib.fileUri, part, uriTranslator);
+      Uri? partFileUri = getPartFileUri(lib.fileUri, part, uriTranslator);
       if (partsUsed != null && partsUsed.contains(partFileUri)) continue;
 
       // If the builders map contain the "parts" import uri, it's a real library
       // (erroneously) used as a part so we don't want to remove that.
       if (userCode?.loader != null) {
-        Uri partImportUri = uriToSource[partFileUri]?.importUri;
+        Uri? partImportUri = uriToSource[partFileUri]?.importUri;
         if (partImportUri != null &&
-            userCode.loader.builders.containsKey(partImportUri)) {
+            userCode!.loader.builders.containsKey(partImportUri)) {
           continue;
         }
       } else if (reusedResult != null) {
@@ -1702,17 +1709,17 @@
   /// This is useful when a part has been "moved" to be part of another library.
   void removeLibraryFromRemainingComponentProblems(
       Library lib, UriTranslator uriTranslator,
-      [Set<Uri> partsUsed]) {
+      [Set<Uri?>? partsUsed]) {
     remainingComponentProblems.remove(lib.fileUri);
     // Remove parts too.
     for (LibraryPart part in lib.parts) {
-      Uri partFileUri = getPartFileUri(lib.fileUri, part, uriTranslator);
+      Uri? partFileUri = getPartFileUri(lib.fileUri, part, uriTranslator);
       remainingComponentProblems.remove(partFileUri);
     }
   }
 
   /// Internal method.
-  int prepareSummary(List<int> summaryBytes, UriTranslator uriTranslator,
+  int prepareSummary(List<int>? summaryBytes, UriTranslator uriTranslator,
       CompilerContext c, IncrementalCompilerData data) {
     dillLoadedData = new DillTarget(ticker, uriTranslator, c.options.target);
     int bytesLength = 0;
@@ -1722,7 +1729,7 @@
       ticker.logMs("Read ${c.options.sdkSummary}");
       new BinaryBuilderWithMetadata(summaryBytes,
               disableLazyReading: false, disableLazyClassReading: true)
-          .readComponent(data.component);
+          .readComponent(data.component!);
       ticker.logMs("Deserialized ${c.options.sdkSummary}");
       bytesLength += summaryBytes.length;
     }
@@ -1736,9 +1743,10 @@
       IncrementalCompilerData data) async {
     int bytesLength = 0;
     FileSystemEntity entity =
-        c.options.fileSystem.entityForUri(initializeFromDillUri);
+        c.options.fileSystem.entityForUri(initializeFromDillUri!);
     if (await entity.exists()) {
       List<int> initializationBytes = await entity.readAsBytes();
+      // ignore: unnecessary_null_comparison
       if (initializationBytes != null && initializationBytes.isNotEmpty) {
         ticker.logMs("Read $initializeFromDillUri");
         data.initializationBytes = initializationBytes;
@@ -1748,8 +1756,8 @@
         List<SubComponentView> views = new BinaryBuilderWithMetadata(
                 initializationBytes,
                 disableLazyReading: true)
-            .readComponent(data.component,
-                checkCanonicalNames: true, createView: true);
+            .readComponent(data.component!,
+                checkCanonicalNames: true, createView: true)!;
 
         // Compute "output nnbd mode".
         NonNullableByDefaultCompiledMode compiledMode;
@@ -1773,7 +1781,7 @@
         // Check the any package-urls still point to the same file
         // (e.g. the package still exists and hasn't been updated).
         // Also verify NNBD settings.
-        for (Library lib in data.component.libraries) {
+        for (Library lib in data.component!.libraries) {
           if (lib.importUri.scheme == "package" &&
               uriTranslator.translate(lib.importUri, false) != lib.fileUri) {
             // Package has been removed or updated.
@@ -1811,21 +1819,21 @@
 
   /// Internal method.
   void saveComponentProblems(IncrementalCompilerData data) {
-    List<String> problemsAsJson = data.component.problemsAsJson;
+    List<String>? problemsAsJson = data.component!.problemsAsJson;
     _addProblemsAsJsonToRemainingProblems(problemsAsJson);
   }
 
-  void _addProblemsAsJsonToRemainingProblems(List<String> problemsAsJson) {
+  void _addProblemsAsJsonToRemainingProblems(List<String>? problemsAsJson) {
     if (problemsAsJson != null) {
       for (String jsonString in problemsAsJson) {
         DiagnosticMessageFromJson message =
             new DiagnosticMessageFromJson.fromJson(jsonString);
         assert(message.uri != null ||
             (message.involvedFiles != null &&
-                message.involvedFiles.isNotEmpty));
+                message.involvedFiles!.isNotEmpty));
         if (message.uri != null) {
           List<DiagnosticMessageFromJson> messages =
-              remainingComponentProblems[message.uri] ??=
+              remainingComponentProblems[message.uri!] ??=
                   <DiagnosticMessageFromJson>[];
           messages.add(message);
         }
@@ -1834,7 +1842,7 @@
           // be issued as long as it's a problem. It will because of
           // deduplication when we re-issue these (in reissueComponentProblems)
           // only be reported once.
-          for (Uri uri in message.involvedFiles) {
+          for (Uri uri in message.involvedFiles!) {
             List<DiagnosticMessageFromJson> messages =
                 remainingComponentProblems[uri] ??=
                     <DiagnosticMessageFromJson>[];
@@ -1853,15 +1861,15 @@
 
     dillLoadedData = new DillTarget(ticker, uriTranslator, c.options.target);
     data.component = new Component(
-        libraries: componentToInitializeFrom.libraries,
-        uriToSource: componentToInitializeFrom.uriToSource)
-      ..setMainMethodAndMode(componentToInitializeFrom.mainMethod?.reference,
-          true, componentToInitializeFrom.mode);
+        libraries: componentToInitializeFrom!.libraries,
+        uriToSource: componentToInitializeFrom!.uriToSource)
+      ..setMainMethodAndMode(componentToInitializeFrom!.mainMethod?.reference,
+          true, componentToInitializeFrom!.mode);
     saveComponentProblems(data);
 
     bool foundDartCore = false;
-    for (int i = 0; i < data.component.libraries.length; i++) {
-      Library library = data.component.libraries[i];
+    for (int i = 0; i < data.component!.libraries.length; i++) {
+      Library library = data.component!.libraries[i];
       if (library.importUri.scheme == "dart" &&
           library.importUri.path == "core") {
         foundDartCore = true;
@@ -1880,40 +1888,41 @@
   /// Internal method.
   void appendLibraries(IncrementalCompilerData data, int bytesLength) {
     if (data.component != null) {
-      dillLoadedData.loader
-          .appendLibraries(data.component, byteCount: bytesLength);
+      dillLoadedData!.loader
+          .appendLibraries(data.component!, byteCount: bytesLength);
     }
     ticker.logMs("Appended libraries");
   }
 
   @override
-  Future<Procedure> compileExpression(
+  Future<Procedure?> compileExpression(
       String expression,
       Map<String, DartType> definitions,
       List<TypeParameter> typeDefinitions,
       String syntheticProcedureName,
       Uri libraryUri,
-      [String className,
+      [String? className,
       bool isStatic = false]) async {
     assert(dillLoadedData != null && userCode != null);
 
     return await context.runInContext((_) async {
-      LibraryBuilder libraryBuilder =
-          userCode.loader.read(libraryUri, -1, accessor: userCode.loader.first);
+      LibraryBuilder libraryBuilder = userCode!.loader
+          .read(libraryUri, -1, accessor: userCode!.loader.first);
       ticker.logMs("Loaded library $libraryUri");
 
-      Class cls;
+      Class? cls;
       if (className != null) {
-        ClassBuilder classBuilder = libraryBuilder.scopeBuilder[className];
+        ClassBuilder? classBuilder =
+            libraryBuilder.scopeBuilder[className] as ClassBuilder?;
         cls = classBuilder?.cls;
         if (cls == null) return null;
       }
 
-      userCode.loader.seenMessages.clear();
+      userCode!.loader.seenMessages.clear();
 
       for (TypeParameter typeParam in typeDefinitions) {
-        if (!isLegalIdentifier(typeParam.name)) {
-          userCode.loader.addProblem(
+        if (!isLegalIdentifier(typeParam.name!)) {
+          userCode!.loader.addProblem(
               templateIncrementalCompilerIllegalTypeParameter
                   .withArguments('$typeParam'),
               typeParam.fileOffset,
@@ -1924,7 +1933,7 @@
       }
       for (String name in definitions.keys) {
         if (!isLegalIdentifier(name)) {
-          userCode.loader.addProblem(
+          userCode!.loader.addProblem(
               templateIncrementalCompilerIllegalParameter.withArguments(name),
               // TODO: pass variable declarations instead of
               // parameter names for proper location detection.
@@ -1941,7 +1950,7 @@
         debugExprUri,
         /*packageUri*/ null,
         new ImplicitLanguageVersion(libraryBuilder.library.languageVersion),
-        userCode.loader,
+        userCode!.loader,
         null,
         scope: libraryBuilder.scope.createNestedScope("expression"),
         nameOrigin: libraryBuilder,
@@ -1953,7 +1962,7 @@
             in libraryBuilder.library.dependencies) {
           if (!dependency.isImport) continue;
 
-          List<Combinator> combinators;
+          List<Combinator>? combinators;
 
           for (kernel.Combinator combinator in dependency.combinators) {
             combinators ??= <Combinator>[];
@@ -1967,7 +1976,7 @@
 
           debugLibrary.addImport(
               null,
-              dependency.importedLibraryReference.canonicalName.name,
+              dependency.importedLibraryReference.canonicalName!.name,
               null,
               dependency.name,
               combinators,
@@ -1982,7 +1991,7 @@
         ticker.logMs("Added imports");
       }
 
-      HybridFileSystem hfs = userCode.fileSystem;
+      HybridFileSystem hfs = userCode!.fileSystem as HybridFileSystem;
       MemoryFileSystem fs = hfs.memory;
       fs.entityForUri(debugExprUri).writeAsStringSync(expression);
 
@@ -1998,8 +2007,8 @@
                         cls?.fileOffset ?? libraryBuilder.library.fileOffset)
               .toList());
 
-      debugLibrary.build(userCode.loader.coreLibrary, modifyTarget: false);
-      Expression compiledExpression = await userCode.loader.buildExpression(
+      debugLibrary.build(userCode!.loader.coreLibrary, modifyTarget: false);
+      Expression compiledExpression = await userCode!.loader.buildExpression(
           debugLibrary, className, className != null && !isStatic, parameters);
 
       Procedure procedure = new Procedure(
@@ -2013,21 +2022,21 @@
       procedure.fileUri = debugLibrary.fileUri;
       procedure.parent = className != null ? cls : libraryBuilder.library;
 
-      userCode.uriToSource.remove(debugExprUri);
-      userCode.loader.sourceBytes.remove(debugExprUri);
+      userCode!.uriToSource.remove(debugExprUri);
+      userCode!.loader.sourceBytes.remove(debugExprUri);
 
       // Make sure the library has a canonical name.
       Component c = new Component(libraries: [debugLibrary.library]);
       c.computeCanonicalNames();
       ticker.logMs("Built debug library");
 
-      userCode.runProcedureTransformations(procedure);
+      userCode!.runProcedureTransformations(procedure);
 
       return procedure;
     });
   }
 
-  bool packagesEqual(Package a, Package b) {
+  bool packagesEqual(Package? a, Package? b) {
     if (a == null || b == null) return false;
     if (a.name != b.name) return false;
     if (a.root != b.root) return false;
@@ -2038,12 +2047,12 @@
   }
 
   /// Internal method.
-  ReusageResult computeReusedLibraries(Set<Uri> invalidatedUris,
+  ReusageResult computeReusedLibraries(Set<Uri?> invalidatedUris,
       UriTranslator uriTranslator, List<Uri> entryPoints) {
     Set<Uri> seenUris = new Set<Uri>();
     List<LibraryBuilder> reusedLibraries = <LibraryBuilder>[];
-    for (int i = 0; i < platformBuilders.length; i++) {
-      LibraryBuilder builder = platformBuilders[i];
+    for (int i = 0; i < platformBuilders!.length; i++) {
+      LibraryBuilder builder = platformBuilders![i];
       if (!seenUris.add(builder.importUri)) continue;
       reusedLibraries.add(builder);
     }
@@ -2056,13 +2065,13 @@
 
     // Maps all non-platform LibraryBuilders from their import URI.
     Map<Uri, LibraryBuilder> builders = <Uri, LibraryBuilder>{};
-    Map<Uri, LibraryBuilder> partUriToParent = <Uri, LibraryBuilder>{};
+    Map<Uri?, LibraryBuilder> partUriToParent = <Uri, LibraryBuilder>{};
 
     // Invalidated URIs translated back to their import URI (package:, dart:,
     // etc.).
     List<Uri> invalidatedImportUris = <Uri>[];
 
-    bool isInvalidated(Uri importUri, Uri fileUri) {
+    bool isInvalidated(Uri importUri, Uri? fileUri) {
       if (invalidatedUris.contains(importUri)) return true;
       if (importUri != fileUri && invalidatedUris.contains(fileUri)) {
         return true;
@@ -2075,9 +2084,9 @@
         int firstSlash = path.indexOf('/');
         String packageName = path.substring(0, firstSlash);
         if (previousPackagesMap == null ||
-            !packagesEqual(previousPackagesMap[packageName],
-                currentPackagesMap[packageName])) {
-          Uri newFileUri = uriTranslator.translate(importUri, false);
+            !packagesEqual(previousPackagesMap![packageName],
+                currentPackagesMap![packageName])) {
+          Uri? newFileUri = uriTranslator.translate(importUri, false);
           if (newFileUri != fileUri) {
             invalidatedBecauseOfPackageUpdate = true;
             return true;
@@ -2112,7 +2121,7 @@
       } else if (libraryBuilder is DillLibraryBuilder) {
         for (LibraryPart part in libraryBuilder.library.parts) {
           Uri partUri = getPartUri(libraryBuilder.importUri, part);
-          Uri fileUri = getPartFileUri(
+          Uri? fileUri = getPartFileUri(
               libraryBuilder.library.fileUri, part, uriTranslator);
           partUriToParent[partUri] = libraryBuilder;
           partUriToParent[fileUri] = libraryBuilder;
@@ -2133,17 +2142,17 @@
 
     if (userCode != null) {
       // userCode already contains the builders from userBuilders.
-      userCode.loader.builders.forEach(addBuilderAndInvalidateUris);
+      userCode!.loader.builders.forEach(addBuilderAndInvalidateUris);
     } else {
       // userCode was null so we explicitly have to add the builders from
       // userBuilders (which cannot be null as we checked initially that one of
       // them was non-null).
-      userBuilders.forEach(addBuilderAndInvalidateUris);
+      userBuilders!.forEach(addBuilderAndInvalidateUris);
     }
 
     recordInvalidatedImportUrisForTesting(invalidatedImportUris);
     for (Uri uri in invalidatedImportUris) {
-      directlyInvalidated.add(builders[uri]);
+      directlyInvalidated.add(builders[uri]!);
     }
 
     BuilderGraph graph = new BuilderGraph(builders);
@@ -2161,16 +2170,16 @@
     List<Uri> workList = invalidatedImportUris;
     while (workList.isNotEmpty) {
       Uri removed = workList.removeLast();
-      LibraryBuilder current = builders.remove(removed);
+      LibraryBuilder? current = builders.remove(removed);
       // [current] is null if the corresponding key (URI) has already been
       // removed.
       if (current != null) {
-        Set<Uri> s = directDependencies[current.importUri];
+        Set<Uri>? s = directDependencies[current.importUri];
         if (current.importUri != removed) {
           if (s == null) {
             s = directDependencies[removed];
           } else {
-            s.addAll(directDependencies[removed]);
+            s.addAll(directDependencies[removed]!);
           }
         }
         if (s != null) {
@@ -2201,7 +2210,7 @@
         reusedLibraries);
 
     for (Uri entryPoint in entryPoints) {
-      LibraryBuilder parent = partUriToParent[entryPoint];
+      LibraryBuilder? parent = partUriToParent[entryPoint];
       if (parent == null) continue;
       // TODO(jensj): .contains on a list is O(n).
       // It will only be done for each entry point that's a part though, i.e.
@@ -2216,17 +2225,17 @@
   }
 
   @override
-  void invalidate(Uri uri) {
+  void invalidate(Uri? uri) {
     invalidatedUris.add(uri);
   }
 
   @override
   void invalidateAllSources() {
     if (userCode != null) {
-      Set<Uri> uris = new Set<Uri>.from(userCode.loader.builders.keys);
-      uris.removeAll(dillLoadedData.loader.builders.keys);
+      Set<Uri> uris = new Set<Uri>.from(userCode!.loader.builders.keys);
+      uris.removeAll(dillLoadedData!.loader.builders.keys);
       if (previousSourceBuilders != null) {
-        for (Library library in previousSourceBuilders) {
+        for (Library library in previousSourceBuilders!) {
           uris.add(library.importUri);
         }
       }
@@ -2326,8 +2335,8 @@
 }
 
 class IncrementalCompilerData {
-  Component component = null;
-  List<int> initializationBytes = null;
+  Component? component = null;
+  List<int>? initializationBytes = null;
 }
 
 class ReusageResult {
@@ -2346,9 +2355,13 @@
   ReusageResult(this.notReusedLibraries, this.directlyInvalidated,
       this.invalidatedBecauseOfPackageUpdate, this.reusedLibraries)
       : _reusedLibrariesPartsToParentForEntryPoints = {},
+        // ignore: unnecessary_null_comparison
         assert(notReusedLibraries != null),
+        // ignore: unnecessary_null_comparison
         assert(directlyInvalidated != null),
+        // ignore: unnecessary_null_comparison
         assert(invalidatedBecauseOfPackageUpdate != null),
+        // ignore: unnecessary_null_comparison
         assert(reusedLibraries != null);
 
   void registerLibraryUriForPartUsedAsEntryPoint(
@@ -2359,7 +2372,7 @@
   bool arePartsUsedAsEntryPoints() =>
       _reusedLibrariesPartsToParentForEntryPoints.isNotEmpty;
 
-  Uri getLibraryUriForPartUsedAsEntryPoint(Uri entryPoint) =>
+  Uri? getLibraryUriForPartUsedAsEntryPoint(Uri entryPoint) =>
       _reusedLibrariesPartsToParentForEntryPoints[entryPoint];
 }
 
@@ -2370,15 +2383,18 @@
 
   ExperimentalInvalidation(
       this.rebuildBodies, this.originalNotReusedLibraries, this.missingSources)
+      // ignore: unnecessary_null_comparison
       : assert(rebuildBodies != null),
+        // ignore: unnecessary_null_comparison
         assert(originalNotReusedLibraries != null),
+        // ignore: unnecessary_null_comparison
         assert(missingSources != null);
 }
 
 class IncrementalKernelTarget extends KernelTarget
     implements ChangedStructureNotifier {
-  Set<Class> classHierarchyChanges;
-  Set<Class> classMemberChanges;
+  Set<Class>? classHierarchyChanges;
+  Set<Class>? classMemberChanges;
 
   IncrementalKernelTarget(FileSystem fileSystem, bool includeComments,
       DillTarget dillTarget, UriTranslator uriTranslator)
@@ -2389,12 +2405,12 @@
   @override
   void registerClassMemberChange(Class c) {
     classMemberChanges ??= new Set<Class>();
-    classMemberChanges.add(c);
+    classMemberChanges!.add(c);
   }
 
   @override
   void registerClassHierarchyChange(Class cls) {
     classHierarchyChanges ??= <Class>{};
-    classHierarchyChanges.add(cls);
+    classHierarchyChanges!.add(cls);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/library_graph.dart b/pkg/front_end/lib/src/fasta/library_graph.dart
index 5b93e51..bc01000 100644
--- a/pkg/front_end/lib/src/fasta/library_graph.dart
+++ b/pkg/front_end/lib/src/fasta/library_graph.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.9
-
 library fasta.library_graph;
 
 import 'package:kernel/kernel.dart'
@@ -21,7 +19,7 @@
   Iterable<Uri> get vertices => libraries.keys;
 
   Iterable<Uri> neighborsOf(Uri vertex) sync* {
-    Library library = libraries[vertex];
+    Library? library = libraries[vertex];
     if (library == null) {
       throw "Library not found: $vertex";
     }
@@ -32,6 +30,7 @@
       Uri uri2 = dependency.targetLibrary.fileUri;
       if (libraries.containsKey(uri1)) {
         yield uri1;
+        // ignore: unnecessary_null_comparison
       } else if (uri2 != null) {
         if (libraries.containsKey(uri2)) {
           yield uri2;
diff --git a/pkg/front_end/lib/src/fasta/source/directive_listener.dart b/pkg/front_end/lib/src/fasta/source/directive_listener.dart
index 3c29fe1..a7915a4 100644
--- a/pkg/front_end/lib/src/fasta/source/directive_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/directive_listener.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.9
-
 /// Listener used in combination with `TopLevelParser` to extract the URIs of
 /// import, part, and export directives.
 library front_end.src.fasta.source.directive_listener;
@@ -29,12 +27,12 @@
   final List<NamespaceDirective> exports = <NamespaceDirective>[];
 
   /// Collects URIs that occur on any part directive.
-  final Set<String> parts = new Set<String>();
+  final Set<String?> parts = new Set<String?>();
 
   bool _inPart = false;
-  String _uri;
-  List<NamespaceCombinator> _combinators;
-  List<String> _combinatorNames;
+  String? _uri;
+  List<NamespaceCombinator>? _combinators;
+  List<String>? _combinatorNames;
 
   DirectiveListener();
 
@@ -79,12 +77,12 @@
 
   @override
   void endHide(Token hide) {
-    _combinators.add(new NamespaceCombinator.hide(_combinatorNames));
+    _combinators!.add(new NamespaceCombinator.hide(_combinatorNames!));
     _combinatorNames = null;
   }
 
   @override
-  endImport(Token import, Token semicolon) {
+  endImport(Token? import, Token? semicolon) {
     imports.add(new NamespaceDirective.import(_uri, _combinators));
     _uri = null;
     _combinators = null;
@@ -99,14 +97,14 @@
 
   @override
   void endShow(Token show) {
-    _combinators.add(new NamespaceCombinator.show(_combinatorNames));
+    _combinators!.add(new NamespaceCombinator.show(_combinatorNames!));
     _combinatorNames = null;
   }
 
   @override
   void handleIdentifier(Token token, IdentifierContext context) {
     if (_combinatorNames != null && context == IdentifierContext.combinator) {
-      _combinatorNames.add(token.lexeme);
+      _combinatorNames!.add(token.lexeme);
     }
   }
 
@@ -133,8 +131,8 @@
 
 class NamespaceDirective {
   final bool isImport;
-  final String uri;
-  final List<NamespaceCombinator> combinators;
+  final String? uri;
+  final List<NamespaceCombinator>? combinators;
 
   NamespaceDirective.export(this.uri, this.combinators) : isImport = false;
 
diff --git a/pkg/front_end/lib/src/fasta/util/bytes_sink.dart b/pkg/front_end/lib/src/fasta/util/bytes_sink.dart
index 4e3b61f..d945e92 100644
--- a/pkg/front_end/lib/src/fasta/util/bytes_sink.dart
+++ b/pkg/front_end/lib/src/fasta/util/bytes_sink.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.9
-
 import 'dart:io' show BytesBuilder;
 
 // TODO(ahe): https://github.com/dart-lang/sdk/issues/28316
diff --git a/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart b/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart
index 424a9aa..d32f428 100644
--- a/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart
+++ b/pkg/front_end/lib/src/fasta/util/direct_parser_ast.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.9
-
 import 'dart:typed_data' show Uint8List;
 
 import 'dart:io' show File;
@@ -45,6 +43,7 @@
     },
   );
   Token firstToken = scanner.tokenize();
+  // ignore: unnecessary_null_comparison
   if (firstToken == null) {
     throw "firstToken is null";
   }
@@ -57,7 +56,7 @@
     parser = new ClassMemberParser(listener);
   }
   parser.parseUnit(firstToken);
-  return listener.data.single;
+  return listener.data.single as DirectParserASTContentCompilationUnitEnd;
 }
 
 /// Best-effort visitor for DirectParserASTContent that visits top-level entries
@@ -177,8 +176,8 @@
     }
     if (node is DirectParserASTContentEnumEnd) {
       DirectParserASTContentEnumEnd declaration = node;
-      visitEnum(
-          declaration, declaration.enumKeyword, declaration.leftBrace.endGroup);
+      visitEnum(declaration, declaration.enumKeyword,
+          declaration.leftBrace.endGroup!);
       return;
     }
     if (node is DirectParserASTContentLibraryNameEnd) {
@@ -225,7 +224,7 @@
       DirectParserASTContentMetadataEnd decl = node;
       // TODO(jensj): endToken is not part of the metadata! It's the first token
       // of the next thing.
-      visitMetadata(decl, decl.beginToken, decl.endToken.previous);
+      visitMetadata(decl, decl.beginToken, decl.endToken.previous!);
       return;
     }
 
@@ -234,16 +233,16 @@
 
   void visitChildren(DirectParserASTContent node) {
     if (node.children == null) return;
-    final int numChildren = node.children.length;
+    final int numChildren = node.children!.length;
     for (int i = 0; i < numChildren; i++) {
-      DirectParserASTContent child = node.children[i];
+      DirectParserASTContent child = node.children![i];
       accept(child);
     }
   }
 
   /// Note: Implementers are NOT expected to call visitChildren on this node.
   void visitImport(DirectParserASTContentImportEnd node, Token startInclusive,
-      Token endInclusive) {}
+      Token? endInclusive) {}
 
   /// Note: Implementers are NOT expected to call visitChildren on this node.
   void visitExport(DirectParserASTContentExportEnd node, Token startInclusive,
@@ -360,11 +359,11 @@
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first
+    if (children!.first
         is! DirectParserASTContentClassOrNamedMixinApplicationPreludeBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentClassDeclarationEnd) {
+    if (children!.last is! DirectParserASTContentClassDeclarationEnd) {
       return false;
     }
 
@@ -373,18 +372,18 @@
 
   DirectParserASTContentClassDeclarationEnd asClass() {
     if (!isClass()) throw "Not class";
-    return children.last;
+    return children!.last as DirectParserASTContentClassDeclarationEnd;
   }
 
   bool isImport() {
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first
+    if (children!.first
         is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentImportEnd) {
+    if (children!.last is! DirectParserASTContentImportEnd) {
       return false;
     }
 
@@ -393,18 +392,18 @@
 
   DirectParserASTContentImportEnd asImport() {
     if (!isImport()) throw "Not import";
-    return children.last;
+    return children!.last as DirectParserASTContentImportEnd;
   }
 
   bool isExport() {
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first
+    if (children!.first
         is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentExportEnd) {
+    if (children!.last is! DirectParserASTContentExportEnd) {
       return false;
     }
 
@@ -413,18 +412,18 @@
 
   DirectParserASTContentExportEnd asExport() {
     if (!isExport()) throw "Not export";
-    return children.last;
+    return children!.last as DirectParserASTContentExportEnd;
   }
 
   bool isEnum() {
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first
+    if (children!.first
         is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentEnumEnd) {
+    if (children!.last is! DirectParserASTContentEnumEnd) {
       return false;
     }
 
@@ -433,18 +432,18 @@
 
   DirectParserASTContentEnumEnd asEnum() {
     if (!isEnum()) throw "Not enum";
-    return children.last;
+    return children!.last as DirectParserASTContentEnumEnd;
   }
 
   bool isTypedef() {
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first
+    if (children!.first
         is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentFunctionTypeAliasEnd) {
+    if (children!.last is! DirectParserASTContentFunctionTypeAliasEnd) {
       return false;
     }
 
@@ -453,7 +452,7 @@
 
   DirectParserASTContentFunctionTypeAliasEnd asTypedef() {
     if (!isTypedef()) throw "Not typedef";
-    return children.last;
+    return children!.last as DirectParserASTContentFunctionTypeAliasEnd;
   }
 
   bool isScript() {
@@ -465,18 +464,18 @@
 
   DirectParserASTContentScriptHandle asScript() {
     if (!isScript()) throw "Not script";
-    return this;
+    return this as DirectParserASTContentScriptHandle;
   }
 
   bool isExtension() {
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first
+    if (children!.first
         is! DirectParserASTContentExtensionDeclarationPreludeBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentExtensionDeclarationEnd) {
+    if (children!.last is! DirectParserASTContentExtensionDeclarationEnd) {
       return false;
     }
 
@@ -485,17 +484,17 @@
 
   DirectParserASTContentExtensionDeclarationEnd asExtension() {
     if (!isExtension()) throw "Not extension";
-    return children.last;
+    return children!.last as DirectParserASTContentExtensionDeclarationEnd;
   }
 
   bool isInvalidTopLevelDeclaration() {
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first is! DirectParserASTContentTopLevelMemberBegin) {
+    if (children!.first is! DirectParserASTContentTopLevelMemberBegin) {
       return false;
     }
-    if (children.last
+    if (children!.last
         is! DirectParserASTContentInvalidTopLevelDeclarationHandle) {
       return false;
     }
@@ -507,11 +506,11 @@
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first
+    if (children!.first
         is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentRecoverableErrorHandle) {
+    if (children!.last is! DirectParserASTContentRecoverableErrorHandle) {
       return false;
     }
 
@@ -522,11 +521,11 @@
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first
+    if (children!.first
         is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentRecoverImportHandle) {
+    if (children!.last is! DirectParserASTContentRecoverImportHandle) {
       return false;
     }
 
@@ -537,11 +536,11 @@
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first
+    if (children!.first
         is! DirectParserASTContentClassOrNamedMixinApplicationPreludeBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentMixinDeclarationEnd) {
+    if (children!.last is! DirectParserASTContentMixinDeclarationEnd) {
       return false;
     }
 
@@ -550,18 +549,18 @@
 
   DirectParserASTContentMixinDeclarationEnd asMixinDeclaration() {
     if (!isMixinDeclaration()) throw "Not mixin declaration";
-    return children.last;
+    return children!.last as DirectParserASTContentMixinDeclarationEnd;
   }
 
   bool isNamedMixinDeclaration() {
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first
+    if (children!.first
         is! DirectParserASTContentClassOrNamedMixinApplicationPreludeBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentNamedMixinApplicationEnd) {
+    if (children!.last is! DirectParserASTContentNamedMixinApplicationEnd) {
       return false;
     }
 
@@ -570,17 +569,17 @@
 
   DirectParserASTContentNamedMixinApplicationEnd asNamedMixinDeclaration() {
     if (!isNamedMixinDeclaration()) throw "Not named mixin declaration";
-    return children.last;
+    return children!.last as DirectParserASTContentNamedMixinApplicationEnd;
   }
 
   bool isTopLevelMethod() {
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first is! DirectParserASTContentTopLevelMemberBegin) {
+    if (children!.first is! DirectParserASTContentTopLevelMemberBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentTopLevelMethodEnd) {
+    if (children!.last is! DirectParserASTContentTopLevelMethodEnd) {
       return false;
     }
 
@@ -589,17 +588,17 @@
 
   DirectParserASTContentTopLevelMethodEnd asTopLevelMethod() {
     if (!isTopLevelMethod()) throw "Not top level method";
-    return children.last;
+    return children!.last as DirectParserASTContentTopLevelMethodEnd;
   }
 
   bool isTopLevelFields() {
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first is! DirectParserASTContentTopLevelMemberBegin) {
+    if (children!.first is! DirectParserASTContentTopLevelMemberBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentTopLevelFieldsEnd) {
+    if (children!.last is! DirectParserASTContentTopLevelFieldsEnd) {
       return false;
     }
 
@@ -608,18 +607,18 @@
 
   DirectParserASTContentTopLevelFieldsEnd asTopLevelFields() {
     if (!isTopLevelFields()) throw "Not top level fields";
-    return children.last;
+    return children!.last as DirectParserASTContentTopLevelFieldsEnd;
   }
 
   bool isLibraryName() {
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first
+    if (children!.first
         is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentLibraryNameEnd) {
+    if (children!.last is! DirectParserASTContentLibraryNameEnd) {
       return false;
     }
 
@@ -628,18 +627,18 @@
 
   DirectParserASTContentLibraryNameEnd asLibraryName() {
     if (!isLibraryName()) throw "Not library name";
-    return children.last;
+    return children!.last as DirectParserASTContentLibraryNameEnd;
   }
 
   bool isPart() {
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first
+    if (children!.first
         is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentPartEnd) {
+    if (children!.last is! DirectParserASTContentPartEnd) {
       return false;
     }
 
@@ -648,18 +647,18 @@
 
   DirectParserASTContentPartEnd asPart() {
     if (!isPart()) throw "Not part";
-    return children.last;
+    return children!.last as DirectParserASTContentPartEnd;
   }
 
   bool isPartOf() {
     if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
       return false;
     }
-    if (children.first
+    if (children!.first
         is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
       return false;
     }
-    if (children.last is! DirectParserASTContentPartOfEnd) {
+    if (children!.last is! DirectParserASTContentPartOfEnd) {
       return false;
     }
 
@@ -668,14 +667,14 @@
 
   DirectParserASTContentPartOfEnd asPartOf() {
     if (!isPartOf()) throw "Not part of";
-    return children.last;
+    return children!.last as DirectParserASTContentPartOfEnd;
   }
 
   bool isMetadata() {
     if (this is! DirectParserASTContentMetadataStarEnd) {
       return false;
     }
-    if (children.first is! DirectParserASTContentMetadataStarBegin) {
+    if (children!.first is! DirectParserASTContentMetadataStarBegin) {
       return false;
     }
     return true;
@@ -683,7 +682,7 @@
 
   DirectParserASTContentMetadataStarEnd asMetadata() {
     if (!isMetadata()) throw "Not metadata";
-    return this;
+    return this as DirectParserASTContentMetadataStarEnd;
   }
 
   bool isFunctionBody() {
@@ -693,7 +692,7 @@
 
   DirectParserASTContentBlockFunctionBodyEnd asFunctionBody() {
     if (!isFunctionBody()) throw "Not function body";
-    return this;
+    return this as DirectParserASTContentBlockFunctionBodyEnd;
   }
 
   List<E> recursivelyFind<E extends DirectParserASTContent>() {
@@ -709,7 +708,7 @@
       return;
     }
     if (node.children == null) return;
-    for (DirectParserASTContent child in node.children) {
+    for (DirectParserASTContent child in node.children!) {
       _recursivelyFindInternal(child, result);
     }
   }
@@ -718,7 +717,7 @@
     print("$indent${runtimeType} (${what}) "
         "(${deprecatedArguments})");
     if (children == null) return;
-    for (DirectParserASTContent child in children) {
+    for (DirectParserASTContent child in children!) {
       child.debugDumpNodeRecursively(indent: "  $indent");
     }
   }
@@ -727,7 +726,7 @@
 extension MetadataStarExtension on DirectParserASTContentMetadataStarEnd {
   List<DirectParserASTContentMetadataEnd> getMetadataEntries() {
     List<DirectParserASTContentMetadataEnd> result = [];
-    for (DirectParserASTContent topLevel in children) {
+    for (DirectParserASTContent topLevel in children!) {
       if (topLevel is! DirectParserASTContentMetadataEnd) continue;
       result.add(topLevel);
     }
@@ -738,36 +737,36 @@
 extension CompilationUnitExtension on DirectParserASTContentCompilationUnitEnd {
   List<DirectParserASTContentTopLevelDeclarationEnd> getClasses() {
     List<DirectParserASTContentTopLevelDeclarationEnd> result = [];
-    for (DirectParserASTContent topLevel in children) {
+    for (DirectParserASTContent topLevel in children!) {
       if (!topLevel.isClass()) continue;
-      result.add(topLevel);
+      result.add(topLevel as DirectParserASTContentTopLevelDeclarationEnd);
     }
     return result;
   }
 
   List<DirectParserASTContentTopLevelDeclarationEnd> getMixinDeclarations() {
     List<DirectParserASTContentTopLevelDeclarationEnd> result = [];
-    for (DirectParserASTContent topLevel in children) {
+    for (DirectParserASTContent topLevel in children!) {
       if (!topLevel.isMixinDeclaration()) continue;
-      result.add(topLevel);
+      result.add(topLevel as DirectParserASTContentTopLevelDeclarationEnd);
     }
     return result;
   }
 
   List<DirectParserASTContentImportEnd> getImports() {
     List<DirectParserASTContentImportEnd> result = [];
-    for (DirectParserASTContent topLevel in children) {
+    for (DirectParserASTContent topLevel in children!) {
       if (!topLevel.isImport()) continue;
-      result.add(topLevel.children.last);
+      result.add(topLevel.children!.last as DirectParserASTContentImportEnd);
     }
     return result;
   }
 
   List<DirectParserASTContentExportEnd> getExports() {
     List<DirectParserASTContentExportEnd> result = [];
-    for (DirectParserASTContent topLevel in children) {
+    for (DirectParserASTContent topLevel in children!) {
       if (!topLevel.isExport()) continue;
-      result.add(topLevel.children.last);
+      result.add(topLevel.children!.last as DirectParserASTContentExportEnd);
     }
     return result;
   }
@@ -818,14 +817,14 @@
   // }
 
   DirectParserASTContentCompilationUnitBegin getBegin() {
-    return children.first;
+    return children!.first as DirectParserASTContentCompilationUnitBegin;
   }
 }
 
 extension TopLevelDeclarationExtension
     on DirectParserASTContentTopLevelDeclarationEnd {
   DirectParserASTContentIdentifierHandle getIdentifier() {
-    for (DirectParserASTContent child in children) {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentIdentifierHandle) return child;
     }
     throw "Not found.";
@@ -835,7 +834,7 @@
     if (!isClass()) {
       throw "Not a class";
     }
-    for (DirectParserASTContent child in children) {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentClassDeclarationEnd) {
         return child;
       }
@@ -847,7 +846,7 @@
 extension MixinDeclarationExtension
     on DirectParserASTContentMixinDeclarationEnd {
   DirectParserASTContentClassOrMixinBodyEnd getClassOrMixinBody() {
-    for (DirectParserASTContent child in children) {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentClassOrMixinBodyEnd) return child;
     }
     throw "Not found.";
@@ -857,21 +856,21 @@
 extension ClassDeclarationExtension
     on DirectParserASTContentClassDeclarationEnd {
   DirectParserASTContentClassOrMixinBodyEnd getClassOrMixinBody() {
-    for (DirectParserASTContent child in children) {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentClassOrMixinBodyEnd) return child;
     }
     throw "Not found.";
   }
 
   DirectParserASTContentClassExtendsHandle getClassExtends() {
-    for (DirectParserASTContent child in children) {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentClassExtendsHandle) return child;
     }
     throw "Not found.";
   }
 
   DirectParserASTContentClassOrMixinImplementsHandle getClassImplements() {
-    for (DirectParserASTContent child in children) {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentClassOrMixinImplementsHandle) {
         return child;
       }
@@ -879,8 +878,8 @@
     throw "Not found.";
   }
 
-  DirectParserASTContentClassWithClauseHandle getClassWithClause() {
-    for (DirectParserASTContent child in children) {
+  DirectParserASTContentClassWithClauseHandle? getClassWithClause() {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentClassWithClauseHandle) {
         return child;
       }
@@ -893,7 +892,7 @@
     on DirectParserASTContentClassOrMixinBodyEnd {
   List<DirectParserASTContentMemberEnd> getMembers() {
     List<DirectParserASTContentMemberEnd> members = [];
-    for (DirectParserASTContent child in children) {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentMemberEnd) {
         members.add(child);
       }
@@ -904,136 +903,140 @@
 
 extension MemberExtension on DirectParserASTContentMemberEnd {
   bool isClassConstructor() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentClassConstructorEnd) return true;
     return false;
   }
 
   DirectParserASTContentClassConstructorEnd getClassConstructor() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentClassConstructorEnd) return child;
     throw "Not found";
   }
 
   bool isClassFactoryMethod() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentClassFactoryMethodEnd) return true;
     return false;
   }
 
   DirectParserASTContentClassFactoryMethodEnd getClassFactoryMethod() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentClassFactoryMethodEnd) return child;
     throw "Not found";
   }
 
   bool isClassFields() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentClassFieldsEnd) return true;
     return false;
   }
 
   DirectParserASTContentClassFieldsEnd getClassFields() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentClassFieldsEnd) return child;
     throw "Not found";
   }
 
   bool isMixinFields() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentMixinFieldsEnd) return true;
     return false;
   }
 
   DirectParserASTContentMixinFieldsEnd getMixinFields() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentMixinFieldsEnd) return child;
     throw "Not found";
   }
 
   bool isMixinMethod() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentMixinMethodEnd) return true;
     return false;
   }
 
   DirectParserASTContentMixinMethodEnd getMixinMethod() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentMixinMethodEnd) return child;
     throw "Not found";
   }
 
   bool isMixinFactoryMethod() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentMixinFactoryMethodEnd) return true;
     return false;
   }
 
   DirectParserASTContentMixinFactoryMethodEnd getMixinFactoryMethod() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentMixinFactoryMethodEnd) return child;
     throw "Not found";
   }
 
   bool isMixinConstructor() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentMixinConstructorEnd) return true;
     return false;
   }
 
   DirectParserASTContentMixinConstructorEnd getMixinConstructor() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentMixinConstructorEnd) return child;
     throw "Not found";
   }
 
   bool isClassMethod() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentClassMethodEnd) return true;
     return false;
   }
 
   DirectParserASTContentClassMethodEnd getClassMethod() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentClassMethodEnd) return child;
     throw "Not found";
   }
 
   bool isClassRecoverableError() {
-    DirectParserASTContent child = children[1];
+    DirectParserASTContent child = children![1];
     if (child is DirectParserASTContentRecoverableErrorHandle) return true;
     return false;
   }
 }
 
 extension ClassFieldsExtension on DirectParserASTContentClassFieldsEnd {
-  List<DirectParserASTContentIdentifierHandle> getFieldIdentifiers() {
+  List<DirectParserASTContentIdentifierHandle?> getFieldIdentifiers() {
     // For now blindly assume that the last count identifiers are the names
     // of the fields.
     int countLeft = count;
-    List<DirectParserASTContentIdentifierHandle> identifiers =
-        new List<DirectParserASTContentIdentifierHandle>.filled(count, null);
-    for (int i = children.length - 1; i >= 0; i--) {
-      DirectParserASTContent child = children[i];
+    List<DirectParserASTContentIdentifierHandle>? identifiers;
+    for (int i = children!.length - 1; i >= 0; i--) {
+      DirectParserASTContent child = children![i];
       if (child is DirectParserASTContentIdentifierHandle) {
         countLeft--;
-        identifiers[countLeft] = child;
+        if (identifiers == null) {
+          identifiers = new List<DirectParserASTContentIdentifierHandle>.filled(
+              count, child);
+        } else {
+          identifiers[countLeft] = child;
+        }
         if (countLeft == 0) break;
       }
     }
     if (countLeft != 0) throw "Didn't find the expected number of identifiers";
-    return identifiers;
+    return identifiers ?? [];
   }
 
-  DirectParserASTContentTypeHandle getFirstType() {
-    for (DirectParserASTContent child in children) {
+  DirectParserASTContentTypeHandle? getFirstType() {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentTypeHandle) return child;
     }
     return null;
   }
 
-  DirectParserASTContentFieldInitializerEnd getFieldInitializer() {
-    for (DirectParserASTContent child in children) {
+  DirectParserASTContentFieldInitializerEnd? getFieldInitializer() {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentFieldInitializerEnd) return child;
     }
     return null;
@@ -1041,8 +1044,8 @@
 }
 
 extension ClassMethodExtension on DirectParserASTContentClassMethodEnd {
-  DirectParserASTContentBlockFunctionBodyEnd getBlockFunctionBody() {
-    for (DirectParserASTContent child in children) {
+  DirectParserASTContentBlockFunctionBodyEnd? getBlockFunctionBody() {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentBlockFunctionBodyEnd) {
         return child;
       }
@@ -1054,7 +1057,7 @@
 extension ClassConstructorExtension
     on DirectParserASTContentClassConstructorEnd {
   DirectParserASTContentFormalParametersEnd getFormalParameters() {
-    for (DirectParserASTContent child in children) {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentFormalParametersEnd) {
         return child;
       }
@@ -1062,8 +1065,8 @@
     throw "Not found";
   }
 
-  DirectParserASTContentInitializersEnd getInitializers() {
-    for (DirectParserASTContent child in children) {
+  DirectParserASTContentInitializersEnd? getInitializers() {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentInitializersEnd) {
         return child;
       }
@@ -1071,8 +1074,8 @@
     return null;
   }
 
-  DirectParserASTContentBlockFunctionBodyEnd getBlockFunctionBody() {
-    for (DirectParserASTContent child in children) {
+  DirectParserASTContentBlockFunctionBodyEnd? getBlockFunctionBody() {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentBlockFunctionBodyEnd) {
         return child;
       }
@@ -1085,7 +1088,7 @@
     on DirectParserASTContentFormalParametersEnd {
   List<DirectParserASTContentFormalParameterEnd> getFormalParameters() {
     List<DirectParserASTContentFormalParameterEnd> result = [];
-    for (DirectParserASTContent child in children) {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentFormalParameterEnd) {
         result.add(child);
       }
@@ -1093,9 +1096,9 @@
     return result;
   }
 
-  DirectParserASTContentOptionalFormalParametersEnd
+  DirectParserASTContentOptionalFormalParametersEnd?
       getOptionalFormalParameters() {
-    for (DirectParserASTContent child in children) {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentOptionalFormalParametersEnd) {
         return child;
       }
@@ -1106,7 +1109,7 @@
 
 extension FormalParameterExtension on DirectParserASTContentFormalParameterEnd {
   DirectParserASTContentFormalParameterBegin getBegin() {
-    return children.first;
+    return children!.first as DirectParserASTContentFormalParameterBegin;
   }
 }
 
@@ -1114,7 +1117,7 @@
     on DirectParserASTContentOptionalFormalParametersEnd {
   List<DirectParserASTContentFormalParameterEnd> getFormalParameters() {
     List<DirectParserASTContentFormalParameterEnd> result = [];
-    for (DirectParserASTContent child in children) {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentFormalParameterEnd) {
         result.add(child);
       }
@@ -1126,7 +1129,7 @@
 extension InitializersExtension on DirectParserASTContentInitializersEnd {
   List<DirectParserASTContentInitializerEnd> getInitializers() {
     List<DirectParserASTContentInitializerEnd> result = [];
-    for (DirectParserASTContent child in children) {
+    for (DirectParserASTContent child in children!) {
       if (child is DirectParserASTContentInitializerEnd) {
         result.add(child);
       }
@@ -1135,13 +1138,13 @@
   }
 
   DirectParserASTContentInitializersBegin getBegin() {
-    return children.first;
+    return children!.first as DirectParserASTContentInitializersBegin;
   }
 }
 
 extension InitializerExtension on DirectParserASTContentInitializerEnd {
   DirectParserASTContentInitializerBegin getBegin() {
-    return children.first;
+    return children!.first as DirectParserASTContentInitializerBegin;
   }
 }
 
@@ -1188,7 +1191,7 @@
       case DirectParserASTType.END:
         // End should gobble up everything until the corresponding begin (which
         // should be the latest begin).
-        int beginIndex;
+        int? beginIndex;
         for (int i = data.length - 1; i >= 0; i--) {
           if (data[i].type == DirectParserASTType.BEGIN) {
             beginIndex = i;
@@ -1261,7 +1264,7 @@
   }
 
   @override
-  void reportVarianceModifierNotEnabled(Token variance) {
+  void reportVarianceModifierNotEnabled(Token? variance) {
     throw new UnimplementedError();
   }
 
diff --git a/pkg/front_end/lib/src/fasta/util/textual_outline.dart b/pkg/front_end/lib/src/fasta/util/textual_outline.dart
index 9af08ca..d8785df 100644
--- a/pkg/front_end/lib/src/fasta/util/textual_outline.dart
+++ b/pkg/front_end/lib/src/fasta/util/textual_outline.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.9
-
 import 'dart:typed_data' show Uint8List;
 
 import 'dart:io' show File;
@@ -29,9 +27,9 @@
 import '../messages.dart' show Message;
 
 abstract class _Chunk implements Comparable<_Chunk> {
-  int originalPosition;
+  late int originalPosition;
 
-  List<_MetadataChunk> metadata;
+  List<_MetadataChunk>? metadata;
 
   void _printNormalHeaderWithMetadata(
       StringBuffer sb, bool extraLine, String indent) {
@@ -47,7 +45,7 @@
 
   void printMetadata(StringBuffer sb, String indent) {
     if (metadata != null) {
-      for (_MetadataChunk m in metadata) {
+      for (_MetadataChunk m in metadata!) {
         m.printMetadataOn(sb, indent);
       }
     }
@@ -79,7 +77,7 @@
     int endOfLast = fromToken.end;
     Token token = fromToken;
     Token afterEnd = toToken;
-    if (includeToToken) afterEnd = toToken.next;
+    if (includeToToken) afterEnd = toToken.next!;
     bool nextTokenIsEndGroup = false;
     while (token != afterEnd) {
       if (token.offset > endOfLast && !nextTokenIsEndGroup) {
@@ -91,10 +89,10 @@
       if (skipContentOnEndGroupUntilToToken &&
           token.endGroup != null &&
           token.endGroup == toToken) {
-        token = token.endGroup;
+        token = token.endGroup!;
         nextTokenIsEndGroup = true;
       } else {
-        token = token.next;
+        token = token.next!;
         nextTokenIsEndGroup = false;
       }
     }
@@ -164,8 +162,8 @@
     int steps = 0;
     while (thisToken.lexeme == otherToken.lexeme) {
       if (steps++ > 10) break;
-      thisToken = thisToken.next;
-      otherToken = otherToken.next;
+      thisToken = thisToken.next!;
+      otherToken = otherToken.next!;
     }
     if (thisToken.lexeme == otherToken.lexeme) return super.compareTo(o);
     return thisToken.lexeme.compareTo(otherToken.lexeme);
@@ -202,9 +200,9 @@
 }
 
 abstract class _SingleImportExportChunk extends _SortableChunk {
-  final Token firstShowOrHide;
-  final List<_NamespaceCombinator> combinators;
-  String sortedShowAndHide;
+  final Token? firstShowOrHide;
+  final List<_NamespaceCombinator>? combinators;
+  String? sortedShowAndHide;
 
   _SingleImportExportChunk(
       Token startToken, Token endToken, this.firstShowOrHide, this.combinators)
@@ -214,9 +212,9 @@
   void internalMergeAndSort(StringBuffer sb) {
     assert(sb.isEmpty);
     if (firstShowOrHide == null) return;
-    for (int i = 0; i < combinators.length; i++) {
+    for (int i = 0; i < combinators!.length; i++) {
       sb.write(" ");
-      _NamespaceCombinator combinator = combinators[i];
+      _NamespaceCombinator combinator = combinators![i];
       sb.write(combinator.isShow ? "show " : "hide ");
       List<String> sorted = combinator.names.toList()..sort();
       for (int j = 0; j < sorted.length; j++) {
@@ -233,20 +231,20 @@
     if (sortedShowAndHide == null) {
       return super._printOnWithoutHeaderAndMetadata(sb);
     }
-    printTokenRange(startToken, firstShowOrHide, sb, includeToToken: false);
+    printTokenRange(startToken, firstShowOrHide!, sb, includeToToken: false);
     sb.write(sortedShowAndHide);
   }
 }
 
 class _ImportChunk extends _SingleImportExportChunk {
-  _ImportChunk(Token startToken, Token endToken, Token firstShowOrHide,
-      List<_NamespaceCombinator> combinators)
+  _ImportChunk(Token startToken, Token endToken, Token? firstShowOrHide,
+      List<_NamespaceCombinator>? combinators)
       : super(startToken, endToken, firstShowOrHide, combinators);
 }
 
 class _ExportChunk extends _SingleImportExportChunk {
-  _ExportChunk(Token startToken, Token endToken, Token firstShowOrHide,
-      List<_NamespaceCombinator> combinators)
+  _ExportChunk(Token startToken, Token endToken, Token? firstShowOrHide,
+      List<_NamespaceCombinator>? combinators)
       : super(startToken, endToken, firstShowOrHide, combinators);
 }
 
@@ -278,8 +276,8 @@
 
 abstract class _ClassChunk extends _SortableChunk {
   List<_Chunk> content = <_Chunk>[];
-  Token headerEnd;
-  Token footerStart;
+  Token? headerEnd;
+  Token? footerStart;
 
   _ClassChunk(Token startToken, Token endToken) : super(startToken, endToken);
 
@@ -288,7 +286,7 @@
     _printNormalHeaderWithMetadata(sb, extraLine, indent);
 
     // Header.
-    printTokenRange(startToken, headerEnd, sb);
+    printTokenRange(startToken, headerEnd!, sb);
 
     // Content.
     for (int i = 0; i < content.length; i++) {
@@ -303,7 +301,7 @@
       }
       sb.write(indent);
 
-      printTokenRange(footerStart, endToken, sb);
+      printTokenRange(footerStart!, endToken, sb);
     }
   }
 
@@ -407,8 +405,8 @@
 }
 
 class _UnknownTokenBuilder {
-  Token start;
-  Token interimEnd;
+  Token? start;
+  Token? interimEnd;
 }
 
 class BoxedInt {
@@ -424,7 +422,7 @@
 //              "show A show B" could just be "show A, B".
 //              "show A, B, C hide A show A" would be empty.
 
-String textualOutline(
+String? textualOutline(
   List<int> rawBytes,
   ScannerConfiguration configuration, {
   bool throwOnUnexpected: false,
@@ -448,6 +446,7 @@
           ..originalPosition = originalPosition.value++);
   });
   Token firstToken = scanner.tokenize();
+  // ignore: unnecessary_null_comparison
   if (firstToken == null) {
     if (throwOnUnexpected) throw "firstToken is null";
     return null;
@@ -460,7 +459,7 @@
     return null;
   }
 
-  Token nextToken = firstToken;
+  Token? nextToken = firstToken;
   _UnknownTokenBuilder currentUnknown = new _UnknownTokenBuilder();
   while (nextToken != null) {
     if (nextToken is ErrorToken) {
@@ -489,11 +488,9 @@
 }
 
 List<_Chunk> _mergeAndSort(List<_Chunk> chunks) {
-  List<_Chunk> result =
-      new List<_Chunk>.filled(chunks.length, null, growable: true);
-  List<_MetadataChunk> metadataChunks;
-  List<_SingleImportExportChunk> importExportChunks;
-  int outSize = 0;
+  List<_Chunk> result = [];
+  List<_MetadataChunk>? metadataChunks;
+  List<_SingleImportExportChunk>? importExportChunks;
   StringBuffer sb = new StringBuffer();
   for (_Chunk chunk in chunks) {
     if (chunk is _MetadataChunk) {
@@ -514,16 +511,16 @@
               importExportChunks, importExportChunks.first.originalPosition);
           importExportChunk.internalMergeAndSort(sb);
           sb.clear();
-          result[outSize++] = importExportChunk;
+          result.add(importExportChunk);
           importExportChunks = null;
         }
-        result[outSize++] = chunk;
+        result.add(chunk);
       }
     }
   }
   if (metadataChunks != null) {
     for (_MetadataChunk metadata in metadataChunks) {
-      result[outSize++] = metadata;
+      result.add(metadata);
     }
   }
   if (importExportChunks != null) {
@@ -531,10 +528,9 @@
         importExportChunks, importExportChunks.first.originalPosition);
     importExportChunk.internalMergeAndSort(sb);
     sb.clear();
-    result[outSize++] = importExportChunk;
+    result.add(importExportChunk);
     importExportChunks = null;
   }
-  result.length = outSize;
 
   result.sort();
   return result;
@@ -542,14 +538,14 @@
 
 /// Parses a chunk of tokens and returns the next - unparsed - token or null
 /// on error.
-Token _textualizeTokens(
+Token? _textualizeTokens(
     TextualOutlineListener listener,
     Token token,
     _UnknownTokenBuilder currentUnknown,
     List<_Chunk> parsedChunks,
     BoxedInt originalPosition,
     bool addMarkerForUnknownForTest) {
-  _ClassChunk classChunk = listener.classStartToChunk[token];
+  _ClassChunk? classChunk = listener.classStartToChunk[token];
   if (classChunk != null) {
     outputUnknownChunk(currentUnknown, parsedChunks, originalPosition,
         addMarkerForUnknownForTest);
@@ -558,7 +554,7 @@
         listener, classChunk, originalPosition, addMarkerForUnknownForTest);
   }
 
-  _SingleImportExportChunk singleImportExport =
+  _SingleImportExportChunk? singleImportExport =
       listener.importExportsStartToChunk[token];
   if (singleImportExport != null) {
     outputUnknownChunk(currentUnknown, parsedChunks, originalPosition,
@@ -568,7 +564,7 @@
     return singleImportExport.endToken.next;
   }
 
-  _TokenChunk knownUnsortableChunk =
+  _TokenChunk? knownUnsortableChunk =
       listener.unsortableElementStartToChunk[token];
   if (knownUnsortableChunk != null) {
     outputUnknownChunk(currentUnknown, parsedChunks, originalPosition,
@@ -578,7 +574,7 @@
     return knownUnsortableChunk.endToken.next;
   }
 
-  _TokenChunk elementChunk = listener.elementStartToChunk[token];
+  _TokenChunk? elementChunk = listener.elementStartToChunk[token];
   if (elementChunk != null) {
     outputUnknownChunk(currentUnknown, parsedChunks, originalPosition,
         addMarkerForUnknownForTest);
@@ -586,7 +582,7 @@
     return elementChunk.endToken.next;
   }
 
-  _MetadataChunk metadataChunk = listener.metadataStartToChunk[token];
+  _MetadataChunk? metadataChunk = listener.metadataStartToChunk[token];
   if (metadataChunk != null) {
     outputUnknownChunk(currentUnknown, parsedChunks, originalPosition,
         addMarkerForUnknownForTest);
@@ -610,10 +606,10 @@
 
 Token _textualizeClass(TextualOutlineListener listener, _ClassChunk classChunk,
     BoxedInt originalPosition, bool addMarkerForUnknownForTest) {
-  Token token = classChunk.startToken;
+  Token? token = classChunk.startToken;
   // Class header.
   while (token != classChunk.endToken) {
-    if (token.endGroup == classChunk.endToken) {
+    if (token!.endGroup == classChunk.endToken) {
       break;
     }
     token = token.next;
@@ -627,11 +623,11 @@
     // class C { }
     // either way, output the end token right away to avoid a weird line break.
   } else {
-    token = token.next;
+    token = token!.next;
     // "Normal" class with (possibly) content.
     _UnknownTokenBuilder currentUnknown = new _UnknownTokenBuilder();
     while (token != classChunk.endToken) {
-      token = _textualizeTokens(listener, token, currentUnknown,
+      token = _textualizeTokens(listener, token!, currentUnknown,
           classChunk.content, originalPosition, addMarkerForUnknownForTest);
     }
     outputUnknownChunk(currentUnknown, classChunk.content, originalPosition,
@@ -639,7 +635,7 @@
     classChunk.footerStart = classChunk.endToken;
   }
 
-  return classChunk.endToken.next;
+  return classChunk.endToken.next!;
 }
 
 /// Outputs an unknown chunk if one has been started.
@@ -652,7 +648,7 @@
     bool addMarkerForUnknownForTest) {
   if (_currentUnknown.start == null) return;
   parsedChunks.add(new _UnknownChunk(addMarkerForUnknownForTest,
-      _currentUnknown.start, _currentUnknown.interimEnd)
+      _currentUnknown.start!, _currentUnknown.interimEnd!)
     ..originalPosition = originalPosition.value++);
   _currentUnknown.start = null;
   _currentUnknown.interimEnd = null;
@@ -663,14 +659,14 @@
   Uint8List data = f.readAsBytesSync();
   ScannerConfiguration scannerConfiguration = new ScannerConfiguration();
   String outline = textualOutline(data, scannerConfiguration,
-      throwOnUnexpected: true, performModelling: true);
+      throwOnUnexpected: true, performModelling: true)!;
   if (args.length > 1 && args[1] == "--overwrite") {
     f.writeAsStringSync(outline);
   } else if (args.length > 1 && args[1] == "--benchmark") {
     Stopwatch stopwatch = new Stopwatch()..start();
     int numRuns = 100;
     for (int i = 0; i < numRuns; i++) {
-      String outline2 = textualOutline(data, scannerConfiguration,
+      String? outline2 = textualOutline(data, scannerConfiguration,
           throwOnUnexpected: true, performModelling: true);
       if (outline2 != outline) throw "Not the same result every time";
     }
@@ -680,7 +676,7 @@
     stopwatch = new Stopwatch()..start();
     numRuns = 2500;
     for (int i = 0; i < numRuns; i++) {
-      String outline2 = textualOutline(data, scannerConfiguration,
+      String? outline2 = textualOutline(data, scannerConfiguration,
           throwOnUnexpected: true, performModelling: true);
       if (outline2 != outline) throw "Not the same result every time";
     }
@@ -701,14 +697,14 @@
   final Map<Token, _TokenChunk> unsortableElementStartToChunk = {};
 
   @override
-  void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     elementStartToChunk[beginToken] =
         new _ClassMethodChunk(beginToken, endToken);
   }
 
   @override
-  void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
+  void endTopLevelMethod(Token beginToken, Token? getOrSet, Token endToken) {
     elementStartToChunk[beginToken] =
         new _TopLevelMethodChunk(beginToken, endToken);
   }
@@ -727,12 +723,12 @@
 
   @override
   void endClassFields(
-      Token abstractToken,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -742,11 +738,11 @@
 
   @override
   void endTopLevelFields(
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -755,14 +751,14 @@
   }
 
   void endFunctionTypeAlias(
-      Token typedefKeyword, Token equals, Token endToken) {
+      Token typedefKeyword, Token? equals, Token endToken) {
     elementStartToChunk[typedefKeyword] =
         new _FunctionTypeAliasChunk(typedefKeyword, endToken);
   }
 
   void endEnum(Token enumKeyword, Token leftBrace, int count) {
     elementStartToChunk[enumKeyword] =
-        new _EnumChunk(enumKeyword, leftBrace.endGroup);
+        new _EnumChunk(enumKeyword, leftBrace.endGroup!);
   }
 
   @override
@@ -785,10 +781,10 @@
   }
 
   @override
-  void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
+  void endMetadata(Token beginToken, Token? periodBeforeName, Token endToken) {
     // Metadata's endToken is the one *after* the actual end of the metadata.
     metadataStartToChunk[beginToken] =
-        new _MetadataChunk(beginToken, endToken.previous);
+        new _MetadataChunk(beginToken, endToken.previous!);
   }
 
   @override
@@ -804,7 +800,7 @@
   }
 
   @override
-  void endExtensionDeclaration(Token extensionKeyword, Token typeKeyword,
+  void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
       Token onKeyword, Token endToken) {
     classStartToChunk[extensionKeyword] =
         new _ExtensionDeclarationChunk(extensionKeyword, endToken);
@@ -812,14 +808,14 @@
 
   @override
   void endNamedMixinApplication(Token beginToken, Token classKeyword,
-      Token equals, Token implementsKeyword, Token endToken) {
+      Token equals, Token? implementsKeyword, Token endToken) {
     classStartToChunk[beginToken] =
         new _NamedMixinApplicationChunk(beginToken, endToken);
   }
 
-  Token firstShowOrHide;
-  List<_NamespaceCombinator> _combinators;
-  List<String> _combinatorNames;
+  Token? firstShowOrHide;
+  List<_NamespaceCombinator>? _combinators;
+  List<String>? _combinatorNames;
 
   @override
   beginExport(Token export) {
@@ -845,25 +841,26 @@
 
   @override
   void endHide(Token hide) {
-    _combinators.add(new _NamespaceCombinator.hide(_combinatorNames));
+    _combinators!.add(new _NamespaceCombinator.hide(_combinatorNames!));
     _combinatorNames = null;
   }
 
   @override
   void endShow(Token show) {
-    _combinators.add(new _NamespaceCombinator.show(_combinatorNames));
+    _combinators!.add(new _NamespaceCombinator.show(_combinatorNames!));
     _combinatorNames = null;
   }
 
   @override
   void handleIdentifier(Token token, IdentifierContext context) {
     if (_combinatorNames != null && context == IdentifierContext.combinator) {
-      _combinatorNames.add(token.lexeme);
+      _combinatorNames!.add(token.lexeme);
     }
   }
 
   @override
-  void endImport(Token importKeyword, Token semicolon) {
+  void endImport(Token importKeyword, Token? semicolon) {
+    // ignore: unnecessary_null_comparison
     if (importKeyword != null && semicolon != null) {
       importExportsStartToChunk[importKeyword] = new _ImportChunk(
           importKeyword, semicolon, firstShowOrHide, _combinators);
diff --git a/pkg/front_end/lib/src/testing/compiler_common.dart b/pkg/front_end/lib/src/testing/compiler_common.dart
index 5f0e775..0ee8f98 100644
--- a/pkg/front_end/lib/src/testing/compiler_common.dart
+++ b/pkg/front_end/lib/src/testing/compiler_common.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.9
-
 /// Common compiler options and helper functions used for testing.
 library front_end.testing.compiler_options_common;
 
@@ -32,10 +30,10 @@
 /// compiles the entry whose name is [fileName].
 ///
 /// Wraps [kernelForProgram] with some default testing options (see [setup]).
-Future<CompilerResult> compileScript(dynamic scriptOrSources,
+Future<CompilerResult?> compileScript(dynamic scriptOrSources,
     {String fileName: 'main.dart',
     List<String> additionalDills: const [],
-    CompilerOptions options,
+    CompilerOptions? options,
     bool retainDataForTesting: false,
     bool requireMain: true}) async {
   options ??= new CompilerOptions();
@@ -54,8 +52,9 @@
 /// Generate a component for a modular compilation unit.
 ///
 /// Wraps [kernelForModule] with some default testing options (see [setup]).
-Future<Component> compileUnit(List<String> inputs, Map<String, dynamic> sources,
-    {List<String> additionalDills: const [], CompilerOptions options}) async {
+Future<Component?> compileUnit(
+    List<String> inputs, Map<String, dynamic> sources,
+    {List<String> additionalDills: const [], CompilerOptions? options}) async {
   options ??= new CompilerOptions();
   await setup(options, sources, additionalDills: additionalDills);
   return (await kernelForModule(inputs.map(toTestUri).toList(), options))
@@ -65,9 +64,9 @@
 /// Generate a summary for a modular compilation unit.
 ///
 /// Wraps [summaryFor] with some default testing options (see [setup]).
-Future<List<int>> summarize(List<String> inputs, Map<String, dynamic> sources,
+Future<List<int>?> summarize(List<String> inputs, Map<String, dynamic> sources,
     {List<String> additionalDills: const [],
-    CompilerOptions options,
+    CompilerOptions? options,
     bool truncate: false}) async {
   options ??= new CompilerOptions();
   await setup(options, sources, additionalDills: additionalDills);
diff --git a/pkg/front_end/lib/src/testing/id_testing_helper.dart b/pkg/front_end/lib/src/testing/id_testing_helper.dart
index 69fb201..084e8a7 100644
--- a/pkg/front_end/lib/src/testing/id_testing_helper.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.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.9
-
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 import 'package:_fe_analyzer_shared/src/testing/id.dart'
     show ActualData, ClassId, Id, IdKind, IdValue, MemberId, NodeId;
@@ -52,8 +50,8 @@
   final String marker;
   final String name;
   final Map<ExperimentalFlag, bool> explicitExperimentalFlags;
-  final AllowedExperimentalFlags allowedExperimentalFlags;
-  final Uri librariesSpecificationUri;
+  final AllowedExperimentalFlags? allowedExperimentalFlags;
+  final Uri? librariesSpecificationUri;
   // TODO(johnniwinther): Tailor support to redefine selected platform
   // classes/members only.
   final bool compileSdk;
@@ -89,7 +87,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<T>> actualMap,
-      {bool verbose}) {}
+      {bool? verbose}) {}
 
   /// Function that computes a data mapping for [cls].
   ///
@@ -99,7 +97,7 @@
       InternalCompilerResult compilerResult,
       Class cls,
       Map<Id, ActualData<T>> actualMap,
-      {bool verbose}) {}
+      {bool? verbose}) {}
 
   /// Function that computes a data mapping for [extension].
   ///
@@ -109,7 +107,7 @@
       InternalCompilerResult compilerResult,
       Extension extension,
       Map<Id, ActualData<T>> actualMap,
-      {bool verbose}) {}
+      {bool? verbose}) {}
 
   /// Function that computes a data mapping for [library].
   ///
@@ -119,7 +117,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<T>> actualMap,
-      {bool verbose}) {}
+      {bool? verbose}) {}
 
   /// Returns `true` if this data computer supports tests with compile-time
   /// errors.
@@ -129,7 +127,7 @@
   bool get supportsErrors => false;
 
   /// Returns data corresponding to [error].
-  T computeErrorData(TestConfig config, InternalCompilerResult compiler, Id id,
+  T? computeErrorData(TestConfig config, InternalCompilerResult compiler, Id id,
           List<FormattedMessage> errors) =>
       null;
 
@@ -155,11 +153,11 @@
   int getOffsetFromId(Id id, Uri uri) {
     if (id is NodeId) return id.value;
     if (id is MemberId) {
-      Library library = lookupLibrary(compilerResult.component, uri);
-      Member member;
-      int offset;
+      Library library = lookupLibrary(compilerResult.component!, uri)!;
+      Member? member;
+      int offset = -1;
       if (id.className != null) {
-        Class cls = lookupClass(library, id.className, required: false);
+        Class? cls = lookupClass(library, id.className!, required: false);
         if (cls != null) {
           member = lookupClassMember(cls, id.memberName, required: false);
           if (member != null) {
@@ -180,23 +178,23 @@
       }
       return offset;
     } else if (id is ClassId) {
-      Library library = lookupLibrary(compilerResult.component, uri);
-      Extension extension =
+      Library library = lookupLibrary(compilerResult.component!, uri)!;
+      Extension? extension =
           lookupExtension(library, id.className, required: false);
       if (extension != null) {
         return extension.fileOffset;
       }
-      Class cls = lookupClass(library, id.className, required: false);
+      Class? cls = lookupClass(library, id.className, required: false);
       return cls?.fileOffset ?? 0;
     }
-    return null;
+    return 0;
   }
 
   @override
   void reportError(Uri uri, int offset, String message,
       {bool succinct: false}) {
     printMessageInLocation(
-        compilerResult.component.uriToSource, uri, offset, message,
+        compilerResult.component!.uriToSource, uri, offset, message,
         succinct: succinct);
   }
 }
@@ -210,7 +208,7 @@
   @override
   void report(Uri uri, int offset, String message) {
     printMessageInLocation(
-        compilerResult.component.uriToSource, uri, offset, message);
+        compilerResult.component!.uriToSource, uri, offset, message);
   }
 
   @override
@@ -229,12 +227,12 @@
     DataComputer<T> dataComputer, List<TestConfig> testedConfigs) {
   retainDataForTesting = true;
   return (TestData testData,
-      {bool testAfterFailures,
-      bool verbose,
-      bool succinct,
-      bool printCode,
-      Map<String, List<String>> skipMap,
-      Uri nullUri}) {
+      {required bool testAfterFailures,
+      required bool verbose,
+      required bool succinct,
+      required bool printCode,
+      Map<String, List<String>>? skipMap,
+      required Uri nullUri}) {
     return runTest(testData, dataComputer, testedConfigs,
         testAfterFailures: testAfterFailures,
         verbose: verbose,
@@ -251,15 +249,15 @@
 /// Returns `true` if an error was encountered.
 Future<Map<String, TestResult<T>>> runTest<T>(TestData testData,
     DataComputer<T> dataComputer, List<TestConfig> testedConfigs,
-    {bool testAfterFailures,
-    bool verbose,
-    bool succinct,
-    bool printCode,
+    {required bool testAfterFailures,
+    required bool verbose,
+    required bool succinct,
+    required bool printCode,
     bool forUserLibrariesOnly: true,
     Iterable<Id> globalIds: const <Id>[],
-    void onFailure(String message),
-    Map<String, List<String>> skipMap,
-    Uri nullUri}) async {
+    required void onFailure(String message),
+    Map<String, List<String>>? skipMap,
+    required Uri nullUri}) async {
   for (TestConfig config in testedConfigs) {
     if (!testData.expectedMaps.containsKey(config.marker)) {
       throw new ArgumentError("Unexpected test marker '${config.marker}'. "
@@ -289,16 +287,16 @@
 /// Returns `true` if an error was encountered.
 Future<TestResult<T>> runTestForConfig<T>(
     TestData testData, DataComputer<T> dataComputer, TestConfig config,
-    {bool fatalErrors,
-    bool verbose,
-    bool succinct,
-    bool printCode,
+    {required bool fatalErrors,
+    required bool verbose,
+    required bool succinct,
+    required bool printCode,
     bool forUserLibrariesOnly: true,
     Iterable<Id> globalIds: const <Id>[],
-    void onFailure(String message),
-    Uri nullUri}) async {
+    required void onFailure(String message),
+    required Uri nullUri}) async {
   MemberAnnotations<IdValue> memberAnnotations =
-      testData.expectedMaps[config.marker];
+      testData.expectedMaps[config.marker]!;
   Iterable<Id> globalIds = memberAnnotations.globalData.keys;
   CompilerOptions options = new CompilerOptions();
   List<FormattedMessage> errors = [];
@@ -326,13 +324,13 @@
       testData.memorySourceFiles,
       options: options,
       retainDataForTesting: true,
-      requireMain: false);
+      requireMain: false) as InternalCompilerResult;
 
-  Component component = compilerResult.component;
+  Component component = compilerResult.component!;
   Map<Uri, Map<Id, ActualData<T>>> actualMaps = <Uri, Map<Id, ActualData<T>>>{};
   Map<Id, ActualData<T>> globalData = <Id, ActualData<T>>{};
 
-  Map<Id, ActualData<T>> actualMapForUri(Uri uri) {
+  Map<Id, ActualData<T>> actualMapForUri(Uri? uri) {
     return actualMaps.putIfAbsent(uri ?? nullUri, () => <Id, ActualData<T>>{});
   }
 
@@ -351,13 +349,14 @@
     }
 
     errorMap.forEach((Uri uri, Map<int, List<FormattedMessage>> map) {
-      map.forEach((int offset, List<DiagnosticMessage> list) {
+      map.forEach((int offset, List<FormattedMessage> list) {
+        // ignore: unnecessary_null_comparison
         if (offset == null || offset < 0) {
           // Position errors without offset in the begin of the file.
           offset = 0;
         }
         NodeId id = new NodeId(offset, IdKind.error);
-        T data =
+        T? data =
             dataComputer.computeErrorData(config, compilerResult, id, list);
         if (data != null) {
           Map<Id, ActualData<T>> actualMap = actualMapForUri(uri);
@@ -370,7 +369,7 @@
   Map<Id, ActualData<T>> actualMapFor(TreeNode node) {
     Uri uri = node is Library
         ? node.fileUri
-        : (node is Member ? node.fileUri : node.location.file);
+        : (node is Member ? node.fileUri : node.location!.file);
     return actualMaps.putIfAbsent(uri, () => <Id, ActualData<T>>{});
   }
 
@@ -382,7 +381,7 @@
       }
     }
     if (member.enclosingClass != null) {
-      if (member.enclosingClass.isEnum) {
+      if (member.enclosingClass!.isEnum) {
         if (member is Constructor ||
             member.isInstanceMember ||
             member.name.text == 'values') {
@@ -444,9 +443,9 @@
   ];
 
   Class getGlobalClass(String className) {
-    Class cls;
+    Class? cls;
     for (Uri uri in globalLibraries) {
-      Library library = lookupLibrary(component, uri);
+      Library? library = lookupLibrary(component, uri);
       if (library != null) {
         cls ??= lookupClass(library, className);
       }
@@ -459,9 +458,9 @@
   }
 
   Member getGlobalMember(String memberName) {
-    Member member;
+    Member? member;
     for (Uri uri in globalLibraries) {
-      Library library = lookupLibrary(component, uri);
+      Library? library = lookupLibrary(component, uri);
       if (library != null) {
         member ??= lookupLibraryMember(library, memberName);
       }
@@ -475,9 +474,9 @@
 
   for (Id id in globalIds) {
     if (id is MemberId) {
-      Member member;
+      Member? member;
       if (id.className != null) {
-        Class cls = getGlobalClass(id.className);
+        Class? cls = getGlobalClass(id.className!);
         member = lookupClassMember(cls, id.memberName);
         if (member == null) {
           throw "Global member '${id.memberName}' not found in class $cls.";
@@ -502,15 +501,16 @@
 }
 
 void printMessageInLocation(
-    Map<Uri, Source> uriToSource, Uri uri, int offset, String message,
+    Map<Uri, Source> uriToSource, Uri? uri, int offset, String message,
     {bool succinct: false}) {
   if (uri == null) {
     print("(null uri)@$offset: $message");
   } else {
-    Source source = uriToSource[uri];
+    Source? source = uriToSource[uri];
     if (source == null) {
       print('$uri@$offset: $message');
     } else {
+      // ignore: unnecessary_null_comparison
       if (offset != null && offset >= 1) {
         Location location = source.getLocation(uri, offset);
         print('$location: $message');
diff --git a/pkg/front_end/lib/widget_cache.dart b/pkg/front_end/lib/widget_cache.dart
index 695ed83..f80f493 100644
--- a/pkg/front_end/lib/widget_cache.dart
+++ b/pkg/front_end/lib/widget_cache.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.9
-
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/kernel.dart';
 
@@ -14,9 +12,9 @@
   /// Create a [WidgetCache] from a [Component] containing the flutter
   /// framework.
   WidgetCache(Component fullComponent) {
-    Library frameworkLibrary;
+    Library? frameworkLibrary;
     for (Library library in fullComponent.libraries) {
-      if (library?.importUri == _frameworkLibrary) {
+      if (library.importUri == _frameworkLibrary) {
         frameworkLibrary = library;
         break;
       }
@@ -33,9 +31,9 @@
   static const String _statefulWidgetClassName = 'StatefulWidget';
   static const String _statelessWidgetClassName = 'StatelessWidget';
 
-  Class _statelessWidget;
-  Class _state;
-  Class _statefulWidget;
+  Class? _statelessWidget;
+  Class? _state;
+  Class? _statefulWidget;
   bool _frameworkTypesLocated = false;
 
   static final Uri _frameworkLibrary =
@@ -58,8 +56,8 @@
   /// `State` subtype.
   ///
   /// Returns the class name if located, otherwise `null`.
-  String checkSingleWidgetTypeModified(
-    Component lastGoodComponent,
+  String? checkSingleWidgetTypeModified(
+    Component? lastGoodComponent,
     Component partialComponent,
     ClassHierarchy classHierarchy,
   ) {
@@ -69,7 +67,7 @@
       return null;
     }
     Uri importUri = _invalidatedLibraries[0];
-    Library library;
+    Library? library;
     for (Library candidateLibrary in partialComponent.libraries) {
       if (candidateLibrary.importUri == importUri) {
         library = candidateLibrary;
@@ -79,9 +77,11 @@
     if (library == null) {
       return null;
     }
-    List<int> oldSource = lastGoodComponent.uriToSource[library.fileUri].source;
-    List<int> newSource = partialComponent.uriToSource[library.fileUri].source;
+    List<int> oldSource =
+        lastGoodComponent.uriToSource[library.fileUri]!.source;
+    List<int> newSource = partialComponent.uriToSource[library.fileUri]!.source;
     // Library was added and does not exist in the old component.
+    // ignore: unnecessary_null_comparison
     if (oldSource == null) {
       return null;
     }
@@ -105,7 +105,7 @@
       oldEndIndex -= 1;
     }
 
-    Class newClass =
+    Class? newClass =
         _locateContainingClass(library, newStartIndex, newEndIndex);
     if (newClass == null) {
       return null;
@@ -116,7 +116,7 @@
       return library.importUri == importUri;
     });
 
-    Class oldClass =
+    Class? oldClass =
         _locateContainingClass(oldLibrary, oldStartIndex, oldEndIndex);
 
     if (oldClass == null || oldClass.name != newClass.name) {
@@ -125,13 +125,13 @@
 
     // Update the class references to stateless, stateful, and state classes.
     for (Library library in classHierarchy.knownLibraries) {
-      if (library?.importUri == _frameworkLibrary) {
+      if (library.importUri == _frameworkLibrary) {
         _locatedClassDeclarations(library);
       }
     }
 
-    if (classHierarchy.isSubclassOf(newClass, _statelessWidget) ||
-        classHierarchy.isSubclassOf(newClass, _statefulWidget)) {
+    if (classHierarchy.isSubclassOf(newClass, _statelessWidget!) ||
+        classHierarchy.isSubclassOf(newClass, _statefulWidget!)) {
       if (classHierarchy.isExtended(newClass) ||
           classHierarchy.isUsedAsMixin(newClass)) {
         return null;
@@ -143,8 +143,8 @@
     // StatefulWidget that is provided as a type parameter. If the bounds are
     // StatefulWidget itself, fail as that indicates the type was not
     // specified.
-    Supertype stateSuperType =
-        classHierarchy.getClassAsInstanceOf(newClass, _state);
+    Supertype? stateSuperType =
+        classHierarchy.getClassAsInstanceOf(newClass, _state!);
     if (stateSuperType != null) {
       if (stateSuperType.typeArguments.length != 1) {
         return null;
@@ -167,7 +167,7 @@
   }
 
   // Locate the that fully contains the edit range, or null.
-  Class _locateContainingClass(
+  Class? _locateContainingClass(
       Library library, int startOffset, int endOffset) {
     for (Class classDeclaration in library.classes) {
       if (classDeclaration.startFileOffset <= startOffset &&
diff --git a/pkg/front_end/tool/dart_doctest_impl.dart b/pkg/front_end/tool/dart_doctest_impl.dart
index 661c0563..3051c00e 100644
--- a/pkg/front_end/tool/dart_doctest_impl.dart
+++ b/pkg/front_end/tool/dart_doctest_impl.dart
@@ -764,7 +764,7 @@
       new Uri(scheme: "dartdoctest", path: "tester");
   DocTestIncrementalCompiler(CompilerContext context) : super(context);
 
-  bool dontReissueLibraryProblemsFor(Uri uri) {
+  bool dontReissueLibraryProblemsFor(Uri? uri) {
     return super.dontReissueLibraryProblemsFor(uri) || uri == dartDocTestUri;
   }
 
@@ -786,10 +786,10 @@
     assert(dillLoadedData != null && userCode != null);
 
     return await context.runInContext((_) async {
-      LibraryBuilder libraryBuilder =
-          userCode.loader.read(libraryUri, -1, accessor: userCode.loader.first);
+      LibraryBuilder libraryBuilder = userCode!.loader
+          .read(libraryUri, -1, accessor: userCode!.loader.first);
 
-      userCode.loader.seenMessages.clear();
+      userCode!.loader.seenMessages.clear();
 
       _dartDocTestLibraryBuilder = libraryBuilder;
       _dartDocTestCode = dartDocTestCode;
@@ -800,8 +800,8 @@
       _dartDocTestLibraryBuilder = null;
       _dartDocTestCode = null;
 
-      userCode.uriToSource.remove(dartDocTestUri);
-      userCode.loader.sourceBytes.remove(dartDocTestUri);
+      userCode!.uriToSource.remove(dartDocTestUri);
+      userCode!.loader.sourceBytes.remove(dartDocTestUri);
 
       return result;
     });
@@ -813,7 +813,7 @@
       dartDocTestUri,
       /*packageUri*/ null,
       new ImplicitLanguageVersion(libraryBuilder.library.languageVersion),
-      userCode.loader,
+      userCode!.loader,
       null,
       scope: libraryBuilder.scope.createNestedScope("dartdoctest"),
       nameOrigin: libraryBuilder,
@@ -877,7 +877,7 @@
       kernel.Library? referencesFrom,
       bool? referenceIsPartOwner) {
     if (uri == DocTestIncrementalCompiler.dartDocTestUri) {
-      HybridFileSystem hfs = compiler.userCode.fileSystem as HybridFileSystem;
+      HybridFileSystem hfs = compiler.userCode!.fileSystem as HybridFileSystem;
       MemoryFileSystem fs = hfs.memory;
       fs
           .entityForUri(DocTestIncrementalCompiler.dartDocTestUri)
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 688005a..4c7f24f 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -14080,6 +14080,12 @@
 /// Non-nullable [Reference] dummy value.
 final Reference dummyReference = new Reference();
 
+/// Non-nullable [Component] dummy value.
+///
+/// This can be used for instance as a dummy initial value for the `List.filled`
+/// constructor.
+final Component dummyComponent = new Component();
+
 /// Non-nullable [Library] dummy value.
 ///
 /// This is used as the removal sentinel in [RemovingTransformer] and can be
@@ -14290,6 +14296,7 @@
 ///
 /// This should manually be kept up to date.
 final List<TreeNode> dummyTreeNodes = [
+  dummyComponent,
   dummyLibrary,
   dummyLibraryDependency,
   dummyCombinator,
diff --git a/runtime/docs/gc.md b/runtime/docs/gc.md
index 38bda88..7857b3d 100644
--- a/runtime/docs/gc.md
+++ b/runtime/docs/gc.md
@@ -61,7 +61,13 @@
 
 During the sweeping phase, the collector visits each old-space object. If the mark bit is clear, the object's memory is added to a [free list](https://github.com/dart-lang/sdk/blob/master/runtime/vm/heap/freelist.h) to be used for future allocations. Otherwise the object's mark bit is cleared. If every object on some page is unreachable, the page is released to the OS.
 
-Note that because we do not mark new-space objects, we treat every object in new-space as a root during old-space collections. This property makes new-space and old-space collections more independent, and in particular allows a scavenge to run at the same time as concurrent marking.
+### New-Space as Roots
+
+We do not mark new-space objects, and pointers to new-space objects are ignored; instead all objects in new-space are treated as part of the root set.
+
+This has the advantage of making collections of the two spaces more independent. In particular, the concurrent marker never needs to dereference any memory in new-space, avoiding several data race issues, and avoiding the need to pause or otherwise synchronize with the concurrent marker when starting a scavenge.
+
+It has the disadvantage that no single collection will collect all garbage. An unreachable old-space object that is referenced by an unreachable new-space object will not be collected until a scavenge first collects the new-space object, and unreachable objects that have a generation-crossing cycle will not be collected until the whole subgraph is promoted into old-space. The growth policy must be careful to ensure it doesn't perform old-space collections without interleaving new-space collections, such as when the program performs mostly large allocation that go directly to old-space, or old-space can accumulate such floating garbage and grow without bound.
 
 ## Mark-Compact
 
diff --git a/runtime/platform/utils.h b/runtime/platform/utils.h
index a1d6b1b..98f1a1c 100644
--- a/runtime/platform/utils.h
+++ b/runtime/platform/utils.h
@@ -229,22 +229,12 @@
     return value <= limit;
   }
 
-  // Check whether the magnitude of value fits in N bits. This differs from
-  // IsInt(N + 1, value) only in that this returns false for the minimum value
-  // of a N+1 bit two's complement value.
-  //
-  // Primarily used for testing whether a two's complement value can be used in
-  // a place where the sign is replaced with a marker that says whether the
-  // magnitude is added or subtracted, e.g., the U bit (bit 23) in some ARM7
-  // instructions.
+  // Check whether the magnitude of value fits in N bits, i.e., whether an
+  // (N+1)-bit sign-magnitude representation can hold value.
   template <typename T>
-  static inline bool MagnitudeIsUint(intptr_t N, T value) {
+  static inline bool IsAbsoluteUint(intptr_t N, T value) {
     ASSERT(N >= 1);
-    if constexpr (std::is_signed<T>::value) {
-      using Unsigned = typename std::make_unsigned<T>::type;
-      if (value < 0) return IsUint<Unsigned>(N, -value);
-    }
-    return IsUint(N, value);
+    return IsInt(N + 1, value);
   }
 
   static inline int32_t Low16Bits(int32_t value) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index d285792..7cf8272 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -2336,20 +2336,19 @@
     case kUnsignedTwoBytes:
     case kWordPair: {
       *offset_mask = 0xff;
-      return Utils::MagnitudeIsUint(8, offset);  // Addressing mode 3.
+      return Utils::IsAbsoluteUint(8, offset);  // Addressing mode 3.
     }
     case kUnsignedByte:
     case kFourBytes:
     case kUnsignedFourBytes: {
       *offset_mask = 0xfff;
-      return Utils::MagnitudeIsUint(12, offset);  // Addressing mode 2.
+      return Utils::IsAbsoluteUint(12, offset);  // Addressing mode 2.
     }
     case kSWord:
     case kDWord: {
       *offset_mask = 0x3fc;  // Multiple of 4.
       // VFP addressing mode.
-      return (Utils::MagnitudeIsUint(10, offset) &&
-              Utils::IsAligned(offset, 4));
+      return (Utils::IsAbsoluteUint(10, offset) && Utils::IsAligned(offset, 4));
     }
     case kRegList: {
       *offset_mask = 0x0;
@@ -2370,21 +2369,20 @@
     case kUnsignedTwoBytes:
     case kWordPair: {
       *offset_mask = 0xff;
-      return Utils::MagnitudeIsUint(8, offset);  // Addressing mode 3.
+      return Utils::IsAbsoluteUint(8, offset);  // Addressing mode 3.
     }
     case kByte:
     case kUnsignedByte:
     case kFourBytes:
     case kUnsignedFourBytes: {
       *offset_mask = 0xfff;
-      return Utils::MagnitudeIsUint(12, offset);  // Addressing mode 2.
+      return Utils::IsAbsoluteUint(12, offset);  // Addressing mode 2.
     }
     case kSWord:
     case kDWord: {
       *offset_mask = 0x3fc;  // Multiple of 4.
       // VFP addressing mode.
-      return (Utils::MagnitudeIsUint(10, offset) &&
-              Utils::IsAligned(offset, 4));
+      return (Utils::IsAbsoluteUint(10, offset) && Utils::IsAligned(offset, 4));
     }
     case kRegList: {
       *offset_mask = 0x0;
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index c41b62d..09162f4 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -238,7 +238,7 @@
   }
 
   explicit Address(Register rn, int32_t offset = 0, Mode am = Offset) {
-    ASSERT(Utils::MagnitudeIsUint(12, offset));
+    ASSERT(Utils::IsAbsoluteUint(12, offset));
     kind_ = Immediate;
     if (offset < 0) {
       encoding_ = (am ^ (1 << kUShift)) | -offset;  // Flip U to adjust sign.
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index b71c702..979db7e 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -712,7 +712,7 @@
     } else {
       __ add(LR, DISPATCH_TABLE_REG,
              compiler::Operand(cid_reg, LSL, compiler::target::kWordSizeLog2));
-      if (!Utils::MagnitudeIsUint(12, offset)) {
+      if (!Utils::IsAbsoluteUint(12, offset)) {
         const intptr_t adjust = offset & -(1 << 12);
         __ AddImmediate(LR, LR, adjust);
         offset -= adjust;
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 0c07ad2..80aaa47 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -1855,7 +1855,7 @@
   const intptr_t base_offset =
       (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
   const int64_t offset = index * scale + base_offset;
-  if (!Utils::MagnitudeIsUint(12, offset)) {
+  if (!Utils::IsAbsoluteUint(12, offset)) {
     return false;
   }
   if (compiler::Address::CanHoldImmediateOffset(is_load, cid, offset)) {
diff --git a/runtime/vm/datastream.cc b/runtime/vm/datastream.cc
index 8236bf2..6d398fe 100644
--- a/runtime/vm/datastream.cc
+++ b/runtime/vm/datastream.cc
@@ -10,7 +10,8 @@
 namespace dart {
 
 void BaseWriteStream::WriteTargetWord(word value) {
-  ASSERT(Utils::IsInt(compiler::target::kBitsPerWord, value));
+  ASSERT(compiler::target::kBitsPerWord == kBitsPerWord ||
+         Utils::IsAbsoluteUint(compiler::target::kBitsPerWord, value));
   WriteFixed(static_cast<compiler::target::word>(value));
 }
 
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 715bd93..658892b 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -1207,7 +1207,8 @@
 }
 
 intptr_t AssemblyImageWriter::WriteTargetWord(word value) {
-  ASSERT(Utils::IsInt(compiler::target::kBitsPerWord, value));
+  ASSERT(compiler::target::kBitsPerWord == kBitsPerWord ||
+         Utils::IsAbsoluteUint(compiler::target::kBitsPerWord, value));
   // Padding is helpful for comparing the .S with --disassemble.
   assembly_stream_->Printf("%s 0x%.*" Px "\n", kWordDirective,
                            2 * compiler::target::kWordSize, value);
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index fb36cf8..af7acb1 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -136,7 +136,6 @@
     cls.Finalize();
   }
 
-
   function_name = String::New("Foo");
   function = Resolver::ResolveDynamicFunction(Z, cls, function_name);
   EXPECT(function.IsNull());
@@ -4359,13 +4358,14 @@
     ASSERT(strlen(json_str) < kBufferSize);
     ElideJSONSubstring("classes", json_str, buffer);
     ElideJSONSubstring("libraries", buffer, buffer);
+    StripTokenPositions(buffer);
 
     EXPECT_STREQ(
         "{\"type\":\"@Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"bool\","
         "\"location\":{\"type\":\"SourceLocation\",\"script\":{\"type\":\"@"
         "Script\","
         "\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:core\\/bool.dart\","
-        "\"_kind\":\"kernel\"},\"tokenPos\":436,\"endTokenPos\":4432},"
+        "\"_kind\":\"kernel\"}},"
         "\"library\":{\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\","
         "\"name\":\"dart.core\",\"uri\":\"dart:core\"}}",
         buffer);
@@ -4384,6 +4384,7 @@
     ASSERT(strlen(json_str) < kBufferSize);
     ElideJSONSubstring("classes", json_str, buffer);
     ElideJSONSubstring("libraries", buffer, buffer);
+    StripTokenPositions(buffer);
     EXPECT_STREQ(
         "{\"type\":\"@Function\",\"fixedId\":true,\"id\":\"\","
         "\"name\":\"toString\",\"owner\":{\"type\":\"@Class\","
@@ -4391,15 +4392,14 @@
         "\"location\":{\"type\":\"SourceLocation\","
         "\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
         "\"id\":\"\",\"uri\":\"dart:core\\/bool.dart\","
-        "\"_kind\":\"kernel\"},\"tokenPos\":436,\"endTokenPos\":4432},"
+        "\"_kind\":\"kernel\"}},"
         "\"library\":{\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\","
         "\"name\":\"dart.core\",\"uri\":\"dart:core\"}},"
         "\"_kind\":\"RegularFunction\",\"static\":false,\"const\":false,"
         "\"_intrinsic\":false,\"_native\":false,"
         "\"location\":{\"type\":\"SourceLocation\","
         "\"script\":{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
-        "\"uri\":\"dart:core\\/bool.dart\",\"_kind\":\"kernel\"},"
-        "\"tokenPos\":4372,\"endTokenPos\":4430}}",
+        "\"uri\":\"dart:core\\/bool.dart\",\"_kind\":\"kernel\"}}}",
         buffer);
   }
   // Library reference
@@ -4424,12 +4424,13 @@
     ASSERT(strlen(json_str) < kBufferSize);
     ElideJSONSubstring("classes", json_str, buffer);
     ElideJSONSubstring("libraries", buffer, buffer);
+    StripTokenPositions(buffer);
     EXPECT_STREQ(
         "{\"type\":\"@Instance\",\"_vmType\":\"Bool\",\"class\":{\"type\":\"@"
         "Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"bool\",\"location\":{"
         "\"type\":\"SourceLocation\",\"script\":{\"type\":\"@Script\","
         "\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:core\\/bool.dart\",\"_"
-        "kind\":\"kernel\"},\"tokenPos\":436,\"endTokenPos\":4432},\"library\":"
+        "kind\":\"kernel\"}},\"library\":"
         "{\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\",\"name\":\"dart."
         "core\",\"uri\":\"dart:core\"}},\"identityHashCode\":0,\"kind\":"
         "\"Bool\",\"fixedId\":true,\"id\":\"objects\\/bool-true\","
@@ -4446,13 +4447,14 @@
     ElideJSONSubstring("classes", json_str, buffer);
     ElideJSONSubstring("_Smi@", buffer, buffer);
     ElideJSONSubstring("libraries", buffer, buffer);
+    StripTokenPositions(buffer);
     EXPECT_STREQ(
         "{\"type\":\"@Instance\",\"_vmType\":\"Smi\",\"class\":{\"type\":\"@"
         "Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"_Smi\",\"_vmName\":"
         "\"\",\"location\":{\"type\":\"SourceLocation\",\"script\":{\"type\":"
         "\"@Script\",\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:core-"
-        "patch\\/integers.dart\",\"_kind\":\"kernel\"},\"tokenPos\":16466,"
-        "\"endTokenPos\":24948},\"library\":{\"type\":\"@Library\",\"fixedId\":"
+        "patch\\/integers.dart\",\"_kind\":\"kernel\"}"
+        "},\"library\":{\"type\":\"@Library\",\"fixedId\":"
         "true,\"id\":\"\",\"name\":\"dart.core\",\"uri\":\"dart:core\"}},"
         "\"identityHashCode\":0,\"kind\":\"Int\",\"fixedId\":true,\"id\":"
         "\"objects\\/int-7\",\"valueAsString\":\"7\"}",
@@ -4469,13 +4471,14 @@
     ElideJSONSubstring("objects", buffer, buffer);
     ElideJSONSubstring("libraries", buffer, buffer);
     ElideJSONSubstring("_Mint@", buffer, buffer);
+    StripTokenPositions(buffer);
     EXPECT_STREQ(
         "{\"type\":\"@Instance\",\"_vmType\":\"Mint\",\"class\":{\"type\":\"@"
         "Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"_Mint\",\"_vmName\":"
         "\"\",\"location\":{\"type\":\"SourceLocation\",\"script\":{\"type\":"
         "\"@Script\",\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:core-"
-        "patch\\/integers.dart\",\"_kind\":\"kernel\"},\"tokenPos\":25029,"
-        "\"endTokenPos\":25413},\"library\":{\"type\":\"@Library\",\"fixedId\":"
+        "patch\\/integers.dart\",\"_kind\":\"kernel\"}"
+        "},\"library\":{\"type\":\"@Library\",\"fixedId\":"
         "true,\"id\":\"\",\"name\":\"dart.core\",\"uri\":\"dart:core\"}},"
         "\"identityHashCode\":0,\"kind\":\"Int\",\"id\":\"\",\"valueAsString\":"
         "\"-9223372036854775808\"}",
@@ -4492,13 +4495,14 @@
     ElideJSONSubstring("objects", buffer, buffer);
     ElideJSONSubstring("libraries", buffer, buffer);
     ElideJSONSubstring("_Double@", buffer, buffer);
+    StripTokenPositions(buffer);
     EXPECT_STREQ(
         "{\"type\":\"@Instance\",\"_vmType\":\"Double\",\"class\":{\"type\":\"@"
         "Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"_Double\",\"_vmName\":"
         "\"\",\"location\":{\"type\":\"SourceLocation\",\"script\":{\"type\":"
         "\"@Script\",\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:core-"
-        "patch\\/double.dart\",\"_kind\":\"kernel\"},\"tokenPos\":248,"
-        "\"endTokenPos\":12248},\"library\":{\"type\":\"@Library\",\"fixedId\":"
+        "patch\\/double.dart\",\"_kind\":\"kernel\"}"
+        "},\"library\":{\"type\":\"@Library\",\"fixedId\":"
         "true,\"id\":\"\",\"name\":\"dart.core\",\"uri\":\"dart:core\"}},"
         "\"identityHashCode\":0,\"kind\":\"Double\",\"id\":\"\","
         "\"valueAsString\":\"0.1234\"}",
@@ -4515,13 +4519,14 @@
     ElideJSONSubstring("objects", buffer, buffer);
     ElideJSONSubstring("libraries", buffer, buffer);
     ElideJSONSubstring("_OneByteString@", buffer, buffer);
+    StripTokenPositions(buffer);
     EXPECT_STREQ(
         "{\"type\":\"@Instance\",\"_vmType\":\"String\",\"class\":{\"type\":\"@"
         "Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"_OneByteString\",\"_"
         "vmName\":\"\",\"location\":{\"type\":\"SourceLocation\",\"script\":{"
         "\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:core-"
-        "patch\\/string_patch.dart\",\"_kind\":\"kernel\"},\"tokenPos\":32339,"
-        "\"endTokenPos\":44628},\"library\":{\"type\":\"@Library\",\"fixedId\":"
+        "patch\\/string_patch.dart\",\"_kind\":\"kernel\"}"
+        "},\"library\":{\"type\":\"@Library\",\"fixedId\":"
         "true,\"id\":\"\",\"name\":\"dart.core\",\"uri\":\"dart:core\"}},"
         "\"identityHashCode\":0,\"kind\":\"String\",\"id\":\"\",\"length\":2,"
         "\"valueAsString\":\"dw\"}",
@@ -4538,13 +4543,14 @@
     ElideJSONSubstring("objects", buffer, buffer);
     ElideJSONSubstring("libraries", buffer, buffer);
     ElideJSONSubstring("_List@", buffer, buffer);
+    StripTokenPositions(buffer);
     EXPECT_STREQ(
         "{\"type\":\"@Instance\",\"_vmType\":\"Array\",\"class\":{\"type\":\"@"
         "Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"_List\",\"_vmName\":"
         "\"\",\"location\":{\"type\":\"SourceLocation\",\"script\":{\"type\":"
         "\"@Script\",\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:core-"
-        "patch\\/array.dart\",\"_kind\":\"kernel\"},\"tokenPos\":248,"
-        "\"endTokenPos\":7758},\"library\":{\"type\":\"@Library\",\"fixedId\":"
+        "patch\\/array.dart\",\"_kind\":\"kernel\"}"
+        "},\"library\":{\"type\":\"@Library\",\"fixedId\":"
         "true,\"id\":\"\",\"name\":\"dart.core\",\"uri\":\"dart:core\"}},"
         "\"identityHashCode\":0,\"kind\":\"List\",\"id\":\"\",\"length\":0}",
         buffer);
@@ -4561,13 +4567,14 @@
     ElideJSONSubstring("objects", buffer, buffer);
     ElideJSONSubstring("libraries", buffer, buffer);
     ElideJSONSubstring("_GrowableList@", buffer, buffer);
+    StripTokenPositions(buffer);
     EXPECT_STREQ(
         "{\"type\":\"@Instance\",\"_vmType\":\"GrowableObjectArray\",\"class\":"
         "{\"type\":\"@Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"_"
         "GrowableList\",\"_vmName\":\"\",\"location\":{\"type\":"
         "\"SourceLocation\",\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
         "\"id\":\"\",\"uri\":\"dart:core-patch\\/growable_array.dart\",\"_"
-        "kind\":\"kernel\"},\"tokenPos\":248,\"endTokenPos\":18485},"
+        "kind\":\"kernel\"}},"
         "\"library\":{\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\","
         "\"name\":\"dart.core\",\"uri\":\"dart:core\"}},\"identityHashCode\":0,"
         "\"kind\":\"List\",\"id\":\"\",\"length\":0}",
@@ -4585,17 +4592,17 @@
     ElideJSONSubstring("objects", buffer, buffer);
     ElideJSONSubstring("libraries", buffer, buffer);
     ElideJSONSubstring("_InternalLinkedHashMap@", buffer, buffer);
+    StripTokenPositions(buffer);
     EXPECT_STREQ(
         "{\"type\":\"@Instance\",\"_vmType\":\"LinkedHashMap\",\"class\":{"
         "\"type\":\"@Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"_"
         "InternalLinkedHashMap\",\"_vmName\":\"\",\"location\":{\"type\":"
         "\"SourceLocation\",\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
-        "\"id\":\"\",\"uri\":\"dart:collection-patch\\/"
-        "compact_hash.dart\",\"_kind\":\"kernel\"},\"tokenPos\":6399,"
-        "\"endTokenPos\":6786},\"library\":{\"type\":\"@Library\",\"fixedId\":"
-        "true,\"id\":\"\",\"name\":\"dart.collection\",\"uri\":\"dart:"
-        "collection\"}},\"identityHashCode\":0,\"kind\":\"Map\",\"id\":\"\","
-        "\"length\":0}",
+        "\"id\":\"\",\"uri\":\"dart:collection-patch\\/compact_hash.dart\",\"_"
+        "kind\":\"kernel\"}},"
+        "\"library\":{\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\","
+        "\"name\":\"dart.collection\",\"uri\":\"dart:collection\"}},"
+        "\"identityHashCode\":0,\"kind\":\"Map\",\"id\":\"\",\"length\":0}",
         buffer);
   }
   // UserTag reference
@@ -4609,13 +4616,15 @@
     ElideJSONSubstring("objects", buffer, buffer);
     ElideJSONSubstring("libraries", buffer, buffer);
     ElideJSONSubstring("_UserTag@", buffer, buffer);
+    StripTokenPositions(buffer);
     EXPECT_SUBSTRING(
         "\"type\":\"@Instance\",\"_vmType\":\"UserTag\",\"class\":{\"type\":\"@"
         "Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"_UserTag\",\"_"
         "vmName\":\"\",\"location\":{\"type\":\"SourceLocation\",\"script\":{"
         "\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:"
-        "developer-patch\\/profiler.dart\",\"_kind\":\"kernel\"},\"tokenPos\":"
-        "414,\"endTokenPos\":628},\"library\":{\"type\":\"@Library\","
+        "developer-patch\\/"
+        "profiler.dart\",\"_kind\":\"kernel\"}},\"library\":{\"type\":\"@"
+        "Library\","
         "\"fixedId\":true,\"id\":\"\",\"name\":\"dart.developer\",\"uri\":"
         "\"dart:developer\"}},"
         // Handle non-zero identity hash.
@@ -4639,13 +4648,14 @@
     ElideJSONSubstring("objects", buffer, buffer);
     ElideJSONSubstring("libraries", buffer, buffer);
     ElideJSONSubstring("_Type@", buffer, buffer);
+    StripTokenPositions(buffer);
     EXPECT_SUBSTRING(
         "{\"type\":\"@Instance\",\"_vmType\":\"Type\",\"class\":{\"type\":\"@"
         "Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"_Type\",\"_vmName\":"
         "\"\",\"location\":{\"type\":\"SourceLocation\",\"script\":{\"type\":"
         "\"@Script\",\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:core-"
-        "patch\\/type_patch.dart\",\"_kind\":\"kernel\"},\"tokenPos\":493,"
-        "\"endTokenPos\":898},\"library\":{\"type\":\"@Library\",\"fixedId\":"
+        "patch\\/type_patch.dart\",\"_kind\":\"kernel\"}"
+        "},\"library\":{\"type\":\"@Library\",\"fixedId\":"
         "true,\"id\":\"\",\"name\":\"dart.core\",\"uri\":\"dart:core\"}},"
         // Handle non-zero identity hash.
         "\"identityHashCode\":",
@@ -4656,8 +4666,8 @@
         "\"typeClass\":{\"type\":\"@Class\",\"fixedId\":true,\"id\":\"\","
         "\"name\":\"bool\",\"location\":{\"type\":\"SourceLocation\","
         "\"script\":{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\",\"uri\":"
-        "\"dart:core\\/bool.dart\",\"_kind\":\"kernel\"},\"tokenPos\":436,"
-        "\"endTokenPos\":4432},\"library\":{\"type\":\"@Library\",\"fixedId\":"
+        "\"dart:core\\/bool.dart\",\"_kind\":\"kernel\"}"
+        "},\"library\":{\"type\":\"@Library\",\"fixedId\":"
         "true,\"id\":\"\",\"name\":\"dart.core\",\"uri\":\"dart:core\"}},"
         "\"name\":\"bool\"}",
         buffer);
@@ -4670,12 +4680,13 @@
     ASSERT(strlen(json_str) < kBufferSize);
     ElideJSONSubstring("classes", json_str, buffer);
     ElideJSONSubstring("libraries", buffer, buffer);
+    StripTokenPositions(buffer);
     EXPECT_STREQ(
         "{\"type\":\"@Instance\",\"_vmType\":\"null\",\"class\":{\"type\":\"@"
         "Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"Null\",\"location\":{"
         "\"type\":\"SourceLocation\",\"script\":{\"type\":\"@Script\","
         "\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:core\\/null.dart\",\"_"
-        "kind\":\"kernel\"},\"tokenPos\":925,\"endTokenPos\":1165},\"library\":"
+        "kind\":\"kernel\"}},\"library\":"
         "{\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\",\"name\":\"dart."
         "core\",\"uri\":\"dart:core\"}},\"kind\":\"Null\",\"fixedId\":true,"
         "\"id\":\"objects\\/null\",\"valueAsString\":\"null\"}",
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index a4de697..b710b2a 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -415,50 +415,50 @@
                                      bool finalize_classes,
                                      bool allow_compile_errors) {
 #ifndef PRODUCT
-    if (strstr(script, IsolateReloadTestLibUri()) != NULL) {
-      Dart_Handle result = LoadIsolateReloadTestLib();
-      EXPECT_VALID(result);
-    }
+  if (strstr(script, IsolateReloadTestLibUri()) != NULL) {
+    Dart_Handle result = LoadIsolateReloadTestLib();
+    EXPECT_VALID(result);
+  }
 #endif  // ifndef PRODUCT
-    Dart_SourceFile* sourcefiles = NULL;
-    intptr_t num_sources = BuildSourceFilesArray(&sourcefiles, script, lib_url);
-    Dart_Handle result =
-        LoadTestScriptWithDFE(num_sources, sourcefiles, resolver,
-                              finalize_classes, true, allow_compile_errors);
-    delete[] sourcefiles;
-    return result;
+  Dart_SourceFile* sourcefiles = NULL;
+  intptr_t num_sources = BuildSourceFilesArray(&sourcefiles, script, lib_url);
+  Dart_Handle result =
+      LoadTestScriptWithDFE(num_sources, sourcefiles, resolver,
+                            finalize_classes, true, allow_compile_errors);
+  delete[] sourcefiles;
+  return result;
 }
 
 Dart_Handle TestCase::LoadTestLibrary(const char* lib_uri,
                                       const char* script,
                                       Dart_NativeEntryResolver resolver) {
-    const char* prefixed_lib_uri =
-        OS::SCreate(Thread::Current()->zone(), "file:///%s", lib_uri);
-    Dart_SourceFile sourcefiles[] = {{prefixed_lib_uri, script}};
-    const uint8_t* kernel_buffer = NULL;
-    intptr_t kernel_buffer_size = 0;
-    int sourcefiles_count = sizeof(sourcefiles) / sizeof(Dart_SourceFile);
-    char* error = TestCase::CompileTestScriptWithDFE(
-        sourcefiles[0].uri, sourcefiles_count, sourcefiles, &kernel_buffer,
-        &kernel_buffer_size, true);
-    if ((kernel_buffer == NULL) && (error != NULL)) {
-      return Dart_NewApiError(error);
-    }
-    Dart_Handle lib =
-        Dart_LoadLibraryFromKernel(kernel_buffer, kernel_buffer_size);
-    EXPECT_VALID(lib);
+  const char* prefixed_lib_uri =
+      OS::SCreate(Thread::Current()->zone(), "file:///%s", lib_uri);
+  Dart_SourceFile sourcefiles[] = {{prefixed_lib_uri, script}};
+  const uint8_t* kernel_buffer = NULL;
+  intptr_t kernel_buffer_size = 0;
+  int sourcefiles_count = sizeof(sourcefiles) / sizeof(Dart_SourceFile);
+  char* error = TestCase::CompileTestScriptWithDFE(
+      sourcefiles[0].uri, sourcefiles_count, sourcefiles, &kernel_buffer,
+      &kernel_buffer_size, true);
+  if ((kernel_buffer == NULL) && (error != NULL)) {
+    return Dart_NewApiError(error);
+  }
+  Dart_Handle lib =
+      Dart_LoadLibraryFromKernel(kernel_buffer, kernel_buffer_size);
+  EXPECT_VALID(lib);
 
-    // Ensure kernel buffer isn't leaked after test is run.
-    AddToKernelBuffers(kernel_buffer);
+  // Ensure kernel buffer isn't leaked after test is run.
+  AddToKernelBuffers(kernel_buffer);
 
-    // TODO(32618): Kernel doesn't correctly represent the root library.
-    lib = Dart_LookupLibrary(Dart_NewStringFromCString(sourcefiles[0].uri));
-    EXPECT_VALID(lib);
-    Dart_Handle result = Dart_SetRootLibrary(lib);
-    EXPECT_VALID(result);
+  // TODO(32618): Kernel doesn't correctly represent the root library.
+  lib = Dart_LookupLibrary(Dart_NewStringFromCString(sourcefiles[0].uri));
+  EXPECT_VALID(lib);
+  Dart_Handle result = Dart_SetRootLibrary(lib);
+  EXPECT_VALID(result);
 
-    Dart_SetNativeResolver(lib, resolver, NULL);
-    return lib;
+  Dart_SetNativeResolver(lib, resolver, NULL);
+  return lib;
 }
 
 Dart_Handle TestCase::LoadTestScriptWithDFE(int sourcefiles_count,
@@ -584,19 +584,19 @@
 }
 
 Dart_Handle TestCase::ReloadTestScript(const char* script) {
-    Dart_SourceFile* sourcefiles = NULL;
-    intptr_t num_files = BuildSourceFilesArray(&sourcefiles, script);
-    Dart_KernelCompilationResult compilation_result =
-        KernelIsolate::UpdateInMemorySources(num_files, sourcefiles);
-    delete[] sourcefiles;
-    if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
-      Dart_Handle result = Dart_NewApiError(compilation_result.error);
-      free(compilation_result.error);
-      if (compilation_result.kernel != NULL) {
-        free(const_cast<uint8_t*>(compilation_result.kernel));
-      }
-      return result;
+  Dart_SourceFile* sourcefiles = NULL;
+  intptr_t num_files = BuildSourceFilesArray(&sourcefiles, script);
+  Dart_KernelCompilationResult compilation_result =
+      KernelIsolate::UpdateInMemorySources(num_files, sourcefiles);
+  delete[] sourcefiles;
+  if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
+    Dart_Handle result = Dart_NewApiError(compilation_result.error);
+    free(compilation_result.error);
+    if (compilation_result.kernel != NULL) {
+      free(const_cast<uint8_t*>(compilation_result.kernel));
     }
+    return result;
+  }
 
   return TriggerReload(/* kernel_buffer= */ NULL, /* kernel_buffer_size= */ 0);
 }
@@ -727,7 +727,10 @@
   return result.IsCode();
 }
 
-void ElideJSONSubstring(const char* prefix, const char* in, char* out) {
+void ElideJSONSubstring(const char* prefix,
+                        const char* in,
+                        char* out,
+                        const char* postfix) {
   const char* pos = strstr(in, prefix);
   while (pos != NULL) {
     // Copy up to pos into the output buffer.
@@ -735,8 +738,9 @@
       *out++ = *in++;
     }
 
-    // Skip to the close quote.
-    in += strcspn(in, "\"");
+    // Skip to the closing postfix.
+    in += strlen(prefix);
+    in += strcspn(in, postfix);
     pos = strstr(in, prefix);
   }
   // Copy the remainder of in to out.
@@ -746,4 +750,9 @@
   *out = '\0';
 }
 
+void StripTokenPositions(char* buffer) {
+  ElideJSONSubstring(",\"tokenPos\":", buffer, buffer, ",");
+  ElideJSONSubstring(",\"endTokenPos\":", buffer, buffer, "}");
+}
+
 }  // namespace dart
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 025f8cd..7bc9f23 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -676,7 +676,9 @@
     }                                                                          \
   } while (0)
 
-// Elide a substring which starts with some prefix and ends with a ".
+// Elide a substring which starts with some prefix and ends with some postfix.
+//
+// Prefix is inclusive, postfix is exclusive.
 //
 // This is used to remove non-deterministic or fragile substrings from
 // JSON output.
@@ -691,7 +693,17 @@
 //    out = "\"id\":\"\""
 //
 // WARNING: This function is not safe to use if `in` is bigger than `out`!
-void ElideJSONSubstring(const char* prefix, const char* in, char* out);
+void ElideJSONSubstring(const char* prefix,
+                        const char* in,
+                        char* out,
+                        const char* postfix = "\"");
+
+// Elide a substrings such as ",\"tokenPos\":4372,\"endTokenPos\":4430".
+//
+// Substring to be followed by "}".
+//
+// Modifies buffer in place.
+void StripTokenPositions(char* buffer);
 
 template <typename T>
 class SetFlagScope : public ValueObject {
diff --git a/runtime/vm/utils_test.cc b/runtime/vm/utils_test.cc
index 2b0369f..ba4e296 100644
--- a/runtime/vm/utils_test.cc
+++ b/runtime/vm/utils_test.cc
@@ -290,26 +290,22 @@
   EXPECT(!Utils::IsUint(32, 4294967296LL));
 }
 
-VM_UNIT_TEST_CASE(MagnitudeIsUint) {
-  EXPECT(Utils::MagnitudeIsUint(8, 16));
-  EXPECT(Utils::MagnitudeIsUint(8, 0));
-  EXPECT(Utils::MagnitudeIsUint(8, -128));
-  EXPECT(Utils::MagnitudeIsUint(8, 255));
-  EXPECT(!Utils::MagnitudeIsUint(8, 256));
-  EXPECT(Utils::MagnitudeIsUint(12, 4095));
-  EXPECT(Utils::MagnitudeIsUint(12, -4095));
-  EXPECT(!Utils::MagnitudeIsUint(12, 4096));
-  EXPECT(!Utils::MagnitudeIsUint(12, -4096));
-  EXPECT(Utils::MagnitudeIsUint(16, 16));
-  EXPECT(Utils::MagnitudeIsUint(16, 0));
-  EXPECT(Utils::MagnitudeIsUint(16, 65535));
-  EXPECT(Utils::MagnitudeIsUint(16, -32768));
-  EXPECT(!Utils::MagnitudeIsUint(16, 65536));
-  EXPECT(Utils::MagnitudeIsUint(32, 16LL));
-  EXPECT(Utils::MagnitudeIsUint(32, 0LL));
-  EXPECT(Utils::MagnitudeIsUint(32, -2147483648LL));
-  EXPECT(Utils::MagnitudeIsUint(32, 4294967295LL));
-  EXPECT(!Utils::MagnitudeIsUint(32, 4294967296LL));
+VM_UNIT_TEST_CASE(IsAbsoluteUint) {
+  EXPECT(Utils::IsAbsoluteUint(8, 16));
+  EXPECT(Utils::IsAbsoluteUint(8, 0));
+  EXPECT(Utils::IsAbsoluteUint(8, -128));
+  EXPECT(Utils::IsAbsoluteUint(8, 255));
+  EXPECT(!Utils::IsAbsoluteUint(8, 256));
+  EXPECT(Utils::IsAbsoluteUint(16, 16));
+  EXPECT(Utils::IsAbsoluteUint(16, 0));
+  EXPECT(Utils::IsAbsoluteUint(16, 65535));
+  EXPECT(Utils::IsAbsoluteUint(16, -32768));
+  EXPECT(!Utils::IsAbsoluteUint(16, 65536));
+  EXPECT(Utils::IsAbsoluteUint(32, 16LL));
+  EXPECT(Utils::IsAbsoluteUint(32, 0LL));
+  EXPECT(Utils::IsAbsoluteUint(32, -2147483648LL));
+  EXPECT(Utils::IsAbsoluteUint(32, 4294967295LL));
+  EXPECT(!Utils::IsAbsoluteUint(32, 4294967296LL));
 }
 
 VM_UNIT_TEST_CASE(LowBits) {
diff --git a/tools/VERSION b/tools/VERSION
index e5f179c..f206cb0 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 287
+PRERELEASE 288
 PRERELEASE_PATCH 0
\ No newline at end of file
