diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 72a096e..b44ab93 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -495,6 +495,11 @@
   /// to creation/modification of files that were generated by Bazel.
   void _handleBazelSearchInfo(
       Folder folder, String workspace, BazelSearchInfo info) {
+    final bazelWatcherService = this.bazelWatcherService;
+    if (bazelWatcherService == null) {
+      return;
+    }
+
     var watched = bazelWatchedPathsPerFolder.putIfAbsent(
         folder, () => _BazelWatchedFiles(workspace));
     var added = watched.paths.add(info.requestedPath);
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index a9b8464..0cec373 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -61,6 +61,10 @@
 
     // Prepare the resolved units.
     var result = await server.getResolvedUnit(file);
+    if (result.state != ResultState.VALID) {
+      server.sendResponse(Response.fileNotAnalyzed(request, file));
+      return;
+    }
     var unit = result?.unit;
 
     // Prepare the hovers.
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 93c8e3d..f93c1ad 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -106,7 +106,7 @@
 
       var workspace = DartChangeWorkspace(server.currentSessions);
       var processor = BulkFixProcessor(server.instrumentationService, workspace,
-          useConfigFiles: params.inTestMode);
+          useConfigFiles: params.inTestMode ?? false);
 
       var collection = AnalysisContextCollectionImpl(
         includedPaths: params.included,
diff --git a/pkg/analysis_server/lib/src/plugin/notification_manager.dart b/pkg/analysis_server/lib/src/plugin/notification_manager.dart
index 6ebbf40..b8de615 100644
--- a/pkg/analysis_server/lib/src/plugin/notification_manager.dart
+++ b/pkg/analysis_server/lib/src/plugin/notification_manager.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:collection';
 
 import 'package:analysis_server/protocol/protocol_generated.dart' as server;
@@ -39,7 +37,10 @@
       <server.AnalysisService, Set<String>>{};
 
   /// The collector being used to collect the analysis errors from the plugins.
-  ResultCollector<List<AnalysisError>> errors;
+  // TODO(brianwilkerson) Consider the possibility of not passing the predicate
+  //  in to the collector, but instead to the testing in this class.
+  late ResultCollector<List<AnalysisError>> errors =
+      ResultCollector<List<AnalysisError>>(serverId, predicate: _isIncluded);
 
   /// The collector being used to collect the folding regions from the plugins.
   ResultCollector<List<FoldingRegion>> folding;
@@ -65,15 +66,15 @@
   final ResultMerger merger = ResultMerger();
 
   /// Initialize a newly created notification manager.
-  AbstractNotificationManager(this.pathContext) {
-    errors =
-        ResultCollector<List<AnalysisError>>(serverId, predicate: _isIncluded);
-    folding = ResultCollector<List<FoldingRegion>>(serverId);
-    highlights = ResultCollector<List<HighlightRegion>>(serverId);
-    navigation = ResultCollector<server.AnalysisNavigationParams>(serverId);
-    occurrences = ResultCollector<List<Occurrences>>(serverId);
-    outlines = ResultCollector<List<Outline>>(serverId);
-  }
+  AbstractNotificationManager(this.pathContext)
+      :
+        // errors =
+        //     ResultCollector<List<AnalysisError>>(serverId, predicate: _isIncluded),
+        folding = ResultCollector<List<FoldingRegion>>(serverId),
+        highlights = ResultCollector<List<HighlightRegion>>(serverId),
+        navigation = ResultCollector<server.AnalysisNavigationParams>(serverId),
+        occurrences = ResultCollector<List<Occurrences>>(serverId),
+        outlines = ResultCollector<List<Outline>>(serverId);
 
   /// Handle the given [notification] from the plugin with the given [pluginId].
   void handlePluginNotification(
@@ -160,7 +161,9 @@
       navigation.putResults(filePath, pluginId, navigationData);
       var unmergedNavigations = navigation.getResults(filePath);
       var mergedNavigations = merger.mergeNavigation(unmergedNavigations);
-      sendNavigations(mergedNavigations);
+      if (mergedNavigations != null) {
+        sendNavigations(mergedNavigations);
+      }
     }
   }
 
@@ -221,7 +224,7 @@
       Map<server.AnalysisService, Set<String>> newSubscriptions) {
     /// Return the collector associated with the given service, or `null` if the
     /// service is not handled by this manager.
-    ResultCollector collectorFor(server.AnalysisService service) {
+    ResultCollector? collectorFor(server.AnalysisService service) {
       switch (service) {
         case server.AnalysisService.FOLDING:
           return folding;
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
index 02c1294..1820f9e 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_manager.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:async';
 import 'dart:collection';
 import 'dart:convert';
@@ -81,7 +79,7 @@
       : super(notificationManager, instrumentationService);
 
   @override
-  bool get canBeStarted => executionPath != null;
+  bool get canBeStarted => executionPath.isNotEmpty;
 
   @override
   String get pluginId => path;
@@ -122,9 +120,9 @@
 
   /// The current execution of the plugin, or `null` if the plugin is not
   /// currently being executed.
-  PluginSession currentSession;
+  PluginSession? currentSession;
 
-  CaughtException _exception;
+  CaughtException? _exception;
 
   /// Initialize the newly created information about a plugin.
   PluginInfo(this.notificationManager, this.instrumentationService);
@@ -142,7 +140,7 @@
   /// The exception that occurred that prevented the plugin from being started,
   /// or `null` if there was no exception (possibly because no attempt has yet
   /// been made to start the plugin).
-  CaughtException get exception => _exception;
+  CaughtException? get exception => _exception;
 
   /// Return the id of this plugin, used to identify the plugin to users.
   String get pluginId;
@@ -204,12 +202,12 @@
   /// Start a new isolate that is running the plugin. Return the state object
   /// used to interact with the plugin, or `null` if the plugin could not be
   /// run.
-  Future<PluginSession> start(String byteStorePath, String sdkPath) async {
+  Future<PluginSession?> start(String byteStorePath, String sdkPath) async {
     if (currentSession != null) {
       throw StateError('Cannot start a plugin that is already running.');
     }
     currentSession = PluginSession(this);
-    var isRunning = await currentSession.start(byteStorePath, sdkPath);
+    var isRunning = await currentSession!.start(byteStorePath, sdkPath);
     if (!isRunning) {
       currentSession = null;
     }
@@ -225,7 +223,7 @@
       }
       throw StateError('Cannot stop a plugin that is not running.');
     }
-    var doneFuture = currentSession.stop();
+    var doneFuture = currentSession!.stop();
     currentSession = null;
     return doneFuture;
   }
@@ -235,6 +233,7 @@
 
   /// Update the context roots that the plugin should be analyzing.
   void _updatePluginRoots() {
+    final currentSession = this.currentSession;
     if (currentSession != null) {
       var params = AnalysisSetContextRootsParams(contextRoots
           .map((analyzer.ContextRoot contextRoot) => ContextRoot(
@@ -280,18 +279,18 @@
   /// received from the client. Because plugins are lazily discovered, this
   /// needs to be retained so that it can be sent after a plugin has been
   /// started.
-  AnalysisSetPriorityFilesParams _analysisSetPriorityFilesParams;
+  AnalysisSetPriorityFilesParams? _analysisSetPriorityFilesParams;
 
   /// The parameters for the last 'analysis.setSubscriptions' request that was
   /// received from the client. Because plugins are lazily discovered, this
   /// needs to be retained so that it can be sent after a plugin has been
   /// started.
-  AnalysisSetSubscriptionsParams _analysisSetSubscriptionsParams;
+  AnalysisSetSubscriptionsParams? _analysisSetSubscriptionsParams;
 
   /// The current state of content overlays. Because plugins are lazily
   /// discovered, the state needs to be retained so that it can be sent after a
   /// plugin has been started.
-  final Map<String, dynamic> _overlayState = <String, dynamic>{};
+  final Map<String, AddContentOverlay> _overlayState = {};
 
   final StreamController<void> _pluginsChanged = StreamController.broadcast();
 
@@ -312,14 +311,15 @@
   Future<void> addPluginToContextRoot(
       analyzer.ContextRoot contextRoot, String path) async {
     var plugin = _pluginMap[path];
-    var isNew = plugin == null;
-    if (isNew) {
+    var isNew = false;
+    if (plugin == null) {
+      isNew = true;
       List<String> pluginPaths;
       try {
         pluginPaths = pathsFor(path);
       } catch (exception, stackTrace) {
         plugin = DiscoveredPluginInfo(
-            path, null, null, notificationManager, instrumentationService);
+            path, '', '', notificationManager, instrumentationService);
         plugin.reportException(CaughtException(exception, stackTrace));
         _pluginMap[path] = plugin;
         return;
@@ -327,33 +327,33 @@
       plugin = DiscoveredPluginInfo(path, pluginPaths[0], pluginPaths[1],
           notificationManager, instrumentationService);
       _pluginMap[path] = plugin;
-      if (pluginPaths[0] != null) {
-        try {
-          var session = await plugin.start(byteStorePath, sdkPath);
-          session?.onDone?.then((_) {
-            _pluginMap.remove(path);
-            _notifyPluginsChanged();
-          });
-        } catch (exception, stackTrace) {
-          // Record the exception (for debugging purposes) and record the fact
-          // that we should not try to communicate with the plugin.
-          plugin.reportException(CaughtException(exception, stackTrace));
-          isNew = false;
-        }
+      try {
+        var session = await plugin.start(byteStorePath, sdkPath);
+        session?.onDone.then((_) {
+          _pluginMap.remove(path);
+          _notifyPluginsChanged();
+        });
+      } catch (exception, stackTrace) {
+        // Record the exception (for debugging purposes) and record the fact
+        // that we should not try to communicate with the plugin.
+        plugin.reportException(CaughtException(exception, stackTrace));
+        isNew = false;
       }
 
       _notifyPluginsChanged();
     }
     plugin.addContextRoot(contextRoot);
     if (isNew) {
-      if (_analysisSetSubscriptionsParams != null) {
-        plugin.sendRequest(_analysisSetSubscriptionsParams);
+      var analysisSetSubscriptionsParams = _analysisSetSubscriptionsParams;
+      if (analysisSetSubscriptionsParams != null) {
+        plugin.sendRequest(analysisSetSubscriptionsParams);
       }
       if (_overlayState.isNotEmpty) {
         plugin.sendRequest(AnalysisUpdateContentParams(_overlayState));
       }
-      if (_analysisSetPriorityFilesParams != null) {
-        plugin.sendRequest(_analysisSetPriorityFilesParams);
+      var analysisSetPriorityFilesParams = _analysisSetPriorityFilesParams;
+      if (analysisSetPriorityFilesParams != null) {
+        plugin.sendRequest(analysisSetPriorityFilesParams);
       }
     }
   }
@@ -363,7 +363,7 @@
   /// containing futures that will complete when each of the plugins have sent a
   /// response.
   Map<PluginInfo, Future<Response>> broadcastRequest(RequestParams params,
-      {analyzer.ContextRoot contextRoot}) {
+      {analyzer.ContextRoot? contextRoot}) {
     var plugins = pluginsForContextRoot(contextRoot);
     var responseMap = <PluginInfo, Future<Response>>{};
     for (var plugin in plugins) {
@@ -389,14 +389,15 @@
     bool matches(String pattern) =>
         Glob(resourceProvider.pathContext.separator, pattern).matches(filePath);
 
-    WatchEvent event;
+    WatchEvent? event;
     var responses = <Future<Response>>[];
     for (var plugin in _pluginMap.values) {
       var session = plugin.currentSession;
+      var interestingFiles = session?.interestingFiles;
       if (session != null &&
           plugin.isAnalyzing(filePath) &&
-          session.interestingFiles != null &&
-          session.interestingFiles.any(matches)) {
+          interestingFiles != null &&
+          interestingFiles.any(matches)) {
         // The list of interesting file globs is `null` if the plugin has not
         // yet responded to the plugin.versionCheck request. If that happens
         // then the plugin hasn't had a chance to analyze anything yet, and
@@ -435,6 +436,9 @@
     // plugin will need to be copied and pub will need to be run.
     //
     var stateFolder = resourceProvider.getStateLocation('.plugin_manager');
+    if (stateFolder == null) {
+      throw PluginException('No state location, so plugin could not be copied');
+    }
     var stateName = _uniqueDirectoryName(pluginPath);
     var parentFolder = stateFolder.getChildAssumingFolder(stateName);
     if (parentFolder.exists) {
@@ -449,7 +453,7 @@
   /// Return a list of all of the plugins that are currently associated with the
   /// given [contextRoot].
   @visibleForTesting
-  List<PluginInfo> pluginsForContextRoot(analyzer.ContextRoot contextRoot) {
+  List<PluginInfo> pluginsForContextRoot(analyzer.ContextRoot? contextRoot) {
     if (contextRoot == null) {
       return _pluginMap.values.toList();
     }
@@ -472,7 +476,7 @@
     } catch (exception, stackTrace) {
       var pluginPath = path.join(hostPackageName, 'tools', 'analyzer_plugin');
       var plugin = DiscoveredPluginInfo(
-          pluginPath, null, null, notificationManager, instrumentationService);
+          pluginPath, '', '', notificationManager, instrumentationService);
       plugin.reportException(CaughtException(exception, stackTrace));
       _pluginMap[pluginPath] = plugin;
     }
@@ -514,21 +518,23 @@
         //
         _pluginMap[path] = plugin;
         var session = await plugin.start(byteStorePath, sdkPath);
-        session?.onDone?.then((_) {
+        session?.onDone.then((_) {
           _pluginMap.remove(path);
         });
         //
         // Re-initialize the plugin.
         //
         plugin.addContextRoots(contextRoots);
-        if (_analysisSetSubscriptionsParams != null) {
-          plugin.sendRequest(_analysisSetSubscriptionsParams);
+        var analysisSetSubscriptionsParams = _analysisSetSubscriptionsParams;
+        if (analysisSetSubscriptionsParams != null) {
+          plugin.sendRequest(analysisSetSubscriptionsParams);
         }
         if (_overlayState.isNotEmpty) {
           plugin.sendRequest(AnalysisUpdateContentParams(_overlayState));
         }
-        if (_analysisSetPriorityFilesParams != null) {
-          plugin.sendRequest(_analysisSetPriorityFilesParams);
+        var analysisSetPriorityFilesParams = _analysisSetPriorityFilesParams;
+        if (analysisSetPriorityFilesParams != null) {
+          plugin.sendRequest(analysisSetPriorityFilesParams);
         }
       }
     }
@@ -573,7 +579,7 @@
       } else if (overlay is AddContentOverlay) {
         _overlayState[file] = overlay;
       } else if (overlay is ChangeContentOverlay) {
-        AddContentOverlay previousOverlay = _overlayState[file];
+        var previousOverlay = _overlayState[file]!;
         var newContent =
             SourceEdit.applySequence(previousOverlay.content, overlay.edits);
         _overlayState[file] = AddContentOverlay(newContent);
@@ -599,15 +605,15 @@
   ///
   /// Runs pub if [pubCommand] is provided and not null.
   List<String> _computePaths(Folder pluginFolder,
-      {String pubCommand, Workspace workspace}) {
+      {String? pubCommand, Workspace? workspace}) {
     var pluginFile = pluginFolder
         .getChildAssumingFolder('bin')
         .getChildAssumingFile('plugin.dart');
     if (!pluginFile.exists) {
       throw PluginException('File "${pluginFile.path}" does not exist.');
     }
-    String reason;
-    var packagesFile = pluginFolder.getChildAssumingFile('.packages');
+    String? reason;
+    File? packagesFile = pluginFolder.getChildAssumingFile('.packages');
     if (pubCommand != null) {
       var vmPath = Platform.executable;
       var pubPath = path.join(path.dirname(vmPath), 'pub');
@@ -647,6 +653,7 @@
       }
     }
     if (packagesFile == null) {
+      reason ??= 'Could not create packages file for an unknown reason.';
       throw PluginException(reason);
     }
     return <String>[pluginFile.path, packagesFile.path];
@@ -673,10 +680,10 @@
   /// the given [pluginFolder]. The [packageUriResolver] is used to determine
   /// the location of the packages that need to be included in the packages
   /// file.
-  File _createPackagesFile(
+  File? _createPackagesFile(
       Folder pluginFolder, UriResolver packageUriResolver) {
     var pluginPath = pluginFolder.path;
-    var stateFolder = resourceProvider.getStateLocation('.plugin_manager');
+    var stateFolder = resourceProvider.getStateLocation('.plugin_manager')!;
     var stateName = _uniqueDirectoryName(pluginPath) + '.packages';
     var packagesFile = stateFolder.getChildAssumingFile(stateName);
     if (!packagesFile.exists) {
@@ -698,11 +705,13 @@
             if (!visitedPackages.containsKey(packageName)) {
               var uri = Uri.parse('package:$packageName/$packageName.dart');
               var packageSource = packageUriResolver.resolveAbsolute(uri);
-              var libDirPath = context.dirname(packageSource.fullName);
-              visitedPackages[packageName] = libDirPath;
-              var pubspecPath =
-                  context.join(context.dirname(libDirPath), 'pubspec.yaml');
-              pubspecFiles.add(resourceProvider.getFile(pubspecPath));
+              if (packageSource != null) {
+                var libDirPath = context.dirname(packageSource.fullName);
+                visitedPackages[packageName] = libDirPath;
+                var pubspecPath =
+                    context.join(context.dirname(libDirPath), 'pubspec.yaml');
+                pubspecFiles.add(resourceProvider.getFile(pubspecPath));
+              }
             }
           }
         }
@@ -794,7 +803,7 @@
   Completer<void> pluginStoppedCompleter = Completer<void>();
 
   /// The channel used to communicate with the plugin.
-  ServerCommunicationChannel channel;
+  ServerCommunicationChannel? channel;
 
   /// The index of the next request to be sent to the plugin.
   int requestId = 0;
@@ -809,17 +818,17 @@
 
   /// The contact information to include when reporting problems related to the
   /// plugin.
-  String contactInfo;
+  String? contactInfo;
 
   /// The glob patterns of files that the plugin is interested in knowing about.
-  List<String> interestingFiles;
+  List<String>? interestingFiles;
 
   /// The name to be used when reporting problems related to the plugin.
-  String name;
+  String? name;
 
   /// The version number to be used when reporting problems related to the
   /// plugin.
-  String version;
+  String? version;
 
   /// Initialize the newly created information about the execution of a plugin.
   PluginSession(this.info);
@@ -847,7 +856,7 @@
   /// Handle the fact that the plugin has stopped.
   void handleOnDone() {
     if (channel != null) {
-      channel.close();
+      channel!.close();
       channel = null;
     }
     pluginStoppedCompleter.complete(null);
@@ -865,11 +874,11 @@
   /// created when the request was sent.
   void handleResponse(Response response) {
     var requestData = pendingRequests.remove(response.id);
-    var responseTime = DateTime.now().millisecondsSinceEpoch;
-    var duration = responseTime - requestData.requestTime;
-    PluginManager.recordResponseTime(info, requestData.method, duration);
-    var completer = requestData.completer;
-    if (completer != null) {
+    if (requestData != null) {
+      var responseTime = DateTime.now().millisecondsSinceEpoch;
+      var duration = responseTime - requestData.requestTime;
+      PluginManager.recordResponseTime(info, requestData.method, duration);
+      var completer = requestData.completer;
       completer.complete(response);
     }
   }
@@ -892,6 +901,7 @@
   /// Send a request, based on the given [parameters]. Return a future that will
   /// complete when a response is received.
   Future<Response> sendRequest(RequestParams parameters) {
+    var channel = this.channel;
     if (channel == null) {
       throw StateError('Cannot send a request to a plugin that has stopped.');
     }
@@ -912,34 +922,34 @@
     if (channel != null) {
       throw StateError('Cannot start a plugin that is already running.');
     }
-    if (byteStorePath == null || byteStorePath.isEmpty) {
+    if (byteStorePath.isEmpty) {
       throw StateError('Missing byte store path');
     }
     if (!isCompatible) {
-      info.reportException(
-          CaughtException(PluginException('Plugin is not compatible.'), null));
+      info.reportException(CaughtException(
+          PluginException('Plugin is not compatible.'), StackTrace.current));
       return false;
     }
     if (!info.canBeStarted) {
-      info.reportException(
-          CaughtException(PluginException('Plugin cannot be started.'), null));
+      info.reportException(CaughtException(
+          PluginException('Plugin cannot be started.'), StackTrace.current));
       return false;
     }
     channel = info._createChannel();
     // TODO(brianwilkerson) Determine if await is necessary, if so, change the
     // return type of `channel.listen` to `Future<void>`.
-    await (channel.listen(handleResponse, handleNotification,
+    await (channel!.listen(handleResponse, handleNotification,
         onDone: handleOnDone, onError: handleOnError) as dynamic);
     if (channel == null) {
       // If there is an error when starting the isolate, the channel will invoke
       // handleOnDone, which will cause `channel` to be set to `null`.
       info.reportException(CaughtException(
           PluginException('Unrecorded error while starting the plugin.'),
-          null));
+          StackTrace.current));
       return false;
     }
-    var response = await sendRequest(PluginVersionCheckParams(
-        byteStorePath ?? '', sdkPath, '1.0.0-alpha.0'));
+    var response = await sendRequest(
+        PluginVersionCheckParams(byteStorePath, sdkPath, '1.0.0-alpha.0'));
     var result = PluginVersionCheckResult.fromResponse(response);
     isCompatible = result.isCompatible;
     contactInfo = result.contactInfo;
@@ -948,8 +958,8 @@
     version = result.version;
     if (!isCompatible) {
       sendRequest(PluginShutdownParams());
-      info.reportException(
-          CaughtException(PluginException('Plugin is not compatible.'), null));
+      info.reportException(CaughtException(
+          PluginException('Plugin is not compatible.'), StackTrace.current));
       return false;
     }
     return true;
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
index 6e9bb99..9aad161 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_watcher.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:convert';
 
 import 'package:analysis_server/src/plugin/plugin_locator.dart';
@@ -40,7 +38,7 @@
   /// analysis.
   @override
   void addedDriver(AnalysisDriver driver) {
-    var contextRoot = driver.analysisContext.contextRoot;
+    var contextRoot = driver.analysisContext!.contextRoot;
     _driverInfo[driver] = _DriverInfo(
         contextRoot, <String>[contextRoot.root.path, _getSdkPath(driver)]);
     var enabledPlugins = driver.analysisOptions.enabledPluginNames;
@@ -68,7 +66,7 @@
           // If we don't, then tests don't have any way to know when to expect
           // that the list of plugins has been updated.
           manager.addPluginToContextRoot(
-              driver.analysisContext.contextRoot, pluginPath);
+              driver.analysisContext!.contextRoot, pluginPath);
         }
       }
     }
@@ -81,7 +79,7 @@
     if (info == null) {
       throw StateError('Cannot remove a driver that was not added');
     }
-    manager.removedContextRoot(driver.analysisContext.contextRoot);
+    manager.removedContextRoot(driver.analysisContext!.contextRoot);
     _driverInfo.remove(driver);
   }
 
@@ -99,7 +97,7 @@
       }
     }
 
-    var sdkRoot = coreSource.fullName;
+    var sdkRoot = coreSource!.fullName;
     while (resourceProvider.pathContext.basename(sdkRoot) != 'lib') {
       var parent = resourceProvider.pathContext.dirname(sdkRoot);
       if (parent == sdkRoot) {
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 68c3a9b..af49455 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.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:analysis_server/plugin/edit/assist/assist_core.dart';
 import 'package:analysis_server/plugin/edit/assist/assist_dart.dart';
 import 'package:analysis_server/src/services/correction/assist.dart';
@@ -169,19 +167,11 @@
         );
 
   Future<List<Assist>> compute() async {
-    if (!setupCompute()) {
-      return assists;
-    }
     await _addFromProducers();
-
     return assists;
   }
 
   Future<List<Assist>> computeAssist(AssistKind assistKind) async {
-    if (!setupCompute()) {
-      return assists;
-    }
-
     var context = CorrectionProducerContext.create(
       selectionOffset: selectionOffset,
       selectionLength: selectionLength,
@@ -199,8 +189,11 @@
           workspace: context.workspace, eol: context.utils.endOfLine);
       await producer.compute(builder);
 
-      _addAssistFromBuilder(builder, producer.assistKind,
-          args: producer.assistArguments);
+      var assistKind = producer.assistKind;
+      if (assistKind != null) {
+        _addAssistFromBuilder(builder, assistKind,
+            args: producer.assistArguments);
+      }
     }
 
     // Calculate only specific assists for edit.dartFix
@@ -219,10 +212,7 @@
   }
 
   void _addAssistFromBuilder(ChangeBuilder builder, AssistKind kind,
-      {List<Object> args}) {
-    if (builder == null) {
-      return;
-    }
+      {List<Object>? args}) {
     var change = builder.sourceChange;
     if (change.edits.isEmpty) {
       return;
@@ -240,7 +230,7 @@
       workspace: workspace,
     );
     if (context == null) {
-      return assists;
+      return;
     }
 
     Future<void> compute(CorrectionProducer producer) async {
@@ -249,8 +239,11 @@
           workspace: context.workspace, eol: context.utils.endOfLine);
       try {
         await producer.compute(builder);
-        _addAssistFromBuilder(builder, producer.assistKind,
-            args: producer.assistArguments);
+        var assistKind = producer.assistKind;
+        if (assistKind != null) {
+          _addAssistFromBuilder(builder, assistKind,
+              args: producer.assistArguments);
+        }
       } on ConflictingEditException catch (exception, stackTrace) {
         // Handle the exception by (a) not adding an assist based on the
         // producer and (b) logging the exception.
@@ -276,6 +269,11 @@
   }
 
   bool _containsErrorCode(Set<String> errorCodes) {
+    final node = findSelectedNode();
+    if (node == null) {
+      return false;
+    }
+
     final fileOffset = node.offset;
     for (var error in assistContext.resolveResult.errors) {
       final errorSource = error.source;
diff --git a/pkg/analysis_server/lib/src/services/correction/base_processor.dart b/pkg/analysis_server/lib/src/services/correction/base_processor.dart
index 25b6c84..543d8c9 100644
--- a/pkg/analysis_server/lib/src/services/correction/base_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/base_processor.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
-import 'package:meta/meta.dart';
 
 /// Base class for common processor functionality.
 abstract class BaseProcessor {
@@ -29,14 +28,12 @@
   final ResolvedUnitResult resolvedResult;
   final ChangeWorkspace workspace;
 
-  AstNode? node;
-
   BaseProcessor({
     this.selectionOffset = -1,
     this.selectionLength = 0,
     required this.resolvedResult,
     required this.workspace,
-  })   : file = resolvedResult.path!,
+  })  : file = resolvedResult.path!,
         session = resolvedResult.session,
         sessionHelper = AnalysisSessionHelper(resolvedResult.session),
         typeProvider = resolvedResult.typeProvider,
@@ -45,10 +42,8 @@
 
   Flutter get flutter => Flutter.instance;
 
-  @protected
-  bool setupCompute() {
+  AstNode? findSelectedNode() {
     final locator = NodeLocator(selectionOffset, selectionEnd);
-    node = locator.searchWithin(resolvedResult.unit);
-    return node != null;
+    return locator.searchWithin(resolvedResult.unit);
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index 9b3dba2..65467c5 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.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:core';
 
 import 'package:analysis_server/plugin/edit/fix/fix_dart.dart';
@@ -150,9 +148,8 @@
   /// Initialize a newly created processor to create fixes for diagnostics in
   /// libraries in the [workspace].
   BulkFixProcessor(this.instrumentationService, this.workspace,
-      {bool useConfigFiles})
-      : useConfigFiles = useConfigFiles ?? false,
-        builder = ChangeBuilder(workspace: workspace);
+      {this.useConfigFiles = false})
+      : builder = ChangeBuilder(workspace: workspace);
 
   List<BulkFix> get fixDetails {
     var details = <BulkFix>[];
@@ -199,19 +196,19 @@
     );
 
     final analysisOptions = unit.session.analysisContext.analysisOptions;
-    final fixContext = DartFixContextImpl(
-      instrumentationService,
-      workspace,
-      unit,
-      null,
-      (name) => [],
-    );
 
     var overrideSet = _readOverrideSet(unit);
     for (var error in errors) {
       final processor = ErrorProcessor.getProcessor(analysisOptions, error);
       // Only fix errors not filtered out in analysis options.
       if (processor == null || processor.severity != null) {
+        final fixContext = DartFixContextImpl(
+          instrumentationService,
+          workspace,
+          unit,
+          error,
+          (name) => [],
+        );
         await _fixSingleError(fixContext, unit, error, overrideSet);
       }
     }
@@ -235,9 +232,7 @@
       for (var fix in fixes) {
         if (fix.canBeBulkApplied) {
           final generators = fix.generators;
-          if (generators != null) {
-            yield* generators.map((g) => g().fixKind).whereNotNull();
-          }
+          yield* generators.map((g) => g().fixKind).whereNotNull();
         }
       }
       return;
@@ -247,9 +242,7 @@
     for (var fix in fixes) {
       if (fix.canBeBulkApplied) {
         final generators = fix.generators;
-        if (generators != null) {
-          yield* generators.map((g) => g().fixKind).whereNotNull();
-        }
+        yield* generators.map((g) => g().fixKind).whereNotNull();
       }
     }
 
@@ -259,7 +252,7 @@
         instrumentationService,
         workspace,
         result,
-        null,
+        diagnostic,
         (name) => [],
       );
 
@@ -279,9 +272,7 @@
       for (final multiGenerator in multiGenerators) {
         final multiProducer = multiGenerator();
         multiProducer.configure(context);
-        yield* multiProducer.producers
-            .map((p) => p.fixKind)
-            .where((k) => k != null);
+        yield* multiProducer.producers.map((p) => p.fixKind).whereNotNull();
       }
     }
   }
@@ -290,19 +281,19 @@
   /// library associated with the analysis [result].
   Future<void> _fixErrorsInLibrary(ResolvedLibraryResult result) async {
     var analysisOptions = result.session.analysisContext.analysisOptions;
-    for (var unitResult in result.units) {
-      final fixContext = DartFixContextImpl(
-        instrumentationService,
-        workspace,
-        unitResult,
-        null,
-        (name) => [],
-      );
+    for (var unitResult in result.units!) {
       var overrideSet = _readOverrideSet(unitResult);
       for (var error in unitResult.errors) {
         var processor = ErrorProcessor.getProcessor(analysisOptions, error);
         // Only fix errors not filtered out in analysis options.
         if (processor == null || processor.severity != null) {
+          final fixContext = DartFixContextImpl(
+            instrumentationService,
+            workspace,
+            unitResult,
+            error,
+            (name) => [],
+          );
           await _fixSingleError(fixContext, unitResult, error, overrideSet);
         }
       }
@@ -316,7 +307,7 @@
       DartFixContext fixContext,
       ResolvedUnitResult result,
       AnalysisError diagnostic,
-      TransformOverrideSet overrideSet) async {
+      TransformOverrideSet? overrideSet) async {
     var context = CorrectionProducerContext.create(
       applyingBulkFixes: true,
       dartFixContext: fixContext,
@@ -357,7 +348,7 @@
       await compute(producer);
       var newHash = computeChangeHash();
       if (newHash != oldHash) {
-        changeMap.add(result.path, code);
+        changeMap.add(result.path!, code);
       }
     }
 
@@ -365,10 +356,8 @@
       for (var fix in fixes) {
         if (fix.canBeBulkApplied) {
           final generators = fix.generators;
-          if (generators != null) {
-            for (var generator in generators) {
-              await generate(generator(), codeName);
-            }
+          for (var generator in generators) {
+            await generate(generator(), codeName);
           }
         }
       }
@@ -405,11 +394,11 @@
   /// Return the override set corresponding to the given [result], or `null` if
   /// there is no corresponding configuration file or the file content isn't a
   /// valid override set.
-  TransformOverrideSet _readOverrideSet(ResolvedUnitResult result) {
+  TransformOverrideSet? _readOverrideSet(ResolvedUnitResult result) {
     if (useConfigFiles) {
       var provider = result.session.resourceProvider;
       var context = provider.pathContext;
-      var dartFileName = result.path;
+      var dartFileName = result.path!;
       var configFileName = '${context.withoutExtension(dartFileName)}.config';
       var configFile = provider.getFile(configFileName);
       try {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
index 1f2770b..5261db3 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/code_template.dart';
@@ -20,7 +18,7 @@
 class DataDriven extends MultiCorrectionProducer {
   /// The transform sets used by the current test.
   @visibleForTesting
-  static List<TransformSet> transformSetsForTests;
+  static List<TransformSet>? transformSetsForTests;
 
   @override
   Iterable<CorrectionProducer> get producers sync* {
@@ -51,8 +49,9 @@
   /// Return the transform sets that are available for fixing issues in the
   /// given [library].
   List<TransformSet> _availableTransformSetsForLibrary(LibraryElement library) {
-    if (transformSetsForTests != null) {
-      return transformSetsForTests;
+    var setsForTests = transformSetsForTests;
+    if (setsForTests != null) {
+      return setsForTests;
     }
     var transformSets = TransformSetManager.instance.forLibrary(library);
     var overrideSet = this.overrideSet;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
index a6400d8..1b02c88 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
@@ -2,14 +2,13 @@
 // 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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/selection_analyzer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -19,7 +18,7 @@
   Iterable<CorrectionProducer> get producers sync* {
     var widgetExpr = flutter.identifyWidgetExpression(node);
     if (widgetExpr != null) {
-      var widgetType = widgetExpr.staticType;
+      var widgetType = widgetExpr.typeOrThrow;
       yield _FlutterWrapGeneric(widgetExpr);
       if (!flutter.isExactWidgetTypeCenter(widgetType)) {
         yield _FlutterWrapCenter(widgetExpr);
@@ -40,12 +39,13 @@
   Iterable<CorrectionProducer> _wrapMultipleWidgets() sync* {
     var selectionRange = SourceRange(selectionOffset, selectionLength);
     var analyzer = SelectionAnalyzer(selectionRange);
-    resolvedResult.unit.accept(analyzer);
+    resolvedResult.unit!.accept(analyzer);
 
     var widgetExpressions = <Expression>[];
     if (analyzer.hasSelectedNodes) {
       for (var selectedNode in analyzer.selectedNodes) {
-        if (!flutter.isWidgetExpression(selectedNode)) {
+        if (selectedNode is! Expression ||
+            !flutter.isWidgetExpression(selectedNode)) {
           return;
         }
         widgetExpressions.add(selectedNode);
@@ -249,9 +249,9 @@
 
   List<String> get _leadingLines => const [];
 
-  String get _parentClassName => null;
+  String? get _parentClassName => null;
 
-  String get _parentLibraryUri => null;
+  String? get _parentLibraryUri => null;
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
@@ -260,7 +260,7 @@
     // If the wrapper class is specified, find its element.
     var parentLibraryUri = _parentLibraryUri;
     var parentClassName = _parentClassName;
-    ClassElement parentClassElement;
+    ClassElement? parentClassElement;
     if (parentLibraryUri != null && parentClassName != null) {
       parentClassElement =
           await sessionHelper.getClass(parentLibraryUri, parentClassName);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
index a2b9351..752a414 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
@@ -2,10 +2,9 @@
 // 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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -20,7 +19,7 @@
     if (widgetExpr == null) {
       return;
     }
-    if (flutter.isExactWidgetTypeBuilder(widgetExpr.staticType)) {
+    if (flutter.isExactWidgetTypeBuilder(widgetExpr.typeOrThrow)) {
       return;
     }
     var widgetSrc = utils.getNodeText(widgetExpr);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_parameters_in_getter_declaration.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_parameters_in_getter_declaration.dart
index cb17bce..cf13f53 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_parameters_in_getter_declaration.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_parameters_in_getter_declaration.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -22,11 +20,9 @@
       // Support for the analyzer error.
       var name = node.name;
       var body = node.body;
-      if (name != null && body != null) {
-        await builder.addDartFileEdit(file, (builder) {
-          builder.addSimpleReplacement(range.endStart(name, body), ' ');
-        });
-      }
+      await builder.addDartFileEdit(file, (builder) {
+        builder.addSimpleReplacement(range.endStart(name, body), ' ');
+      });
     } else if (node is FormalParameterList) {
       // Support for the fasta error.
       await builder.addDartFileEdit(file, (builder) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/rename_to_camel_case.dart b/pkg/analysis_server/lib/src/services/correction/dart/rename_to_camel_case.dart
index 7e61a0e..752dd51 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/rename_to_camel_case.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/rename_to_camel_case.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
@@ -16,7 +14,7 @@
 
 class RenameToCamelCase extends CorrectionProducer {
   /// The camel-case version of the name.
-  String _newName;
+  String _newName = '';
 
   @override
   List<Object> get fixArguments => [_newName];
@@ -29,10 +27,10 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    if (node is! SimpleIdentifier) {
+    var identifier = node;
+    if (identifier is! SimpleIdentifier) {
       return;
     }
-    SimpleIdentifier identifier = node;
 
     // Prepare the new name.
     var words = identifier.name.split('_');
@@ -42,17 +40,21 @@
     _newName = words.first + words.skip(1).map((w) => capitalize(w)).join();
 
     // Find references to the identifier.
-    List<SimpleIdentifier> references;
+    List<SimpleIdentifier>? references;
     var element = identifier.staticElement;
     if (element is LocalVariableElement) {
-      AstNode root = node.thisOrAncestorOfType<Block>();
-      references = findLocalElementReferences(root, element);
+      var root = node.thisOrAncestorOfType<Block>();
+      if (root != null) {
+        references = findLocalElementReferences(root, element);
+      }
     } else if (element is ParameterElement) {
       if (!element.isNamed) {
         var root = node.thisOrAncestorMatching((node) =>
             node.parent is ClassOrMixinDeclaration ||
             node.parent is CompilationUnit);
-        references = findLocalElementReferences(root, element);
+        if (root != null) {
+          references = findLocalElementReferences(root, element);
+        }
       }
     }
     if (references == null) {
@@ -60,8 +62,9 @@
     }
 
     // Compute the change.
+    var references_final = references;
     await builder.addDartFileEdit(file, (builder) {
-      for (var reference in references) {
+      for (var reference in references_final) {
         builder.addSimpleReplacement(range.node(reference), _newName);
       }
     });
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_boolean_with_bool.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_boolean_with_bool.dart
index 5039e9b7..c35c13f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_boolean_with_bool.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_boolean_with_bool.dart
@@ -2,10 +2,9 @@
 // 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -19,8 +18,13 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
+    final analysisError = diagnostic;
+    if (analysisError is! AnalysisError) {
+      return;
+    }
+
     await builder.addDartFileEdit(file, (builder) {
-      builder.addSimpleReplacement(range.error(diagnostic), 'bool');
+      builder.addSimpleReplacement(range.error(analysisError), 'bool');
     });
   }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_cascade_with_dot.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_cascade_with_dot.dart
index 00d41c3..3a7b269 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_cascade_with_dot.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_cascade_with_dot.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -31,29 +29,35 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    var node = this.node;
-    if (node is CascadeExpression) {
-      var sections = node.cascadeSections;
-      if (sections.length == 1) {
-        await _replaceFor(builder, sections[0]);
-      }
+    final cascadeExpression = node;
+    if (cascadeExpression is! CascadeExpression) {
+      return;
+    }
+
+    var sections = cascadeExpression.cascadeSections;
+    if (sections.length == 1) {
+      await _replaceFor(builder, sections[0]);
     }
   }
 
-  Future<void> _replaceFor(ChangeBuilder builder, Expression section) async {
+  Future<void> _replaceFor(ChangeBuilder builder, Expression? section) async {
     if (section is AssignmentExpression) {
       return _replaceFor(builder, section.leftHandSide);
     }
 
     if (section is IndexExpression) {
-      if (section.period != null) {
-        return _replaceToken(builder, section.period, _indexReplacement);
+      var period = section.period;
+      if (period != null) {
+        return _replaceToken(builder, period, _indexReplacement);
       }
       return _replaceFor(builder, section.target);
     }
 
     if (section is MethodInvocation) {
-      return _replaceToken(builder, section.operator, _propertyReplacement);
+      var operator = section.operator;
+      if (operator != null) {
+        return _replaceToken(builder, operator, _propertyReplacement);
+      }
     }
 
     if (section is PropertyAccess) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_colon_with_equals.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_colon_with_equals.dart
index 4f9b235..f6adef4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_colon_with_equals.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_colon_with_equals.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -20,12 +18,19 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    if (node is DefaultFormalParameter) {
-      await builder.addDartFileEdit(file, (builder) {
-        builder.addSimpleReplacement(
-            range.token((node as DefaultFormalParameter).separator), ' =');
-      });
+    final node = this.node;
+    if (node is! DefaultFormalParameter) {
+      return;
     }
+
+    var separator = node.separator;
+    if (separator == null) {
+      return;
+    }
+
+    await builder.addDartFileEdit(file, (builder) {
+      builder.addSimpleReplacement(range.token(separator), ' =');
+    });
   }
 
   /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_conditional_with_if_else.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_conditional_with_if_else.dart
index adb16a8..7dee07a 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_conditional_with_if_else.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_conditional_with_if_else.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/token.dart';
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
@@ -18,58 +16,98 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    ConditionalExpression conditional;
     // may be on Statement with Conditional
     var statement = node.thisOrAncestorOfType<Statement>();
     if (statement == null) {
       return;
     }
-    // variable declaration
-    var inVariable = false;
-    if (statement is VariableDeclarationStatement) {
-      var variableStatement = statement;
-      for (var variable in variableStatement.variables.variables) {
-        if (variable.initializer is ConditionalExpression) {
-          conditional = variable.initializer as ConditionalExpression;
-          inVariable = true;
-          break;
-        }
-      }
-    }
-    // assignment
-    var inAssignment = false;
-    if (statement is ExpressionStatement) {
-      var exprStmt = statement;
-      if (exprStmt.expression is AssignmentExpression) {
-        var assignment = exprStmt.expression as AssignmentExpression;
-        if (assignment.operator.type == TokenType.EQ &&
-            assignment.rightHandSide is ConditionalExpression) {
-          conditional = assignment.rightHandSide as ConditionalExpression;
-          inAssignment = true;
-        }
-      }
-    }
-    // return
-    var inReturn = false;
-    if (statement is ReturnStatement) {
-      var returnStatement = statement;
-      if (returnStatement.expression is ConditionalExpression) {
-        conditional = returnStatement.expression as ConditionalExpression;
-        inReturn = true;
-      }
-    }
-    // prepare environment
-    var indent = utils.getIndent(1);
-    var prefix = utils.getNodePrefix(statement);
 
-    if (inVariable || inAssignment || inReturn) {
+    // Type v = conditional;
+    if (statement is VariableDeclarationStatement) {
+      return _variableDeclarationStatement(builder, statement);
+    }
+
+    // v = conditional;
+    if (statement is ExpressionStatement) {
+      var expression = statement.expression;
+      if (expression is AssignmentExpression) {
+        return _assignmentExpression(builder, statement, expression);
+      }
+    }
+
+    // return conditional;
+    if (statement is ReturnStatement) {
+      return _returnStatement(builder, statement);
+    }
+  }
+
+  Future<void> _assignmentExpression(
+    ChangeBuilder builder,
+    ExpressionStatement statement,
+    AssignmentExpression assignment,
+  ) async {
+    var conditional = assignment.rightHandSide;
+    if (assignment.operator.type == TokenType.EQ &&
+        conditional is ConditionalExpression) {
+      var indent = utils.getIndent(1);
+      var prefix = utils.getNodePrefix(statement);
+
       await builder.addDartFileEdit(file, (builder) {
-        // Type v = Conditional;
-        if (inVariable) {
+        var leftSide = assignment.leftHandSide;
+        var conditionSrc = utils.getNodeText(conditional.condition);
+        var thenSrc = utils.getNodeText(conditional.thenExpression);
+        var elseSrc = utils.getNodeText(conditional.elseExpression);
+        var name = utils.getNodeText(leftSide);
+        var src = '';
+        src += 'if ($conditionSrc) {' + eol;
+        src += prefix + indent + '$name = $thenSrc;' + eol;
+        src += prefix + '} else {' + eol;
+        src += prefix + indent + '$name = $elseSrc;' + eol;
+        src += prefix + '}';
+        builder.addSimpleReplacement(range.node(statement), src);
+      });
+    }
+  }
+
+  Future<void> _returnStatement(
+    ChangeBuilder builder,
+    ReturnStatement statement,
+  ) async {
+    var conditional = statement.expression;
+    if (conditional is ConditionalExpression) {
+      var indent = utils.getIndent(1);
+      var prefix = utils.getNodePrefix(statement);
+
+      await builder.addDartFileEdit(file, (builder) {
+        var conditionSrc = utils.getNodeText(conditional.condition);
+        var thenSrc = utils.getNodeText(conditional.thenExpression);
+        var elseSrc = utils.getNodeText(conditional.elseExpression);
+        var src = '';
+        src += 'if ($conditionSrc) {' + eol;
+        src += prefix + indent + 'return $thenSrc;' + eol;
+        src += prefix + '} else {' + eol;
+        src += prefix + indent + 'return $elseSrc;' + eol;
+        src += prefix + '}';
+        builder.addSimpleReplacement(range.node(statement), src);
+      });
+    }
+  }
+
+  Future<void> _variableDeclarationStatement(
+    ChangeBuilder builder,
+    VariableDeclarationStatement statement,
+  ) async {
+    for (var variable in statement.variables.variables) {
+      var conditional = variable.initializer;
+      if (conditional is ConditionalExpression) {
+        var indent = utils.getIndent(1);
+        var prefix = utils.getNodePrefix(statement);
+
+        await builder.addDartFileEdit(file, (builder) {
           var variable = conditional.parent as VariableDeclaration;
           var variableList = variable.parent as VariableDeclarationList;
           if (variableList.type == null) {
-            var type = variable.declaredElement.type;
+            var type = variable.declaredElement!.type;
             var keyword = variableList.keyword;
             if (keyword != null && keyword.keyword == Keyword.VAR) {
               builder.addReplacement(range.token(keyword), (builder) {
@@ -94,37 +132,8 @@
           src += prefix + indent + '$name = $elseSrc;' + eol;
           src += prefix + '}';
           builder.addSimpleReplacement(range.endLength(statement, 0), src);
-        }
-        // v = Conditional;
-        if (inAssignment) {
-          var assignment = conditional.parent as AssignmentExpression;
-          var leftSide = assignment.leftHandSide;
-          var conditionSrc = utils.getNodeText(conditional.condition);
-          var thenSrc = utils.getNodeText(conditional.thenExpression);
-          var elseSrc = utils.getNodeText(conditional.elseExpression);
-          var name = utils.getNodeText(leftSide);
-          var src = '';
-          src += 'if ($conditionSrc) {' + eol;
-          src += prefix + indent + '$name = $thenSrc;' + eol;
-          src += prefix + '} else {' + eol;
-          src += prefix + indent + '$name = $elseSrc;' + eol;
-          src += prefix + '}';
-          builder.addSimpleReplacement(range.node(statement), src);
-        }
-        // return Conditional;
-        if (inReturn) {
-          var conditionSrc = utils.getNodeText(conditional.condition);
-          var thenSrc = utils.getNodeText(conditional.thenExpression);
-          var elseSrc = utils.getNodeText(conditional.elseExpression);
-          var src = '';
-          src += 'if ($conditionSrc) {' + eol;
-          src += prefix + indent + 'return $thenSrc;' + eol;
-          src += prefix + '} else {' + eol;
-          src += prefix + indent + 'return $elseSrc;' + eol;
-          src += prefix + '}';
-          builder.addSimpleReplacement(range.node(statement), src);
-        }
-      });
+        });
+      }
     }
   }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_final_with_const.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_final_with_const.dart
index 3a77351..76b2a8e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_final_with_const.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_final_with_const.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -20,11 +18,14 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
+    final node = this.node;
     if (node is VariableDeclarationList) {
-      await builder.addDartFileEdit(file, (builder) {
-        builder.addSimpleReplacement(
-            range.token((node as VariableDeclarationList).keyword), 'const');
-      });
+      var keyword = node.keyword;
+      if (keyword != null) {
+        await builder.addDartFileEdit(file, (builder) {
+          builder.addSimpleReplacement(range.token(keyword), 'const');
+        });
+      }
     }
   }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_final_with_var.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_final_with_var.dart
index 58a4a76..9371a8d 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_final_with_var.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_final_with_var.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -20,11 +18,12 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    var target = node;
-    if (target is VariableDeclarationList) {
-      if (target.type == null) {
+    final node = this.node;
+    if (node is VariableDeclarationList) {
+      var keyword = node.keyword;
+      if (keyword != null && node.type == null) {
         await builder.addDartFileEdit(file, (builder) {
-          builder.addSimpleReplacement(range.token(target.keyword), 'var');
+          builder.addSimpleReplacement(range.token(keyword), 'var');
         });
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_if_else_with_conditional.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_if_else_with_conditional.dart
index 9224921..85e9599 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_if_else_with_conditional.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_if_else_with_conditional.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/token.dart';
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_new_with_const.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_new_with_const.dart
index 9a9cd77..e8db9a3 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_new_with_const.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_new_with_const.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -20,7 +18,7 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    var node = this.node;
+    AstNode? node = this.node;
     if (node is ConstructorName) {
       node = node.parent;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_null_with_closure.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_null_with_closure.dart
index 39aabc2..9da2766 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_null_with_closure.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_null_with_closure.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -22,13 +20,14 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    AstNode nodeToFix;
+    AstNode? nodeToFix;
     var parameters = const <ParameterElement>[];
+
+    final coveredNode = this.coveredNode;
     if (coveredNode is NamedExpression) {
-      NamedExpression namedExpression = coveredNode;
-      var expression = namedExpression.expression;
+      var expression = coveredNode.expression;
       if (expression is NullLiteral) {
-        var element = namedExpression.element;
+        var element = coveredNode.element;
         if (element is ParameterElement) {
           var type = element.type;
           if (type is FunctionType) {
@@ -41,14 +40,17 @@
       nodeToFix = coveredNode;
     }
 
-    if (nodeToFix != null) {
-      await builder.addDartFileEdit(file, (builder) {
-        builder.addReplacement(range.node(nodeToFix), (builder) {
-          builder.writeParameters(parameters);
-          builder.write(' => null');
-        });
-      });
+    if (nodeToFix == null) {
+      return;
     }
+
+    final nodeToFix_final = nodeToFix;
+    await builder.addDartFileEdit(file, (builder) {
+      builder.addReplacement(range.node(nodeToFix_final), (builder) {
+        builder.writeParameters(parameters);
+        builder.write(' => null');
+      });
+    });
   }
 
   /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart
index 3d0000a..c19cf4a 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -18,7 +16,10 @@
   Future<void> compute(ChangeBuilder builder) async {
     // prepare the existing type
     var typeName = node.thisOrAncestorOfType<TypeAnnotation>();
-    var typeProvider = this.typeProvider;
+    if (typeName == null) {
+      return;
+    }
+
     await builder.addDartFileEdit(file, (builder) {
       builder.replaceTypeWithFuture(typeName, typeProvider);
     });
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_var_with_dynamic.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_var_with_dynamic.dart
index 3da975f..1991391 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_var_with_dynamic.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_var_with_dynamic.dart
@@ -2,10 +2,9 @@
 // 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -16,9 +15,12 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    await builder.addDartFileEdit(file, (builder) {
-      builder.addSimpleReplacement(range.error(diagnostic), 'dynamic');
-    });
+    final diagnostic = this.diagnostic;
+    if (diagnostic is AnalysisError) {
+      await builder.addDartFileEdit(file, (builder) {
+        builder.addSimpleReplacement(range.error(diagnostic), 'dynamic');
+      });
+    }
   }
 
   /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_brackets.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_brackets.dart
index 83f4caf..eb4fc02 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_brackets.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_brackets.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_conditional_assignment.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_conditional_assignment.dart
index e7dfbd2..9d69d50 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_conditional_assignment.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_conditional_assignment.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -21,20 +19,14 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    IfStatement ifStatement =
+    var node = this.node;
+    var ifStatement =
         node is IfStatement ? node : node.thisOrAncestorOfType<IfStatement>();
     if (ifStatement == null) {
       return;
     }
-    var thenStatement = ifStatement.thenStatement;
-    Statement uniqueStatement(Statement statement) {
-      if (statement is Block) {
-        return uniqueStatement(statement.statements.first);
-      }
-      return statement;
-    }
 
-    thenStatement = uniqueStatement(thenStatement);
+    var thenStatement = _uniqueStatement(ifStatement.thenStatement);
     if (thenStatement is ExpressionStatement) {
       final expression = thenStatement.expression.unParenthesized;
       if (expression is AssignmentExpression) {
@@ -53,4 +45,11 @@
   /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
   static ReplaceWithConditionalAssignment newInstance() =>
       ReplaceWithConditionalAssignment();
+
+  static Statement _uniqueStatement(Statement statement) {
+    if (statement is Block) {
+      return _uniqueStatement(statement.statements.first);
+    }
+    return statement;
+  }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_eight_digit_hex.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_eight_digit_hex.dart
index d0c7229..ff9e2eb 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_eight_digit_hex.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_eight_digit_hex.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -13,7 +11,7 @@
 
 class ReplaceWithEightDigitHex extends CorrectionProducer {
   /// The replacement text, used as an argument to the fix message.
-  String _replacement;
+  String _replacement = '';
 
   @override
   List<Object> get fixArguments => [_replacement];
@@ -33,6 +31,9 @@
       return;
     }
     var value = (node as IntegerLiteral).value;
+    if (value == null) {
+      return;
+    }
     _replacement = '0x' + value.toRadixString(16).padLeft(8, '0');
     //
     // Build the edit.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_extension_name.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_extension_name.dart
index ed7fa48..6bac2bd 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_extension_name.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_extension_name.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -12,7 +10,7 @@
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 class ReplaceWithExtensionName extends CorrectionProducer {
-  String _extensionName;
+  String _extensionName = '';
 
   @override
   List<Object> get fixArguments => [_extensionName];
@@ -35,7 +33,7 @@
     }
   }
 
-  AstNode _getTarget(AstNode invocation) {
+  AstNode? _getTarget(AstNode? invocation) {
     if (invocation is MethodInvocation && node == invocation.methodName) {
       return invocation.target;
     } else if (invocation is PropertyAccess &&
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_filled.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_filled.dart
index fc40853..860e620 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_filled.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_filled.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_identifier.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_identifier.dart
index 33d0b66..9b30817 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_identifier.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_identifier.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_interpolation.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_interpolation.dart
index 77aa027..639f53f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_interpolation.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_interpolation.dart
@@ -2,16 +2,14 @@
 // 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
-import 'package:meta/meta.dart';
 
 class ReplaceWithInterpolation extends CorrectionProducer {
   @override
@@ -22,9 +20,9 @@
     //
     // Validate the fix.
     //
-    BinaryExpression binary;
-    var candidate = node;
-    while (_isStringConcatenation(candidate)) {
+    BinaryExpression? binary;
+    AstNode? candidate = node;
+    while (candidate is BinaryExpression && _isStringConcatenation(candidate)) {
       binary = candidate;
       candidate = candidate.parent;
     }
@@ -43,8 +41,9 @@
     //
     // Build the edit.
     //
+    final binary_final = binary;
     await builder.addDartFileEdit(file, (builder) {
-      builder.addSimpleReplacement(range.node(binary), interpolation);
+      builder.addSimpleReplacement(range.node(binary_final), interpolation);
     });
   }
 
@@ -82,9 +81,11 @@
         return leftStyle;
       }
       return leftStyle == rightStyle ? leftStyle : _StringStyle.invalid;
-    } else if (expression is MethodInvocation &&
-        expression.methodName.name == 'toString') {
-      return _extractComponentsInto(expression.target, components);
+    } else if (expression is MethodInvocation) {
+      var target = expression.target;
+      if (target != null && expression.methodName.name == 'toString') {
+        return _extractComponentsInto(target, components);
+      }
     } else if (expression is ParenthesizedExpression) {
       return _extractComponentsInto(expression.expression, components);
     }
@@ -95,8 +96,8 @@
   bool _isStringConcatenation(AstNode node) =>
       node is BinaryExpression &&
       node.operator.type == TokenType.PLUS &&
-      node.leftOperand.staticType.isDartCoreString &&
-      node.rightOperand.staticType.isDartCoreString;
+      node.leftOperand.typeOrThrow.isDartCoreString &&
+      node.rightOperand.typeOrThrow.isDartCoreString;
 
   String _mergeComponents(_StringStyle style, List<AstNode> components) {
     var quotes = style.quotes;
@@ -161,10 +162,11 @@
 
   final int state;
 
-  factory _StringStyle(
-      {@required bool multiline,
-      @required bool raw,
-      @required bool singleQuoted}) {
+  factory _StringStyle({
+    required bool multiline,
+    required bool raw,
+    required bool singleQuoted,
+  }) {
     return _StringStyle._((multiline ? multilineBit : 0) +
         (raw ? rawBit : 0) +
         (singleQuoted ? singleQuotedBit : 0));
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_is_empty.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_is_empty.dart
index 9c02fda..96b25d6 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_is_empty.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_is_empty.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -14,106 +12,28 @@
 
 class ReplaceWithIsEmpty extends CorrectionProducer {
   @override
-  FixKind fixKind;
+  FixKind fixKind = DartFixKind.REPLACE_WITH_IS_EMPTY;
 
   @override
-  FixKind multiFixKind;
+  FixKind multiFixKind = DartFixKind.REPLACE_WITH_IS_EMPTY_MULTI;
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    /// Return the value of an integer literal or prefix expression with a
-    /// minus and then an integer literal. For anything else, returns `null`.
-    int getIntValue(Expression expressions) {
-      // Copied from package:linter/src/rules/prefer_is_empty.dart.
-      if (expressions is IntegerLiteral) {
-        return expressions.value;
-      } else if (expressions is PrefixExpression) {
-        var operand = expressions.operand;
-        if (expressions.operator.type == TokenType.MINUS &&
-            operand is IntegerLiteral) {
-          return -operand.value;
-        }
-      }
-      return null;
-    }
-
-    /// Return the expression producing the object on which `length` is being
-    /// invoked, or `null` if there is no such expression.
-    Expression getLengthTarget(Expression expression) {
-      if (expression is PropertyAccess &&
-          expression.propertyName.name == 'length') {
-        return expression.target;
-      } else if (expression is PrefixedIdentifier &&
-          expression.identifier.name == 'length') {
-        return expression.prefix;
-      }
-      return null;
-    }
-
     var binary = node.thisOrAncestorOfType<BinaryExpression>();
-    var operator = binary.operator.type;
-    String getter;
-    Expression lengthTarget;
-    var rightValue = getIntValue(binary.rightOperand);
-    if (rightValue != null) {
-      lengthTarget = getLengthTarget(binary.leftOperand);
-      if (rightValue == 0) {
-        if (operator == TokenType.EQ_EQ || operator == TokenType.LT_EQ) {
-          getter = 'isEmpty';
-          fixKind = DartFixKind.REPLACE_WITH_IS_EMPTY;
-          multiFixKind = DartFixKind.REPLACE_WITH_IS_EMPTY_MULTI;
-        } else if (operator == TokenType.GT || operator == TokenType.BANG_EQ) {
-          getter = 'isNotEmpty';
-          fixKind = DartFixKind.REPLACE_WITH_IS_NOT_EMPTY;
-          multiFixKind = DartFixKind.REPLACE_WITH_IS_NOT_EMPTY_MULTI;
-        }
-      } else if (rightValue == 1) {
-        // 'length >= 1' is same as 'isNotEmpty',
-        // and 'length < 1' is same as 'isEmpty'
-        if (operator == TokenType.GT_EQ) {
-          getter = 'isNotEmpty';
-          fixKind = DartFixKind.REPLACE_WITH_IS_NOT_EMPTY;
-          multiFixKind = DartFixKind.REPLACE_WITH_IS_NOT_EMPTY_MULTI;
-        } else if (operator == TokenType.LT) {
-          getter = 'isEmpty';
-          fixKind = DartFixKind.REPLACE_WITH_IS_EMPTY;
-          multiFixKind = DartFixKind.REPLACE_WITH_IS_EMPTY_MULTI;
-        }
-      }
-    } else {
-      var leftValue = getIntValue(binary.leftOperand);
-      if (leftValue != null) {
-        lengthTarget = getLengthTarget(binary.rightOperand);
-        if (leftValue == 0) {
-          if (operator == TokenType.EQ_EQ || operator == TokenType.GT_EQ) {
-            getter = 'isEmpty';
-            fixKind = DartFixKind.REPLACE_WITH_IS_EMPTY;
-            multiFixKind = DartFixKind.REPLACE_WITH_IS_EMPTY_MULTI;
-          } else if (operator == TokenType.LT ||
-              operator == TokenType.BANG_EQ) {
-            getter = 'isNotEmpty';
-            fixKind = DartFixKind.REPLACE_WITH_IS_NOT_EMPTY;
-            multiFixKind = DartFixKind.REPLACE_WITH_IS_NOT_EMPTY_MULTI;
-          }
-        } else if (leftValue == 1) {
-          // '1 <= length' is same as 'isNotEmpty',
-          // and '1 > length' is same as 'isEmpty'
-          if (operator == TokenType.LT_EQ) {
-            getter = 'isNotEmpty';
-            fixKind = DartFixKind.REPLACE_WITH_IS_NOT_EMPTY;
-            multiFixKind = DartFixKind.REPLACE_WITH_IS_NOT_EMPTY_MULTI;
-          } else if (operator == TokenType.GT) {
-            getter = 'isEmpty';
-            fixKind = DartFixKind.REPLACE_WITH_IS_EMPTY;
-            multiFixKind = DartFixKind.REPLACE_WITH_IS_EMPTY_MULTI;
-          }
-        }
-      }
-    }
-    if (lengthTarget == null || getter == null || fixKind == null) {
+    if (binary == null) {
       return;
     }
-    var target = utils.getNodeText(lengthTarget);
+
+    var replacement = _analyzeBinaryExpression(binary);
+    if (replacement == null) {
+      return;
+    }
+
+    fixKind = replacement.fixKind;
+    multiFixKind = replacement.multiFixKind;
+
+    var target = utils.getNodeText(replacement.lengthTarget);
+    var getter = replacement.getter;
     await builder.addDartFileEdit(file, (builder) {
       builder.addSimpleReplacement(range.node(binary), '$target.$getter');
     });
@@ -121,4 +41,117 @@
 
   /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
   static ReplaceWithIsEmpty newInstance() => ReplaceWithIsEmpty();
+
+  static _Replacement? _analyzeBinaryExpression(BinaryExpression binary) {
+    var operator = binary.operator.type;
+    var rightValue = _getIntValue(binary.rightOperand);
+    if (rightValue != null) {
+      var lengthTarget = _getLengthTarget(binary.leftOperand);
+      if (lengthTarget == null) {
+        return null;
+      }
+      if (rightValue == 0) {
+        if (operator == TokenType.EQ_EQ || operator == TokenType.LT_EQ) {
+          return _Replacement.isEmpty(lengthTarget);
+        } else if (operator == TokenType.GT || operator == TokenType.BANG_EQ) {
+          return _Replacement.isNotEmpty(lengthTarget);
+        }
+      } else if (rightValue == 1) {
+        // 'length >= 1' is same as 'isNotEmpty',
+        // and 'length < 1' is same as 'isEmpty'
+        if (operator == TokenType.GT_EQ) {
+          return _Replacement.isNotEmpty(lengthTarget);
+        } else if (operator == TokenType.LT) {
+          return _Replacement.isEmpty(lengthTarget);
+        }
+      }
+    } else {
+      var leftValue = _getIntValue(binary.leftOperand);
+      if (leftValue != null) {
+        var lengthTarget = _getLengthTarget(binary.rightOperand);
+        if (lengthTarget == null) {
+          return null;
+        }
+        if (leftValue == 0) {
+          if (operator == TokenType.EQ_EQ || operator == TokenType.GT_EQ) {
+            return _Replacement.isEmpty(lengthTarget);
+          } else if (operator == TokenType.LT ||
+              operator == TokenType.BANG_EQ) {
+            return _Replacement.isNotEmpty(lengthTarget);
+          }
+        } else if (leftValue == 1) {
+          // '1 <= length' is same as 'isNotEmpty',
+          // and '1 > length' is same as 'isEmpty'
+          if (operator == TokenType.LT_EQ) {
+            return _Replacement.isNotEmpty(lengthTarget);
+          } else if (operator == TokenType.GT) {
+            return _Replacement.isEmpty(lengthTarget);
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  /// Return the value of an integer literal or prefix expression with a
+  /// minus and then an integer literal. For anything else, returns `null`.
+  static int? _getIntValue(Expression expressions) {
+    // Copied from package:linter/src/rules/prefer_is_empty.dart.
+    if (expressions is IntegerLiteral) {
+      return expressions.value;
+    } else if (expressions is PrefixExpression) {
+      var operand = expressions.operand;
+      if (expressions.operator.type == TokenType.MINUS &&
+          operand is IntegerLiteral) {
+        var value = operand.value;
+        if (value != null) {
+          return -value;
+        }
+      }
+    }
+    return null;
+  }
+
+  /// Return the expression producing the object on which `length` is being
+  /// invoked, or `null` if there is no such expression.
+  static Expression? _getLengthTarget(Expression expression) {
+    if (expression is PropertyAccess &&
+        expression.propertyName.name == 'length') {
+      return expression.target;
+    } else if (expression is PrefixedIdentifier &&
+        expression.identifier.name == 'length') {
+      return expression.prefix;
+    }
+    return null;
+  }
+}
+
+class _Replacement {
+  final FixKind fixKind;
+  final FixKind multiFixKind;
+  final String getter;
+  final Expression lengthTarget;
+
+  _Replacement.isEmpty(Expression lengthTarget)
+      : this._(
+          fixKind: DartFixKind.REPLACE_WITH_IS_EMPTY,
+          multiFixKind: DartFixKind.REPLACE_WITH_IS_EMPTY_MULTI,
+          getter: 'isEmpty',
+          lengthTarget: lengthTarget,
+        );
+
+  _Replacement.isNotEmpty(Expression lengthTarget)
+      : this._(
+          fixKind: DartFixKind.REPLACE_WITH_IS_NOT_EMPTY,
+          multiFixKind: DartFixKind.REPLACE_WITH_IS_NOT_EMPTY_MULTI,
+          getter: 'isNotEmpty',
+          lengthTarget: lengthTarget,
+        );
+
+  _Replacement._({
+    required this.fixKind,
+    required this.multiFixKind,
+    required this.getter,
+    required this.lengthTarget,
+  });
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_not_null_aware.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_not_null_aware.dart
index 4cc14c0..a46a17e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_not_null_aware.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_not_null_aware.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -14,7 +12,7 @@
 
 class ReplaceWithNotNullAware extends CorrectionProducer {
   /// The operator that will replace the existing operator.
-  String _newOperator;
+  String _newOperator = '';
 
   @override
   List<Object> get fixArguments => [_newOperator];
@@ -26,11 +24,13 @@
   Future<void> compute(ChangeBuilder builder) async {
     var node = coveredNode;
     if (node is MethodInvocation) {
-      _newOperator =
-          node.operator.type == TokenType.QUESTION_PERIOD ? '.' : '..';
-      await builder.addDartFileEdit(file, (builder) {
-        builder.addSimpleReplacement(range.token(node.operator), _newOperator);
-      });
+      var operator = node.operator;
+      if (operator != null) {
+        _newOperator = operator.type == TokenType.QUESTION_PERIOD ? '.' : '..';
+        await builder.addDartFileEdit(file, (builder) {
+          builder.addSimpleReplacement(range.token(operator), _newOperator);
+        });
+      }
     } else if (node is PropertyAccess) {
       _newOperator =
           node.operator.type == TokenType.QUESTION_PERIOD ? '.' : '..';
@@ -38,15 +38,17 @@
         builder.addSimpleReplacement(range.token(node.operator), _newOperator);
       });
     } else if (node is IndexExpression) {
-      if (node.period != null) {
+      var period = node.period;
+      var question = node.question;
+      if (period != null) {
         _newOperator = '..';
         await builder.addDartFileEdit(file, (builder) {
-          builder.addSimpleReplacement(range.token(node.period), '..');
+          builder.addSimpleReplacement(range.token(period), '..');
         });
-      } else if (node.question != null) {
+      } else if (question != null) {
         _newOperator = '[';
         await builder.addDartFileEdit(file, (builder) {
-          builder.addDeletion(range.token(node.question));
+          builder.addDeletion(range.token(question));
         });
       }
     } else if (node is SpreadElement) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_null_aware.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_null_aware.dart
index 0f36a39..c6b7dd1 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_null_aware.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_null_aware.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -19,18 +17,22 @@
   Future<void> compute(ChangeBuilder builder) async {
     var node = coveredNode;
     if (node is Expression) {
+      final node_final = node;
       await builder.addDartFileEdit(file, (builder) {
-        var parent = node.parent;
+        var parent = node_final.parent;
         while (parent != null) {
           if (parent is MethodInvocation && parent.target == node) {
-            builder.addSimpleReplacement(range.token(parent.operator), '?.');
+            var operator = parent.operator;
+            if (operator != null) {
+              builder.addSimpleReplacement(range.token(operator), '?.');
+            }
           } else if (parent is PropertyAccess && parent.target == node) {
             builder.addSimpleReplacement(range.token(parent.operator), '?.');
           } else {
             break;
           }
           node = parent;
-          parent = node.parent;
+          parent = node?.parent;
         }
       });
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_tear_off.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_tear_off.dart
index 44df3ff..14d77c2 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_tear_off.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_tear_off.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -24,16 +22,22 @@
     if (ancestor == null) {
       return;
     }
-    Future<void> addFixOfExpression(InvocationExpression expression) async {
-      await builder.addDartFileEdit(file, (builder) {
-        builder.addReplacement(range.node(ancestor), (builder) {
-          if (expression is MethodInvocation && expression.target != null) {
-            builder.write(utils.getNodeText(expression.target));
-            builder.write('.');
-          }
-          builder.write(utils.getNodeText(expression.function));
+
+    Future<void> addFixOfExpression(Expression? expression) async {
+      if (expression is InvocationExpression) {
+        await builder.addDartFileEdit(file, (builder) {
+          builder.addReplacement(range.node(ancestor), (builder) {
+            if (expression is MethodInvocation) {
+              var target = expression.target;
+              if (target != null) {
+                builder.write(utils.getNodeText(target));
+                builder.write('.');
+              }
+            }
+            builder.write(utils.getNodeText(expression.function));
+          });
         });
-      });
+      }
     }
 
     final body = ancestor.body;
@@ -47,7 +51,7 @@
         await addFixOfExpression(expression.unParenthesized);
       } else if (statement is ReturnStatement) {
         final expression = statement.expression;
-        await addFixOfExpression(expression.unParenthesized);
+        await addFixOfExpression(expression?.unParenthesized);
       }
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart
index dcdee93..1c6da82 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_var.dart
@@ -2,12 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
@@ -44,25 +43,28 @@
         return;
       }
       var initializer = variables[0].initializer;
-      String typeArgumentsText;
-      int typeArgumentsOffset;
-      if (type is NamedType && type.typeArguments != null) {
-        if (initializer is CascadeExpression) {
-          initializer = (initializer as CascadeExpression).target;
-        }
-        if (initializer is TypedLiteral) {
-          if (initializer.typeArguments == null) {
-            typeArgumentsText = utils.getNodeText(type.typeArguments);
-            if (initializer is ListLiteral) {
-              typeArgumentsOffset = initializer.leftBracket.offset;
-            } else if (initializer is SetOrMapLiteral) {
-              typeArgumentsOffset = initializer.leftBracket.offset;
-            }
+      String? typeArgumentsText;
+      int? typeArgumentsOffset;
+      if (type is NamedType) {
+        var typeArguments = type.typeArguments;
+        if (typeArguments != null) {
+          if (initializer is CascadeExpression) {
+            initializer = initializer.target;
           }
-        } else if (initializer is InstanceCreationExpression) {
-          if (initializer.constructorName.type.typeArguments == null) {
-            typeArgumentsText = utils.getNodeText(type.typeArguments);
-            typeArgumentsOffset = initializer.constructorName.type.end;
+          if (initializer is TypedLiteral) {
+            if (initializer.typeArguments == null) {
+              typeArgumentsText = utils.getNodeText(typeArguments);
+              if (initializer is ListLiteral) {
+                typeArgumentsOffset = initializer.leftBracket.offset;
+              } else if (initializer is SetOrMapLiteral) {
+                typeArgumentsOffset = initializer.leftBracket.offset;
+              }
+            }
+          } else if (initializer is InstanceCreationExpression) {
+            if (initializer.constructorName.type.typeArguments == null) {
+              typeArgumentsText = utils.getNodeText(typeArguments);
+              typeArgumentsOffset = initializer.constructorName.type.end;
+            }
           }
         }
       }
@@ -80,19 +82,22 @@
         } else {
           builder.addSimpleReplacement(range.node(type), 'var');
         }
-        if (typeArgumentsText != null) {
+        if (typeArgumentsText != null && typeArgumentsOffset != null) {
           builder.addSimpleInsertion(typeArgumentsOffset, typeArgumentsText);
         }
       });
     } else if (parent is DeclaredIdentifier &&
         grandparent is ForEachPartsWithDeclaration) {
-      String typeArgumentsText;
-      int typeArgumentsOffset;
-      if (type is NamedType && type.typeArguments != null) {
-        var iterable = grandparent.iterable;
-        if (iterable is TypedLiteral && iterable.typeArguments == null) {
-          typeArgumentsText = utils.getNodeText(type.typeArguments);
-          typeArgumentsOffset = iterable.offset;
+      String? typeArgumentsText;
+      int? typeArgumentsOffset;
+      if (type is NamedType) {
+        var typeArguments = type.typeArguments;
+        if (typeArguments != null) {
+          var iterable = grandparent.iterable;
+          if (iterable is TypedLiteral && iterable.typeArguments == null) {
+            typeArgumentsText = utils.getNodeText(typeArguments);
+            typeArgumentsOffset = iterable.offset;
+          }
         }
       }
       await builder.addDartFileEdit(file, (builder) {
@@ -101,7 +106,7 @@
         } else {
           builder.addSimpleReplacement(range.node(type), 'var');
         }
-        if (typeArgumentsText != null) {
+        if (typeArgumentsText != null && typeArgumentsOffset != null) {
           builder.addSimpleInsertion(typeArgumentsOffset, typeArgumentsText);
         }
       });
@@ -110,7 +115,7 @@
 
   /// Return `true` if the type in the [node] can be replaced with `var`.
   bool _canConvertVariableDeclarationList(VariableDeclarationList node) {
-    final staticType = node?.type?.type;
+    final staticType = node.type?.type;
     if (staticType == null || staticType.isDynamic) {
       return false;
     }
@@ -137,10 +142,10 @@
         if (staticType == null || staticType.isDynamic) {
           return false;
         }
-        final iterableType = parent.iterable.staticType;
+        final iterableType = parent.iterable.typeOrThrow;
         var instantiatedType =
             iterableType.asInstanceOf(typeProvider.iterableElement);
-        if (instantiatedType?.typeArguments?.first == staticType) {
+        if (instantiatedType?.typeArguments.first == staticType) {
           return true;
         }
         return false;
@@ -152,7 +157,7 @@
 
   /// Using the [node] as a starting point, return the type annotation that is
   /// to be replaced, or `null` if there is no type annotation.
-  TypeAnnotation _findType(AstNode node) {
+  TypeAnnotation? _findType(AstNode node) {
     if (node is VariableDeclarationList) {
       return node.type;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart
index 8f4de40..c46f159 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/shadow_field.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -20,34 +18,45 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
+    final node = this.node;
     if (node is! SimpleIdentifier) {
       return;
     }
-    var element = (node as SimpleIdentifier).writeOrReadElement;
-    if (element is! PropertyAccessorElement) {
+
+    var accessor = node.writeOrReadElement;
+    if (accessor is! PropertyAccessorElement) {
       return;
     }
-    var accessor = element as PropertyAccessorElement;
+
     if (!accessor.isGetter || accessor.enclosingElement is! ClassElement) {
       // TODO(brianwilkerson) Should we also require that the getter be synthetic?
       return;
     }
+
     var statement = _getStatement();
     if (statement == null) {
       return;
     }
-    if (statement.parent is! Block) {
+
+    var enclosingBlock = statement.parent;
+    if (enclosingBlock is! Block) {
       // TODO(brianwilkerson) Support adding a block between the statement and
       //  its parent (where the parent will be something like a while or if
       //  statement). Also support the case where the parent is a case clause.
       return;
     }
-    var enclosingBlock = statement.parent as Block;
-    var finder = _ReferenceFinder(accessor.correspondingSetter);
+
+    var correspondingSetter = accessor.correspondingSetter;
+    if (correspondingSetter == null) {
+      return;
+    }
+
+    var finder = _ReferenceFinder(correspondingSetter);
     enclosingBlock.accept(finder);
     if (finder.hasSetterReference) {
       return;
     }
+
     var fieldName = accessor.name;
     var offset = statement.offset;
     var prefix = utils.getLinePrefix(offset);
@@ -74,13 +83,13 @@
 
   /// Return the statement immediately enclosing the [node] that would promote
   /// the type of the field if it were replaced by a local variable.
-  Statement _getStatement() {
+  Statement? _getStatement() {
     var parent = node.parent;
 
-    Statement enclosingIf(Expression expression) {
+    Statement? enclosingIf(Expression expression) {
       var parent = expression.parent;
       while (parent is BinaryExpression) {
-        var opType = (parent as BinaryExpression).operator.type;
+        var opType = parent.operator.type;
         if (opType != TokenType.AMPERSAND_AMPERSAND) {
           break;
         }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.dart b/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.dart
index 6f0d392..e2cc444 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
@@ -32,13 +30,12 @@
       return;
     }
 
-    var parent = childProp.parent?.parent;
-    if (parent is! InstanceCreationExpression ||
-        !flutter.isWidgetCreation(parent)) {
+    var creationExpression = childProp.parent?.parent;
+    if (creationExpression is! InstanceCreationExpression ||
+        !flutter.isWidgetCreation(creationExpression)) {
       return;
     }
 
-    InstanceCreationExpression creationExpression = parent;
     var args = creationExpression.argumentList;
 
     var last = args.arguments.last;
@@ -48,10 +45,10 @@
     }
 
     await builder.addDartFileEdit(file, (fileEditBuilder) {
-      var hasTrailingComma = last.endToken.next.type == TokenType.COMMA;
+      var hasTrailingComma = last.endToken.next!.type == TokenType.COMMA;
 
-      var childStart = childProp.beginToken.previous.end;
-      var childEnd = childProp.endToken.next.end;
+      var childStart = childProp.beginToken.previous!.end;
+      var childEnd = childProp.endToken.next!.end;
       var childRange = range.startOffsetEndOffset(childStart, childEnd);
 
       var deletionRange = childRange;
@@ -69,7 +66,7 @@
 
       var insertionPoint = last.end;
       if (hasTrailingComma) {
-        insertionPoint = last.endToken.next.end;
+        insertionPoint = last.endToken.next!.end;
       } else if (childStart == childProp.offset) {
         childText = ', $childText';
       } else {
@@ -85,7 +82,7 @@
 
   /// Using the [node] as the starting point, find the named expression that is
   /// for either the `child` or `children` parameter.
-  NamedExpression _findNamedExpression(AstNode node) {
+  NamedExpression? _findNamedExpression(AstNode node) {
     if (node is NamedExpression) {
       var name = node.name.label.name;
       if (name == 'child' || name == 'children') {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/split_and_condition.dart b/pkg/analysis_server/lib/src/services/correction/dart/split_and_condition.dart
index f358b4e8..028d245 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/split_and_condition.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/split_and_condition.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
@@ -20,10 +18,10 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     // check that user invokes quick assist on binary expression
-    if (node is! BinaryExpression) {
+    var binaryExpression = node;
+    if (binaryExpression is! BinaryExpression) {
       return;
     }
-    var binaryExpression = node as BinaryExpression;
     // prepare operator position
     if (!isOperatorSelected(binaryExpression)) {
       return;
@@ -33,11 +31,10 @@
       return;
     }
     // prepare "if"
-    var statement = node.thisOrAncestorOfType<Statement>();
-    if (statement is! IfStatement) {
+    var ifStatement = node.thisOrAncestorOfType<Statement>();
+    if (ifStatement is! IfStatement) {
       return;
     }
-    var ifStatement = statement as IfStatement;
     // no support "else"
     if (ifStatement.elseStatement != null) {
       return;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/split_variable_declaration.dart b/pkg/analysis_server/lib/src/services/correction/dart/split_variable_declaration.dart
index c5b109e..83073d8 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/split_variable_declaration.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/split_variable_declaration.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/token.dart';
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
@@ -18,16 +16,20 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    var variableList = node?.thisOrAncestorOfType<VariableDeclarationList>();
-
-    // Must be a local variable declaration.
-    if (variableList?.parent is! VariableDeclarationStatement) {
+    var variableList = node.thisOrAncestorOfType<VariableDeclarationList>();
+    if (variableList == null) {
       return;
     }
-    VariableDeclarationStatement statement = variableList.parent;
+
+    // Must be a local variable declaration.
+    var statement = variableList.parent;
+    if (statement is! VariableDeclarationStatement) {
+      return;
+    }
 
     // Cannot be `const` or `final`.
-    var keywordKind = variableList.keyword?.keyword;
+    var keyword = variableList.keyword;
+    var keywordKind = keyword?.keyword;
     if (keywordKind == Keyword.CONST || keywordKind == Keyword.FINAL) {
       return;
     }
@@ -50,9 +52,9 @@
 
     await builder.addDartFileEdit(file, (builder) {
       if (variableList.type == null) {
-        final type = variable.declaredElement.type;
-        if (!type.isDynamic) {
-          builder.addReplacement(range.token(variableList.keyword), (builder) {
+        final type = variable.declaredElement!.type;
+        if (!type.isDynamic && keyword != null) {
+          builder.addReplacement(range.token(keyword), (builder) {
             builder.writeType(type);
           });
         }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart b/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart
index e2868bb..84d8648 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/surround_with.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/statement_analyzer.dart';
@@ -249,7 +247,8 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    var classDeclaration = node.parent.thisOrAncestorOfType<ClassDeclaration>();
+    var classDeclaration =
+        node.parent?.thisOrAncestorOfType<ClassDeclaration>();
     if (classDeclaration != null &&
         flutter.isState(classDeclaration.declaredElement)) {
       await builder.addDartFileEdit(file, (builder) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/update_sdk_constraints.dart b/pkg/analysis_server/lib/src/services/correction/dart/update_sdk_constraints.dart
index dddf351..4cab9d2 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/update_sdk_constraints.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/update_sdk_constraints.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/file_system/file_system.dart';
@@ -25,32 +23,25 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    var context = resourceProvider.pathContext;
-    File pubspecFile;
-    var folder = resourceProvider.getFolder(context.dirname(file));
-    while (folder != null) {
-      pubspecFile = folder.getChildAssumingFile('pubspec.yaml');
-      if (pubspecFile.exists) {
-        break;
-      }
-      pubspecFile = null;
-      folder = folder.parent2;
-    }
+    var pubspecFile = _findPubspecFile();
     if (pubspecFile == null) {
       return;
     }
+
     var extractor = SdkConstraintExtractor(pubspecFile);
     var text = extractor.constraintText();
     var offset = extractor.constraintOffset();
     if (text == null || offset < 0) {
       return;
     }
+
     var length = text.length;
-    String newText;
     var spaceOffset = text.indexOf(' ');
     if (spaceOffset >= 0) {
       length = spaceOffset;
     }
+
+    String? newText;
     if (text == 'any') {
       newText = '^$_minimumVersion';
     } else if (text.startsWith('^')) {
@@ -63,11 +54,23 @@
     if (newText == null) {
       return;
     }
+
+    final newText_final = newText;
     await builder.addGenericFileEdit(pubspecFile.path, (builder) {
-      builder.addSimpleReplacement(SourceRange(offset, length), newText);
+      builder.addSimpleReplacement(SourceRange(offset, length), newText_final);
     });
   }
 
+  File? _findPubspecFile() {
+    var file = resourceProvider.getFile(this.file);
+    for (var folder in file.parent2.withAncestors) {
+      var pubspecFile = folder.getChildAssumingFile('pubspec.yaml');
+      if (pubspecFile.exists) {
+        return pubspecFile;
+      }
+    }
+  }
+
   /// Return an instance of this class that will update the SDK constraints to
   /// '2.1.0'. Used as a tear-off in `FixProcessor`.
   static UpdateSdkConstraints version_2_1_0() => UpdateSdkConstraints('2.1.0');
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/use_const.dart b/pkg/analysis_server/lib/src/services/correction/dart/use_const.dart
index 1c9d823..110432e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/use_const.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/use_const.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -20,12 +18,12 @@
     if (coveredNode is InstanceCreationExpression) {
       var instanceCreation = coveredNode as InstanceCreationExpression;
       await builder.addDartFileEdit(file, (builder) {
-        if (instanceCreation.keyword == null) {
+        var keyword = instanceCreation.keyword;
+        if (keyword == null) {
           builder.addSimpleInsertion(
               instanceCreation.constructorName.offset, 'const');
         } else {
-          builder.addSimpleReplacement(
-              range.token(instanceCreation.keyword), 'const');
+          builder.addSimpleReplacement(range.token(keyword), 'const');
         }
       });
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/use_curly_braces.dart b/pkg/analysis_server/lib/src/services/correction/dart/use_curly_braces.dart
index f76e561..b414e48 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/use_curly_braces.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/use_curly_braces.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
@@ -37,9 +35,12 @@
     } else if (parent is ForStatement) {
       return _forStatement(builder, parent);
     } else if (statement is IfStatement) {
-      if (statement.elseKeyword != null &&
-          range.token(statement.elseKeyword).contains(selectionOffset)) {
-        return _ifStatement(builder, statement, statement.elseStatement);
+      var elseKeyword = statement.elseKeyword;
+      var elseStatement = statement.elseStatement;
+      if (elseKeyword != null &&
+          elseStatement != null &&
+          range.token(elseKeyword).contains(selectionOffset)) {
+        return _ifStatement(builder, statement, elseStatement);
       } else {
         return _ifStatement(builder, statement, null);
       }
@@ -88,21 +89,22 @@
   }
 
   Future<void> _ifStatement(
-      ChangeBuilder builder, IfStatement node, Statement thenOrElse) async {
+      ChangeBuilder builder, IfStatement node, Statement? thenOrElse) async {
     var prefix = utils.getLinePrefix(node.offset);
     var indent = prefix + utils.getIndent(1);
 
     await builder.addDartFileEdit(file, (builder) {
       var thenStatement = node.thenStatement;
+      var elseKeyword = node.elseKeyword;
       if (thenStatement is! Block &&
           (thenOrElse == null || thenOrElse == thenStatement)) {
         builder.addSimpleReplacement(
           range.endStart(node.rightParenthesis, thenStatement),
           ' {$eol$indent',
         );
-        if (node.elseKeyword != null) {
+        if (elseKeyword != null) {
           builder.addSimpleReplacement(
-            range.endStart(thenStatement, node.elseKeyword),
+            range.endStart(thenStatement, elseKeyword),
             '$eol$prefix} ',
           );
         } else {
@@ -111,11 +113,12 @@
       }
 
       var elseStatement = node.elseStatement;
-      if (elseStatement != null &&
+      if (elseKeyword != null &&
+          elseStatement != null &&
           elseStatement is! Block &&
           (thenOrElse == null || thenOrElse == elseStatement)) {
         builder.addSimpleReplacement(
-          range.endStart(node.elseKeyword, elseStatement),
+          range.endStart(elseKeyword, elseStatement),
           ' {$eol$indent',
         );
         builder.addSimpleInsertion(elseStatement.end, '$eol$prefix}');
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/use_effective_integer_division.dart b/pkg/analysis_server/lib/src/services/correction/dart/use_effective_integer_division.dart
index babab16..5a0839d 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/use_effective_integer_division.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/use_effective_integer_division.dart
@@ -2,10 +2,9 @@
 // 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/utilities/extensions/ast.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
@@ -17,21 +16,24 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    for (var n = node; n != null; n = n.parent) {
-      if (n is MethodInvocation &&
-          n.offset == errorOffset &&
-          n.length == errorLength) {
-        var target = (n as MethodInvocation).target.unParenthesized;
-        await builder.addDartFileEdit(file, (builder) {
-          // replace "/" with "~/"
-          var binary = target as BinaryExpression;
-          builder.addSimpleReplacement(range.token(binary.operator), '~/');
-          // remove everything before and after
-          builder.addDeletion(range.startStart(n, binary.leftOperand));
-          builder.addDeletion(range.endEnd(binary.rightOperand, n));
-        });
-        // done
-        break;
+    for (var n in node.withParents) {
+      if (n is MethodInvocation) {
+        if (n.offset == errorOffset && n.length == errorLength) {
+          var target = n.target;
+          if (target != null) {
+            target = target.unParenthesized;
+            await builder.addDartFileEdit(file, (builder) {
+              // replace "/" with "~/"
+              var binary = target as BinaryExpression;
+              builder.addSimpleReplacement(range.token(binary.operator), '~/');
+              // remove everything before and after
+              builder.addDeletion(range.startStart(n, binary.leftOperand));
+              builder.addDeletion(range.endEnd(binary.rightOperand, n));
+            });
+          }
+          // done
+          break;
+        }
       }
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/use_eq_eq_null.dart b/pkg/analysis_server/lib/src/services/correction/dart/use_eq_eq_null.dart
index ce4e1f4..86ad614 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/use_eq_eq_null.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/use_eq_eq_null.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/use_is_not_empty.dart b/pkg/analysis_server/lib/src/services/correction/dart/use_is_not_empty.dart
index ca10cbf..8b06bc9 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/use_is_not_empty.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/use_is_not_empty.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -21,10 +19,10 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    if (node is! PrefixExpression) {
+    var prefixExpression = node;
+    if (prefixExpression is! PrefixExpression) {
       return;
     }
-    PrefixExpression prefixExpression = node;
     var negation = prefixExpression.operator;
     if (negation.type != TokenType.BANG) {
       return;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/use_not_eq_null.dart b/pkg/analysis_server/lib/src/services/correction/dart/use_not_eq_null.dart
index 120e87d..e53bc02 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/use_not_eq_null.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/use_not_eq_null.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/use_rethrow.dart b/pkg/analysis_server/lib/src/services/correction/dart/use_rethrow.dart
index dc55220..9ebe4dc 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/use_rethrow.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/use_rethrow.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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -20,6 +18,7 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
+    final coveredNode = this.coveredNode;
     if (coveredNode is ThrowExpression) {
       await builder.addDartFileEdit(file, (builder) {
         builder.addSimpleReplacement(range.node(coveredNode), 'rethrow');
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart b/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart
index bfd97f5..49fb849 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart
@@ -2,20 +2,16 @@
 // 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:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 class WrapInText extends CorrectionProducer {
-  ParameterElement _parameterElement;
-  Expression _stringExpression;
-
   @override
   FixKind get fixKind => DartFixKind.WRAP_IN_TEXT;
 
@@ -24,43 +20,55 @@
     //
     // Extract the information needed to build the edit.
     //
-    _extractContextInformation(node);
-    if (_parameterElement == null || _stringExpression == null) {
+    var context = _extractContextInformation(node);
+    if (context == null) {
       return;
     }
-    if (!flutter.isWidgetType(_parameterElement.type)) {
+    if (!flutter.isWidgetType(context.parameterElement.type)) {
       return;
     }
 
     //
     // Extract the information needed to build the edit.
     //
-    var stringExpressionCode = utils.getNodeText(_stringExpression);
+    var stringExpressionCode = utils.getNodeText(context.stringExpression);
 
     //
     // Build the edit.
     //
     await builder.addDartFileEdit(file, (builder) {
       builder.addSimpleReplacement(
-        range.node(_stringExpression),
+        range.node(context.stringExpression),
         'Text($stringExpressionCode)',
       );
     });
   }
 
-  /// Set the `String` typed named expression to [_stringExpression], and the
-  /// corresponding parameter to [_parameterElement]. Leave the fields `null`
-  /// if not a named argument, or not a `String` typed expression.
-  void _extractContextInformation(AstNode node) {
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static WrapInText newInstance() => WrapInText();
+
+  static _Context? _extractContextInformation(AstNode node) {
     if (node is NamedExpression) {
       var expression = node.expression;
-      if (expression.staticType.isDartCoreString) {
-        _parameterElement = node.name.label.staticElement;
-        _stringExpression = expression;
+      if (expression.typeOrThrow.isDartCoreString) {
+        var parameterElement = node.name.label.staticElement;
+        if (parameterElement is ParameterElement) {
+          return _Context(
+            stringExpression: expression,
+            parameterElement: parameterElement,
+          );
+        }
       }
     }
   }
+}
 
-  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
-  static WrapInText newInstance() => WrapInText();
+class _Context {
+  final Expression stringExpression;
+  final ParameterElement parameterElement;
+
+  _Context({
+    required this.stringExpression,
+    required this.parameterElement,
+  });
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
index 31034bf..5b5d7cf 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_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 'dart:math' as math;
 
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
@@ -38,8 +36,6 @@
 
   final List<Fix> fixes = <Fix>[];
 
-  List<YamlNode> coveringNodePath;
-
   AnalysisOptionsFixGenerator(this.error, this.content, this.options)
       : errorOffset = error.offset,
         errorLength = error.length,
@@ -53,7 +49,7 @@
   Future<List<Fix>> computeFixes() async {
     var locator =
         YamlNodeLocator(start: errorOffset, end: errorOffset + errorLength - 1);
-    coveringNodePath = locator.searchWithin(options);
+    var coveringNodePath = locator.searchWithin(options);
     if (coveringNodePath.isEmpty) {
       return fixes;
     }
@@ -70,10 +66,10 @@
 //    } else
 
     if (errorCode == DEPRECATED_LINT_HINT) {
-      await _addFix_removeLint();
+      await _addFix_removeLint(coveringNodePath);
     } else if (errorCode ==
         AnalysisOptionsHintCode.SUPER_MIXINS_SETTING_DEPRECATED) {
-      await _addFix_removeSetting();
+      await _addFix_removeSetting(coveringNodePath);
 //    } else if (errorCode ==
 //        AnalysisOptionsWarningCode.ANALYSIS_OPTION_DEPRECATED) {
 //    } else if (errorCode == AnalysisOptionsWarningCode.INCLUDED_FILE_WARNING) {
@@ -85,7 +81,7 @@
 //        AnalysisOptionsWarningCode.UNRECOGNIZED_ERROR_CODE) {
     } else if (errorCode ==
         AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITHOUT_VALUES) {
-      await _addFix_removeSetting();
+      await _addFix_removeSetting(coveringNodePath);
 //    } else if (errorCode ==
 //        AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITH_LEGAL_VALUE) {
 //    } else if (errorCode ==
@@ -95,16 +91,16 @@
     return fixes;
   }
 
-  Future<void> _addFix_removeLint() async {
-    var builder = await _createScalarDeletionBuilder();
+  Future<void> _addFix_removeLint(List<YamlNode> coveringNodePath) async {
+    var builder = await _createScalarDeletionBuilder(coveringNodePath);
     if (builder != null) {
       _addFixFromBuilder(builder, AnalysisOptionsFixKind.REMOVE_LINT,
           args: [coveringNodePath[0].toString()]);
     }
   }
 
-  Future<void> _addFix_removeSetting() async {
-    var builder = await _createScalarDeletionBuilder();
+  Future<void> _addFix_removeSetting(List<YamlNode> coveringNodePath) async {
+    var builder = await _createScalarDeletionBuilder(coveringNodePath);
     if (builder != null) {
       _addFixFromBuilder(builder, AnalysisOptionsFixKind.REMOVE_SETTING,
           args: [coveringNodePath[0].toString()]);
@@ -114,7 +110,7 @@
   /// Add a fix whose edits were built by the [builder] that has the given
   /// [kind]. If [args] are provided, they will be used to fill in the message
   /// for the fix.
-  void _addFixFromBuilder(ChangeBuilder builder, FixKind kind, {List args}) {
+  void _addFixFromBuilder(ChangeBuilder builder, FixKind kind, {List? args}) {
     var change = builder.sourceChange;
     if (change.edits.isEmpty) {
       return;
@@ -123,12 +119,14 @@
     fixes.add(Fix(kind, change));
   }
 
-  Future<ChangeBuilder> _createScalarDeletionBuilder() async {
+  Future<ChangeBuilder?> _createScalarDeletionBuilder(
+    List<YamlNode> coveringNodePath,
+  ) async {
     if (coveringNodePath[0] is! YamlScalar) {
       return null;
     }
 
-    SourceRange deletionRange;
+    SourceRange? deletionRange;
     var index = 1;
     while (index < coveringNodePath.length) {
       var parent = coveringNodePath[index];
@@ -142,8 +140,8 @@
       } else if (parent is YamlMap) {
         var nodes = parent.nodes;
         if (nodes.length > 1) {
-          YamlNode key;
-          YamlNode value;
+          YamlNode? key;
+          YamlNode? value;
           var child = coveringNodePath[index - 1];
           if (nodes.containsKey(child)) {
             key = child;
@@ -176,8 +174,10 @@
     var builder = ChangeBuilder(
       workspace: _NonDartChangeWorkspace(),
     );
+
+    final deletionRange_final = deletionRange;
     await builder.addGenericFileEdit(file, (builder) {
-      builder.addDeletion(deletionRange);
+      builder.addDeletion(deletionRange_final);
     });
     return builder;
   }
@@ -190,9 +190,9 @@
   }
 
   SourceRange _lines(int start, int end) {
-    CharacterLocation startLocation = lineInfo.getLocation(start);
+    var startLocation = lineInfo.getLocation(start);
     var startOffset = lineInfo.getOffsetOfLine(startLocation.lineNumber - 1);
-    CharacterLocation endLocation = lineInfo.getLocation(end);
+    var endLocation = lineInfo.getLocation(end);
     var endOffset = lineInfo.getOffsetOfLine(
         math.min(endLocation.lineNumber, lineInfo.lineCount - 1));
     return SourceRange(startOffset, endOffset - startOffset);
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
index c75c1dc..86dcc3b 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
@@ -2,14 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:analysis_server/src/services/correction/dart/data_driven.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/code_template.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
-import 'package:meta/meta.dart';
 
 /// The data related to a type parameter that was added to either a function or
 /// a type.
@@ -22,7 +19,7 @@
 
   /// The name of the type that the type parameter extends, or `null` if the
   /// type parameter doesn't have a bound.
-  final CodeTemplate extendedType;
+  final CodeTemplate? extendedType;
 
   /// The code template used to compute the value of the type argument.
   final CodeTemplate argumentValue;
@@ -30,13 +27,11 @@
   /// Initialize a newly created change to describe adding a type parameter to a
   /// type or a function.
   AddTypeParameter(
-      {@required this.index,
-      @required this.name,
-      @required this.argumentValue,
-      @required this.extendedType})
-      : assert(index >= 0),
-        assert(name != null),
-        assert(argumentValue != null);
+      {required this.index,
+      required this.name,
+      required this.argumentValue,
+      required this.extendedType})
+      : assert(index >= 0);
 
   @override
   void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
@@ -50,7 +45,7 @@
   }
 
   @override
-  _Data validate(DataDrivenFix fix) {
+  _Data? validate(DataDrivenFix fix) {
     var node = fix.node;
     var context = TemplateContext.forInvocation(node, fix.utils);
     if (node is NamedType) {
@@ -68,8 +63,7 @@
     var parent = node.parent;
     if (parent is InvocationExpression) {
       // wrong_number_of_type_arguments_method
-      var argument = argumentValue.validate(context);
-      if (argument == null) {
+      if (!argumentValue.validate(context)) {
         return null;
       }
       var typeArguments = parent.typeArguments;
@@ -79,6 +73,7 @@
       return _TypeArgumentData(typeArguments, parent.argumentList.offset);
     } else if (parent is MethodDeclaration) {
       // invalid_override
+      var extendedType = this.extendedType;
       if (extendedType != null && !extendedType.validate(context)) {
         return null;
       }
@@ -89,11 +84,10 @@
       return _TypeParameterData(typeParameters, parent.name.end);
     } else if (node is TypeArgumentList && parent is ExtensionOverride) {
       // wrong_number_of_type_arguments_extension
-      var argument = argumentValue.validate(context);
-      if (argument == null) {
+      if (!argumentValue.validate(context)) {
         return null;
       }
-      if (_isInvalidIndex(node?.arguments)) {
+      if (_isInvalidIndex(node.arguments)) {
         return null;
       }
       return _TypeArgumentData(node, parent.extensionName.end);
@@ -136,6 +130,7 @@
 
     void writeParameter(DartEditBuilder builder) {
       builder.write(name);
+      var extendedType = this.extendedType;
       if (extendedType != null) {
         builder.write(' extends ');
         extendedType.writeOn(builder, context);
@@ -168,7 +163,7 @@
     }
   }
 
-  bool _isInvalidIndex(List<AstNode> list) {
+  bool _isInvalidIndex(List<AstNode>? list) {
     var length = list == null ? 0 : list.length;
     return index > length;
   }
@@ -181,7 +176,7 @@
 class _TypeArgumentData extends _Data {
   /// The list of type arguments to which a new type argument is being added, or
   /// `null` if the first type argument is being added.
-  final TypeArgumentList typeArguments;
+  final TypeArgumentList? typeArguments;
 
   /// The offset at which the type argument list should be inserted if
   /// [typeArguments] is `null`.
@@ -195,7 +190,7 @@
 class _TypeParameterData extends _Data {
   /// The list of type parameters to which a new type parameter is being added,
   /// or `null` if the first type parameter is being added.
-  final TypeParameterList typeParameters;
+  final TypeParameterList? typeParameters;
 
   /// The offset at which the type parameter list should be inserted if
   /// [typeParameters] is `null`.
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/change.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/change.dart
index 2966d55..f0d50bc 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/change.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/change.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:analysis_server/src/services/correction/dart/data_driven.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 
@@ -16,5 +14,5 @@
 
   /// Validate that this change can be applied. Return the data to be passed to
   /// [apply] if the change can be applied, or `null` if it can't be applied.
-  D validate(DataDrivenFix fix);
+  D? validate(DataDrivenFix fix);
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/changes_selector.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/changes_selector.dart
index e8e7a33..cd8b2f5 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/changes_selector.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/changes_selector.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:analysis_server/src/services/correction/fix/data_driven/change.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/code_template.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/expression.dart';
@@ -12,7 +10,7 @@
 /// possible lists.
 abstract class ChangesSelector {
   /// Return the list of changes that should be applied based on the [context].
-  List<Change> getChanges(TemplateContext context);
+  List<Change>? getChanges(TemplateContext context);
 }
 
 /// A changes selector that uses boolean-valued conditions to select the list.
@@ -26,7 +24,7 @@
   ConditionalChangesSelector(this.changeMap);
 
   @override
-  List<Change> getChanges(TemplateContext context) {
+  List<Change>? getChanges(TemplateContext context) {
     for (var entry in changeMap.entries) {
       var value = entry.key.evaluateIn(context);
       if (value is bool && value) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_fragment_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_fragment_parser.dart
index bebdc17..3b561ca 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_fragment_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_fragment_parser.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:analysis_server/src/services/correction/fix/data_driven/accessor.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/expression.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
@@ -21,21 +19,21 @@
 
   /// The amount to be added to translate from offsets within the content to
   /// offsets within the file.
-  int delta;
+  int delta = 0;
 
   /// The tokens being parsed.
-  /* late */ List<_Token> tokens;
+  late List<_Token> tokens;
 
   /// The index in the [tokens] of the next token to be consumed.
   int currentIndex = 0;
 
   /// Initialize a newly created parser to report errors to the [errorReporter].
-  CodeFragmentParser(this.errorReporter, {VariableScope scope})
+  CodeFragmentParser(this.errorReporter, {VariableScope? scope})
       : variableScope = scope ?? VariableScope(null, {});
 
   /// Return the current token, or `null` if the end of the tokens has been
   /// reached.
-  _Token get currentToken =>
+  _Token? get currentToken =>
       currentIndex < tokens.length ? tokens[currentIndex] : null;
 
   /// Advance to the next token.
@@ -50,13 +48,15 @@
   ///
   /// <content> ::=
   ///   <accessor> ('.' <accessor>)*
-  List<Accessor> parseAccessors(String content, int delta) {
+  List<Accessor>? parseAccessors(String content, int delta) {
     this.delta = delta;
-    tokens = _CodeFragmentScanner(content, delta, errorReporter).scan();
-    if (tokens == null) {
+    var scannedTokens =
+        _CodeFragmentScanner(content, delta, errorReporter).scan();
+    if (scannedTokens == null) {
       // The error has already been reported.
       return null;
     }
+    tokens = scannedTokens;
     currentIndex = 0;
     var accessors = <Accessor>[];
     var accessor = _parseAccessor();
@@ -66,6 +66,9 @@
     accessors.add(accessor);
     while (currentIndex < tokens.length) {
       var token = currentToken;
+      if (token == null) {
+        return accessors;
+      }
       if (token.kind == _TokenKind.period) {
         advance();
         accessor = _parseAccessor();
@@ -87,13 +90,15 @@
   ///
   /// <content> ::=
   ///   <logicalExpression>
-  Expression parseCondition(String content, int delta) {
+  Expression? parseCondition(String content, int delta) {
     this.delta = delta;
-    tokens = _CodeFragmentScanner(content, delta, errorReporter).scan();
-    if (tokens == null) {
+    var scannedTokens =
+        _CodeFragmentScanner(content, delta, errorReporter).scan();
+    if (scannedTokens == null) {
       // The error has already been reported.
       return null;
     }
+    tokens = scannedTokens;
     currentIndex = 0;
     var expression = _parseLogicalAndExpression();
     if (currentIndex < tokens.length) {
@@ -107,7 +112,7 @@
 
   /// Return the current token if it exists and has one of the [validKinds].
   /// Report an error and return `null` if those conditions aren't met.
-  _Token _expect(List<_TokenKind> validKinds) {
+  _Token? _expect(List<_TokenKind> validKinds) {
     String validKindsDisplayString() {
       var buffer = StringBuffer();
       for (var i = 0; i < validKinds.length; i++) {
@@ -151,7 +156,7 @@
   ///
   /// <accessor> ::=
   ///   <identifier> '[' (<integer> | <identifier>) ']'
-  Accessor _parseAccessor() {
+  Accessor? _parseAccessor() {
     var token = _expect(const [_TokenKind.identifier]);
     if (token == null) {
       // The error has already been reported.
@@ -221,7 +226,7 @@
   ///   <primaryExpression> (<comparisonOperator> <primaryExpression>)?
   /// <comparisonOperator> ::=
   ///   '==' | '!='
-  Expression _parseEqualityExpression() {
+  Expression? _parseEqualityExpression() {
     var expression = _parsePrimaryExpression();
     if (expression == null) {
       return null;
@@ -229,7 +234,7 @@
     if (currentIndex >= tokens.length) {
       return expression;
     }
-    var kind = currentToken.kind;
+    var kind = currentToken?.kind;
     if (kind == _TokenKind.equal || kind == _TokenKind.notEqual) {
       advance();
       var operator =
@@ -247,15 +252,16 @@
   ///
   /// <logicalExpression> ::=
   ///   <equalityExpression> ('&&' <equalityExpression>)*
-  Expression _parseLogicalAndExpression() {
-    var expression = _parseEqualityExpression();
-    if (expression == null) {
+  Expression? _parseLogicalAndExpression() {
+    var leftOperand = _parseEqualityExpression();
+    if (leftOperand == null) {
       return null;
     }
     if (currentIndex >= tokens.length) {
-      return expression;
+      return leftOperand;
     }
-    var kind = currentToken.kind;
+    var expression = leftOperand;
+    var kind = currentToken?.kind;
     while (kind == _TokenKind.and) {
       advance();
       var rightOperand = _parseEqualityExpression();
@@ -266,7 +272,7 @@
       if (currentIndex >= tokens.length) {
         return expression;
       }
-      kind = currentToken.kind;
+      kind = currentToken?.kind;
     }
     return expression;
   }
@@ -275,27 +281,29 @@
   ///
   /// <primaryExpression> ::=
   ///   <identifier> | <string>
-  Expression _parsePrimaryExpression() {
+  Expression? _parsePrimaryExpression() {
     var token = currentToken;
-    var kind = token?.kind;
-    if (kind == _TokenKind.identifier) {
-      advance();
-      var variableName = token.lexeme;
-      var generator = variableScope.lookup(variableName);
-      if (generator == null) {
-        errorReporter.reportErrorForOffset(
-            TransformSetErrorCode.undefinedVariable,
-            token.offset + delta,
-            token.length,
-            [variableName]);
-        return null;
+    if (token != null) {
+      var kind = token.kind;
+      if (kind == _TokenKind.identifier) {
+        advance();
+        var variableName = token.lexeme;
+        var generator = variableScope.lookup(variableName);
+        if (generator == null) {
+          errorReporter.reportErrorForOffset(
+              TransformSetErrorCode.undefinedVariable,
+              token.offset + delta,
+              token.length,
+              [variableName]);
+          return null;
+        }
+        return VariableReference(generator);
+      } else if (kind == _TokenKind.string) {
+        advance();
+        var lexeme = token.lexeme;
+        var value = lexeme.substring(1, lexeme.length - 1);
+        return LiteralString(value);
       }
-      return VariableReference(generator);
-    } else if (kind == _TokenKind.string) {
-      advance();
-      var lexeme = token.lexeme;
-      var value = lexeme.substring(1, lexeme.length - 1);
-      return LiteralString(value);
     }
     int offset;
     int length;
@@ -356,7 +364,7 @@
 
   /// Return the tokens in the content, or `null` if there is an error in the
   /// content that prevents it from being scanned.
-  List<_Token> scan() {
+  List<_Token>? scan() {
     var length = content.length;
 
     int peekAt(int offset) {
@@ -515,6 +523,5 @@
       case _TokenKind.string:
         return 'a string';
     }
-    return '';
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart
index 3a89d93..ce509a1 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.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:analysis_server/src/services/correction/fix/data_driven/expression.dart'
     as data_driven;
 import 'package:analysis_server/src/services/correction/fix/data_driven/value_generator.dart';
@@ -21,13 +19,11 @@
 
   /// The expression used to determine whether the template is required to be
   /// used, or `null` if the template is not required to be used.
-  final data_driven.Expression requiredIfCondition;
+  final data_driven.Expression? requiredIfCondition;
 
   /// Initialize a newly generated code template with the given [kind] and
   /// [components].
-  CodeTemplate(this.kind, this.components, this.requiredIfCondition)
-      : assert(kind != null),
-        assert(components != null);
+  CodeTemplate(this.kind, this.components, this.requiredIfCondition);
 
   /// Use the [context] to validate that this template will be able to generate
   /// a value.
@@ -69,7 +65,7 @@
 /// The context in which a template is being evaluated.
 class TemplateContext {
   /// The node in the AST that is being transformed.
-  final AstNode node;
+  final AstNode? node;
 
   /// The utilities used to help extract the code associated with various nodes.
   final CorrectionUtils utils;
@@ -85,11 +81,11 @@
   /// Return the invocation containing the given [node]. The invocation will be
   /// either an instance creation expression, function invocation, method
   /// invocation, or an extension override.
-  static AstNode _getInvocation(AstNode node) {
+  static AstNode? _getInvocation(AstNode node) {
     if (node is ArgumentList) {
       return node.parent;
     } else if (node.parent is ArgumentList) {
-      return node.parent.parent;
+      return node.parent?.parent;
     } else if (node is InstanceCreationExpression ||
         node is InvocationExpression) {
       return node;
@@ -101,13 +97,13 @@
           return grandparent;
         }
       } else if (parent is Label && parent.parent is NamedExpression) {
-        return parent.parent.parent.parent;
+        return parent.parent?.parent?.parent;
       } else if (parent is MethodInvocation && parent.methodName == node) {
         return parent;
       } else if (parent is TypeName &&
           parent.parent is ConstructorName &&
-          parent.parent.parent is InstanceCreationExpression) {
-        return parent.parent.parent;
+          parent.parent?.parent is InstanceCreationExpression) {
+        return parent.parent?.parent;
       }
     } else if (node is TypeArgumentList) {
       var parent = node.parent;
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/expression.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/expression.dart
index 3a554d3..f23a609 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/expression.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/expression.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:analysis_server/src/services/correction/fix/data_driven/code_template.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/value_generator.dart';
 
@@ -23,7 +21,7 @@
   BinaryExpression(this.leftOperand, this.operator, this.rightOperand);
 
   @override
-  Object evaluateIn(TemplateContext context) {
+  Object? evaluateIn(TemplateContext context) {
     switch (operator) {
       case Operator.and:
         var left = leftOperand.evaluateIn(context);
@@ -41,7 +39,6 @@
         var right = rightOperand.evaluateIn(context);
         return left != right;
     }
-    return null;
   }
 
   @override
@@ -50,8 +47,9 @@
 
 /// An expression.
 abstract class Expression {
-  /// Return the result of evaluating this expression.
-  Object evaluateIn(TemplateContext context);
+  /// Return the result of evaluating this expression, or `null` if the
+  /// expression can't be evaluated in the given [context].
+  Object? evaluateIn(TemplateContext context);
 }
 
 /// A literal string.
@@ -106,6 +104,5 @@
       case Operator.notEqual:
         return '!=';
     }
-    return 'impossible';
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
index 76ec8f6..56e83f4 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.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:analysis_server/src/services/correction/dart/data_driven.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/code_template.dart';
@@ -11,7 +9,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
-import 'package:meta/meta.dart';
 
 /// The addition of a new parameter.
 class AddParameter extends ParameterModification {
@@ -33,15 +30,14 @@
   /// argument needs to be added. The only time an argument needs to be added
   /// for an optional parameter is if the parameter is positional and there are
   /// pre-existing optional positional parameters after the ones being added.
-  final CodeTemplate argumentValue;
+  final CodeTemplate? argumentValue;
 
   /// Initialize a newly created parameter modification to represent the
   /// addition of a parameter. If provided, the [argumentValue] will be used as
   /// the value of the new argument in invocations of the function.
   AddParameter(this.index, this.name, this.isRequired, this.isPositional,
       this.argumentValue)
-      : assert(index >= 0),
-        assert(name != null);
+      : assert(index >= 0);
 }
 
 /// The data related to an executable element whose parameters have been
@@ -52,16 +48,20 @@
 
   /// Initialize a newly created transform to modifications to the parameter
   /// list of a function.
-  ModifyParameters({@required this.modifications})
-      : assert(modifications != null),
-        assert(modifications.isNotEmpty);
+  ModifyParameters({required this.modifications})
+      : assert(modifications.isNotEmpty);
 
   @override
   void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
     var argumentList = data.argumentList;
+    var invocation = argumentList.parent;
+    if (invocation == null) {
+      // This should only happen if `validate` didn't check this case.
+      return;
+    }
     var arguments = argumentList.arguments;
     var argumentCount = arguments.length;
-    var templateContext = TemplateContext(argumentList.parent, fix.utils);
+    var templateContext = TemplateContext(invocation, fix.utils);
 
     var indexToNewArgumentMap = <int, AddParameter>{};
     var argumentsToInsert = <int>[];
@@ -77,7 +77,7 @@
           var requiredIfCondition =
               modification.argumentValue?.requiredIfCondition;
           if (requiredIfCondition != null &&
-              requiredIfCondition.evaluateIn(templateContext)) {
+              requiredIfCondition.evaluateIn(templateContext) == true) {
             argumentsToInsert.add(index);
           }
         }
@@ -99,11 +99,14 @@
     /// Write to the [builder] the argument associated with a single
     /// [parameter].
     void writeArgument(DartEditBuilder builder, AddParameter parameter) {
-      if (!parameter.isPositional) {
-        builder.write(parameter.name);
-        builder.write(': ');
+      var argumentValue = parameter.argumentValue;
+      if (argumentValue != null) {
+        if (!parameter.isPositional) {
+          builder.write(parameter.name);
+          builder.write(': ');
+        }
+        argumentValue.writeOn(builder, templateContext);
       }
-      parameter.argumentValue.writeOn(builder, templateContext);
     }
 
     var insertionRanges = argumentsToInsert.contiguousSubRanges.toList();
@@ -124,7 +127,9 @@
             needsComma = true;
           }
           var parameter = indexToNewArgumentMap[argumentIndex];
-          writeArgument(builder, parameter);
+          if (parameter != null) {
+            writeArgument(builder, parameter);
+          }
         }
       }
 
@@ -187,7 +192,7 @@
         var insertionRange = insertionRanges[nextInsertionRange];
         var lower = insertionRange.lower;
         var upper = insertionRange.upper;
-        var parameter = indexToNewArgumentMap[upper];
+        var parameter = indexToNewArgumentMap[upper]!;
         while (upper >= lower &&
             (parameter.isPositional && !parameter.isRequired)) {
           upper--;
@@ -223,25 +228,26 @@
   }
 
   @override
-  _Data validate(DataDrivenFix fix) {
+  _Data? validate(DataDrivenFix fix) {
     var node = fix.node;
     var parent = node.parent;
+    var grandParent = parent?.parent;
+    var greatGrandParent = grandParent?.parent;
     if (parent is InvocationExpression) {
       var argumentList = parent.argumentList;
       return _Data(argumentList);
     } else if (parent is Label) {
-      var argumentList = parent.parent.parent;
+      var argumentList = grandParent?.parent;
       if (argumentList is ArgumentList) {
         return _Data(argumentList);
       }
-    } else if (parent?.parent is InvocationExpression) {
-      var argumentList = (parent.parent as InvocationExpression).argumentList;
+    } else if (grandParent is InvocationExpression) {
+      var argumentList = grandParent.argumentList;
       return _Data(argumentList);
     } else if (parent is TypeName &&
-        parent.parent is ConstructorName &&
-        parent.parent.parent is InstanceCreationExpression) {
-      var argumentList =
-          (parent.parent.parent as InstanceCreationExpression).argumentList;
+        grandParent is ConstructorName &&
+        greatGrandParent is InstanceCreationExpression) {
+      var argumentList = greatGrandParent.argumentList;
       return _Data(argumentList);
     }
     return null;
@@ -249,7 +255,7 @@
 
   /// Return the range from the list of [ranges] that contains the given
   /// [index], or `null` if there is no such range.
-  _IndexRange _rangeContaining(List<_IndexRange> ranges, int index) {
+  _IndexRange? _rangeContaining(List<_IndexRange> ranges, int index) {
     for (var range in ranges) {
       if (index >= range.lower && index <= range.upper) {
         return range;
@@ -261,8 +267,10 @@
   /// Return the element of the argument list whose value is the given
   /// [argument]. If the argument is the child of a named expression, then that
   /// will be the named expression, otherwise it will be the argument itself.
-  Expression _realArgument(Expression argument) =>
-      argument.parent is NamedExpression ? argument.parent : argument;
+  Expression _realArgument(Expression argument) {
+    var parent = argument.parent;
+    return parent is NamedExpression ? parent : argument;
+  }
 }
 
 /// A modification related to a parameter.
@@ -275,7 +283,7 @@
 
   /// Initialize a newly created parameter modification to represent the removal
   /// of an existing [parameter].
-  RemoveParameter(this.parameter) : assert(parameter != null);
+  RemoveParameter(this.parameter);
 }
 
 /// The data returned when updating an invocation site.
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart
index b7958ad9..d3089e9 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart
@@ -2,48 +2,47 @@
 // 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:analysis_server/src/services/correction/dart/data_driven.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
-import 'package:meta/meta.dart';
 
 /// The data related to an element that has been renamed.
-class Rename extends Change<SimpleIdentifier> {
+class Rename extends Change<_Data> {
   /// The new name of the element.
   final String newName;
 
   /// Initialize a newly created transform to describe a renaming of an element
   /// to the [newName].
-  Rename({@required this.newName});
+  Rename({required this.newName});
 
   @override
-  void apply(DartFileEditBuilder builder, DataDrivenFix fix,
-      SimpleIdentifier nameNode) {
+  void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
+    var nameNode = data.nameNode;
     if (fix.element.isConstructor) {
-      var parent = nameNode.parent;
+      var parent = nameNode?.parent;
       if (parent is ConstructorName) {
         if (nameNode != null && newName.isEmpty) {
           // The constructor was renamed from a named constructor to an unnamed
           // constructor.
-          builder.addDeletion(range.startEnd(parent.period, parent));
+          builder.addDeletion(range.startEnd(parent.period!, parent));
         } else if (nameNode == null && newName.isNotEmpty) {
           // The constructor was renamed from an unnamed constructor to a named
           // constructor.
           builder.addSimpleInsertion(parent.end, '.$newName');
-        } else {
+        } else if (nameNode != null) {
           // The constructor was renamed from a named constructor to another
           // named constructor.
           builder.addSimpleReplacement(range.node(nameNode), newName);
         }
+      } else if (nameNode == null) {
+        return;
       } else if (parent is MethodInvocation) {
         if (newName.isEmpty) {
           // The constructor was renamed from a named constructor to an unnamed
           // constructor.
-          builder.addDeletion(range.startEnd(parent.operator, nameNode));
+          builder.addDeletion(range.startEnd(parent.operator!, nameNode));
         } else {
           // The constructor was renamed from a named constructor to another
           // named constructor.
@@ -58,30 +57,38 @@
         // constructor.
         builder.addSimpleReplacement(range.node(nameNode), newName);
       }
-    } else {
+    } else if (nameNode != null) {
       // The name is a simple identifier.
       builder.addSimpleReplacement(range.node(nameNode), newName);
     }
   }
 
   @override
-  SimpleIdentifier validate(DataDrivenFix fix) {
+  _Data? validate(DataDrivenFix fix) {
     var node = fix.node;
     if (node is SimpleIdentifier) {
       var parent = node.parent;
-      if (parent is Label && parent.parent is NamedExpression) {
-        var invocation = parent.parent.parent.parent;
+      var grandParent = parent?.parent;
+      if (parent is Label && grandParent is NamedExpression) {
+        var invocation = grandParent.parent?.parent;
         if (invocation is InstanceCreationExpression) {
           invocation.constructorName.name;
         } else if (invocation is MethodInvocation) {
-          return invocation.methodName;
+          return _Data(invocation.methodName);
         }
         return null;
       }
-      return node;
+      return _Data(node);
     } else if (node is ConstructorName) {
-      return node.name;
+      return _Data(node.name);
     }
     return null;
   }
 }
+
+/// The data renaming a declaration.
+class _Data {
+  final SimpleIdentifier? nameNode;
+
+  _Data(this.nameNode);
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
index 7f9dbac..729692e 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.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:analysis_server/src/services/correction/dart/data_driven.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -11,7 +9,6 @@
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
-import 'package:meta/meta.dart';
 
 /// The data related to a parameter that has been renamed.
 class RenameParameter extends Change<_Data> {
@@ -23,7 +20,7 @@
 
   /// Initialize a newly created transform to describe a renaming of a parameter
   /// from the [oldName] to the [newName].
-  RenameParameter({@required this.newName, @required this.oldName});
+  RenameParameter({required this.newName, required this.oldName});
 
   @override
   void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
@@ -38,23 +35,27 @@
         if (overriddenParameter == null) {
           // If the overridden parameter has already been removed, then just
           // rename the old parameter to have the new name.
-          builder.addSimpleReplacement(
-              range.node(parameter.identifier), newName);
+          var identifier = parameter.identifier;
+          if (identifier != null) {
+            builder.addSimpleReplacement(range.node(identifier), newName);
+          }
         } else {
           // If the overridden parameter still exists, then mark it as
           // deprecated (if it isn't already) and add a declaration of the new
           // parameter.
-          builder.addInsertion(parameter.offset, (builder) {
-            var parameterElement = parameter.declaredElement;
-            builder.writeParameter(newName,
-                isCovariant: parameterElement.isCovariant,
-                isRequiredNamed: parameterElement.isRequiredNamed,
-                type: parameterElement.type);
-            builder.write(', ');
-            if (!parameterElement.hasDeprecated) {
-              builder.write('@deprecated ');
-            }
-          });
+          var parameterElement = parameter.declaredElement;
+          if (parameterElement != null) {
+            builder.addInsertion(parameter.offset, (builder) {
+              builder.writeParameter(newName,
+                  isCovariant: parameterElement.isCovariant,
+                  isRequiredNamed: parameterElement.isRequiredNamed,
+                  type: parameterElement.type);
+              builder.write(', ');
+              if (!parameterElement.hasDeprecated) {
+                builder.write('@deprecated ');
+              }
+            });
+          }
         }
       }
     }
@@ -65,11 +66,12 @@
     var node = fix.node;
     if (node is SimpleIdentifier) {
       var parent = node.parent;
+      var grandParent = parent?.parent;
       if (node.name == oldName &&
           parent is Label &&
-          parent.parent is NamedExpression) {
-        var invocation = parent.parent.parent.parent;
-        if (fix.element.matches(invocation)) {
+          grandParent is NamedExpression) {
+        var invocation = grandParent.parent?.parent;
+        if (invocation != null && fix.element.matches(invocation)) {
           return _InvocationData(node);
         }
       } else if (parent is MethodDeclaration) {
@@ -111,10 +113,13 @@
 extension on MethodDeclaration {
   /// Return the parameter of this method whose name matches the given [name],
   /// or `null` if there is no such parameter.
-  FormalParameter parameterNamed(String name) {
-    for (var parameter in parameters.parameters) {
-      if (parameter.declaredElement.name == name) {
-        return parameter;
+  FormalParameter? parameterNamed(String name) {
+    var parameters = this.parameters;
+    if (parameters != null) {
+      for (var parameter in parameters.parameters) {
+        if (parameter.declaredElement?.name == name) {
+          return parameter;
+        }
       }
     }
     return null;
@@ -122,12 +127,14 @@
 
   /// Return the element that this method overrides, or `null` if this method
   /// doesn't override any inherited member.
-  ExecutableElement overriddenElement() {
+  ExecutableElement? overriddenElement() {
     var element = declaredElement;
-    var enclosingElement = element.enclosingElement;
-    if (enclosingElement is ClassElement) {
-      var name = Name(enclosingElement.library.source.uri, element.name);
-      return InheritanceManager3().getInherited2(enclosingElement, name);
+    if (element != null) {
+      var enclosingElement = element.enclosingElement;
+      if (enclosingElement is ClassElement) {
+        var name = Name(enclosingElement.library.source.uri, element.name);
+        return InheritanceManager3().getInherited2(enclosingElement, name);
+      }
     }
     return null;
   }
@@ -136,7 +143,7 @@
 extension on ExecutableElement {
   /// Return the parameter of this executable element whose name matches the
   /// given [name], or `null` if there is no such parameter.
-  ParameterElement parameterNamed(String name) {
+  ParameterElement? parameterNamed(String name) {
     for (var parameter in parameters) {
       if (parameter.name == name) {
         return parameter;
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform.dart
index cc03b29..75d72c2 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform.dart
@@ -2,13 +2,10 @@
 // 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:analysis_server/src/services/correction/fix/data_driven/changes_selector.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/element_matcher.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_override.dart';
-import 'package:meta/meta.dart';
 
 /// A description of a set of changes to a single element of the API.
 class Transform {
@@ -31,17 +28,17 @@
   /// Initialize a newly created transform to describe a transformation of the
   /// [element].
   Transform(
-      {@required this.title,
-      this.date,
-      @required this.bulkApply,
-      @required this.element,
-      @required this.changesSelector});
+      {required this.title,
+      required this.date,
+      required this.bulkApply,
+      required this.element,
+      required this.changesSelector});
 
   /// Return `true` if this transform can be applied to fix an issue related to
   /// an element that matches the given [matcher]. The flag [applyingBulkFixes]
   /// indicates whether the transforms are being applied in the context of a
   /// bulk fix.
-  bool appliesTo(ElementMatcher matcher, {@required bool applyingBulkFixes}) {
+  bool appliesTo(ElementMatcher matcher, {required bool applyingBulkFixes}) {
     if (applyingBulkFixes && !bulkApply) {
       return false;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_override_set_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_override_set_parser.dart
index 30c3995..aec5cc03 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_override_set_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_override_set_parser.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:analysis_server/src/services/correction/fix/data_driven/transform_override.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_override_set.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
@@ -26,8 +24,7 @@
 
   /// Return the result of parsing the file [content] into a transform override,
   /// or `null` if the content does not represent a valid transform override.
-  TransformOverrideSet parse(String content) {
-    assert(content != null);
+  TransformOverrideSet? parse(String content) {
     var map = _parseYaml(content);
     if (map == null) {
       // The error has already been reported.
@@ -51,13 +48,15 @@
   }
 
   /// Return the result of parsing the file [content] into a YAML node.
-  YamlNode _parseYaml(String content) {
+  YamlNode? _parseYaml(String content) {
     try {
       return loadYamlNode(content);
     } on YamlException catch (e) {
       var span = e.span;
-      errorReporter.reportErrorForOffset(TransformSetErrorCode.yamlSyntaxError,
-          span.start.offset, span.length, [e.message]);
+      var offset = span?.start.offset ?? 0;
+      var length = span?.length ?? 0;
+      errorReporter.reportErrorForOffset(
+          TransformSetErrorCode.yamlSyntaxError, offset, length, [e.message]);
     }
     return null;
   }
@@ -66,7 +65,7 @@
   /// [node]. A list of [arguments] should be provided if the diagnostic message
   /// has parameters.
   void _reportError(TransformSetErrorCode code, YamlNode node,
-      [List<String> arguments]) {
+      [List<String>? arguments]) {
     var span = node.span;
     errorReporter.reportErrorForOffset(
         code, span.start.offset, span.length, arguments);
@@ -103,7 +102,7 @@
   /// if the [node] doesn't represent a valid bool. If the [node] isn't valid,
   /// use the [context] to report the error. If the [node] doesn't exist and
   /// [required] is `true`, then report an error.
-  bool _translateBool(YamlNode node, ErrorContext context,
+  bool? _translateBool(YamlNode? node, ErrorContext context,
       {bool required = true}) {
     if (node is YamlScalar) {
       var value = node.value;
@@ -122,7 +121,7 @@
   }
 
   /// Translate the given [node] as a key.
-  String _translateKey(YamlNode node) {
+  String? _translateKey(YamlNode node) {
     String type;
     if (node is YamlScalar) {
       if (node.value is String) {
@@ -144,7 +143,7 @@
   /// if the [node] doesn't represent a valid string. If the [node] isn't valid,
   /// use the [context] to report the error. If the [node] doesn't exist and
   /// [required] is `true`, then report an error.
-  String _translateString(YamlNode node, ErrorContext context,
+  String? _translateString(YamlNode? node, ErrorContext context,
       {bool required = true}) {
     if (node is YamlScalar) {
       var value = node.value;
@@ -165,9 +164,8 @@
   /// Translate the [node] into a transform override. Return the resulting
   /// transform override, or `null` if the [node] does not represent a valid
   /// transform override.
-  TransformOverride _translateTransformOverride(
+  TransformOverride? _translateTransformOverride(
       YamlNode node, ErrorContext context, String title) {
-    assert(node != null);
     if (node is YamlMap) {
       _reportUnsupportedKeys(node, const {_bulkApplyKey});
       var bulkApplyNode = node.valueAt(_bulkApplyKey);
@@ -188,8 +186,7 @@
   /// Translate the [node] into a transform override. Return the resulting
   /// transform override, or `null` if the [node] does not represent a valid
   /// transform override.
-  TransformOverrideSet _translateTransformOverrideSet(YamlNode node) {
-    assert(node != null);
+  TransformOverrideSet? _translateTransformOverrideSet(YamlNode node) {
     if (node is YamlMap) {
       var overrides = <TransformOverride>[];
       for (var entry in node.nodes.entries) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set.dart
index 5ef1a7a..9aba8fc 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set.dart
@@ -2,12 +2,9 @@
 // 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:analysis_server/src/services/correction/fix/data_driven/element_matcher.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_override_set.dart';
-import 'package:meta/meta.dart';
 
 /// A set of transforms used to aid in the construction of fixes for issues
 /// related to some body of code. Typically there is one set of transforms for
@@ -40,7 +37,7 @@
   /// [applyingBulkFixes] indicates whether the transforms are being applied in
   /// the context of a bulk fix.
   List<Transform> transformsFor(ElementMatcher matcher,
-      {@required bool applyingBulkFixes}) {
+      {required bool applyingBulkFixes}) {
     var result = <Transform>[];
     for (var transform in _transforms) {
       if (transform.appliesTo(matcher, applyingBulkFixes: applyingBulkFixes)) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_manager.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_manager.dart
index 38f3aa0..c2f427a 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_manager.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_manager.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:analysis_server/src/services/correction/fix/data_driven/transform_set.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_parser.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -54,7 +52,7 @@
   /// Read the [file] and parse the content. Return the transform set that was
   /// parsed, or `null` if the file doesn't exist, isn't readable, or if the
   /// content couldn't be parsed.
-  TransformSet _loadTransformSet(File file) {
+  TransformSet? _loadTransformSet(File file) {
     try {
       // TODO(brianwilkerson) Consider caching the transform sets.
       var content = file.readAsStringSync();
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
index eb162b3..4605bd6 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.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:analysis_server/src/services/correction/fix/data_driven/add_type_parameter.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/changes_selector.dart';
@@ -23,7 +21,6 @@
 import 'package:analysis_server/src/services/correction/fix/data_driven/variable_scope.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/util/yaml.dart';
-import 'package:meta/meta.dart';
 import 'package:yaml/yaml.dart';
 
 /// Information used to report errors when translating a node.
@@ -37,7 +34,7 @@
   final YamlNode parentNode;
 
   /// Initialize a newly created error context.
-  ErrorContext({@required this.key, @required this.parentNode});
+  ErrorContext({required this.key, required this.parentNode});
 }
 
 /// A parser used to read a transform set from a file.
@@ -133,7 +130,7 @@
 
   /// The parameter modifications associated with the current transform, or
   /// `null` if the current transform does not yet have any such modifications.
-  List<ParameterModification> _parameterModifications;
+  List<ParameterModification>? _parameterModifications;
 
   /// Initialize a newly created parser to report diagnostics to the
   /// [errorReporter].
@@ -141,8 +138,7 @@
 
   /// Return the result of parsing the file [content] into a transform set, or
   /// `null` if the content does not represent a valid transform set.
-  TransformSet parse(String content) {
-    assert(content != null);
+  TransformSet? parse(String content) {
     var map = _parseYaml(content);
     if (map == null) {
       // The error has already been reported.
@@ -223,13 +219,15 @@
   }
 
   /// Return the result of parsing the file [content] into a YAML node.
-  YamlNode _parseYaml(String content) {
+  YamlNode? _parseYaml(String content) {
     try {
       return loadYamlNode(content);
     } on YamlException catch (e) {
       var span = e.span;
-      errorReporter.reportErrorForOffset(TransformSetErrorCode.yamlSyntaxError,
-          span.start.offset, span.length, [e.message]);
+      var offset = span?.start.offset ?? 0;
+      var length = span?.length ?? 0;
+      errorReporter.reportErrorForOffset(
+          TransformSetErrorCode.yamlSyntaxError, offset, length, [e.message]);
     }
     return null;
   }
@@ -238,7 +236,7 @@
   /// [node]. A list of [arguments] should be provided if the diagnostic message
   /// has parameters.
   void _reportError(TransformSetErrorCode code, YamlNode node,
-      [List<String> arguments]) {
+      [List<String>? arguments]) {
     var span = node.span;
     errorReporter.reportErrorForOffset(
         code, span.start.offset, span.length, arguments);
@@ -284,15 +282,14 @@
   /// keys is in the map and return it. If more than one of the keys is in the
   /// map, report a diagnostic for each extra key. If [required] is `true` and
   /// none of the keys is in the map, report a diagnostic at the [errorNode].
-  String _singleKey(YamlMap map, List<String> validKeys, YamlNode errorNode,
+  String? _singleKey(YamlMap map, List<String> validKeys, YamlNode errorNode,
       {bool required = true}) {
-    assert(validKeys != null);
     var foundKeys = <String>[];
     var keyToNodeMap = <String, YamlNode>{};
     for (var keyNode in map.nodes.keys) {
       if (keyNode is YamlScalar && keyNode.value is String) {
-        var key = keyNode.value as String;
-        if (key != null && validKeys.contains(key)) {
+        var key = keyNode.value;
+        if (key is String && validKeys.contains(key)) {
           foundKeys.add(key);
           keyToNodeMap[key] = keyNode;
         }
@@ -309,7 +306,7 @@
     var firstKey = foundKeys[0];
     for (var i = 1; i < foundKeys.length; i++) {
       var foundKey = foundKeys[i];
-      var invalidNode = keyToNodeMap[foundKey];
+      var invalidNode = keyToNodeMap[foundKey]!;
       _reportError(TransformSetErrorCode.conflictingKey, invalidNode,
           [foundKey, firstKey]);
     }
@@ -335,7 +332,7 @@
     var styleNode = node.valueAt(_styleKey);
     var style = _translateString(
         styleNode, ErrorContext(key: _styleKey, parentNode: node));
-    if (style == null) {
+    if (styleNode == null || style == null) {
       // The error has already been reported.
       return;
     }
@@ -366,23 +363,19 @@
       if (style != 'optional_named') {
         var valueNode = argumentValueNode as YamlMap;
         _reportError(TransformSetErrorCode.invalidRequiredIf,
-            valueNode.keyAtValue(valueNode.valueAt(_requiredIfKey)));
-        return;
-      } else if (argumentValue == null) {
-        // TODO(brianwilkerson) Report that conditionally required parameters must
-        //  have an argument value.
+            valueNode.keyAtValue(valueNode.valueAt(_requiredIfKey)!)!);
         return;
       }
     }
     _parameterModifications ??= [];
-    _parameterModifications.add(
+    _parameterModifications!.add(
         AddParameter(index, name, isRequired, isPositional, argumentValue));
   }
 
   /// Translate the [node] into an add-type-parameter change. Return the
   /// resulting change, or `null` if the [node] does not represent a valid
   /// add-type-parameter change.
-  AddTypeParameter _translateAddTypeParameterChange(YamlMap node) {
+  AddTypeParameter? _translateAddTypeParameterChange(YamlMap node) {
     _reportUnsupportedKeys(node,
         const {_extendsKey, _indexKey, _kindKey, _nameKey, _argumentValueKey});
     var index = _translateInteger(node.valueAt(_indexKey),
@@ -413,7 +406,7 @@
   /// if the [node] doesn't represent a valid bool. If the [node] isn't valid,
   /// use the [context] to report the error. If the [node] doesn't exist and
   /// [required] is `true`, then report an error.
-  bool _translateBool(YamlNode node, ErrorContext context,
+  bool? _translateBool(YamlNode? node, ErrorContext context,
       {bool required = true}) {
     if (node is YamlScalar) {
       var value = node.value;
@@ -434,13 +427,12 @@
   /// Translate the [node] into a change. Return the resulting change, or `null`
   /// if the [node] does not represent a valid change. If the [node] is not
   /// valid, use the [context] to report the error.
-  Change _translateChange(YamlNode node, ErrorContext context) {
-    assert(node != null);
+  Change? _translateChange(YamlNode node, ErrorContext context) {
     if (node is YamlMap) {
       var kindNode = node.valueAt(_kindKey);
       var kindContext = ErrorContext(key: _kindKey, parentNode: node);
       var kind = _translateString(kindNode, kindContext);
-      if (kind == null) {
+      if (kindNode == null || kind == null) {
         return null;
       } else if (kind == _addParameterKind) {
         _translateAddParameterChange(node);
@@ -470,12 +462,12 @@
   /// Translate the [node] into a value generator. Return the resulting
   /// generator, or `null` if the [node] does not represent a valid value
   /// extractor.
-  ValueGenerator _translateCodeFragment(YamlMap node) {
+  ValueGenerator? _translateCodeFragment(YamlMap node) {
     _reportUnsupportedKeys(node, const {_kindKey, _valueKey});
     var valueNode = node.valueAt(_valueKey);
     var value = _translateString(
         valueNode, ErrorContext(key: _valueKey, parentNode: node));
-    if (value == null) {
+    if (valueNode is! YamlScalar || value == null) {
       // The error has already been reported.
       return null;
     }
@@ -492,7 +484,7 @@
   /// or `null` if the [node] doesn't represent a valid code template. If the
   /// [node] isn't valid, use the [context] to report the error. If the [node]
   /// doesn't exist and [required] is `true`, then report an error.
-  CodeTemplate _translateCodeTemplate(YamlNode node, ErrorContext context,
+  CodeTemplate? _translateCodeTemplate(YamlNode? node, ErrorContext context,
       {bool canBeConditionallyRequired = false, bool required = true}) {
     if (node is YamlMap) {
       if (canBeConditionallyRequired) {
@@ -507,13 +499,13 @@
       var variableScope = _translateTemplateVariables(
           node.valueAt(_variablesKey),
           ErrorContext(key: _variablesKey, parentNode: node));
-      Expression requiredIfCondition;
+      Expression? requiredIfCondition;
       if (canBeConditionallyRequired) {
         var requiredIfNode = node.valueAt(_requiredIfKey);
         var requiredIfText = _translateString(
             requiredIfNode, ErrorContext(key: _requiredIfKey, parentNode: node),
             required: false);
-        if (requiredIfText != null) {
+        if (requiredIfNode is YamlScalar && requiredIfText != null) {
           requiredIfCondition = CodeFragmentParser(errorReporter,
                   scope: variableScope)
               .parseCondition(requiredIfText, _offsetOfString(requiredIfNode));
@@ -523,7 +515,7 @@
           }
         }
       }
-      if (template == null) {
+      if (expressionNode is! YamlScalar || template == null) {
         // The error has already been reported.
         return null;
       }
@@ -551,13 +543,16 @@
           expressionNode, ErrorContext(key: _ifKey, parentNode: node));
       var changes = _translateList(node.valueAt(_changesKey),
           ErrorContext(key: _changesKey, parentNode: node), _translateChange);
-      if (_parameterModifications != null) {
+      var parameterModifications = _parameterModifications;
+      if (parameterModifications != null) {
         if (changes != null) {
-          changes.add(ModifyParameters(modifications: _parameterModifications));
+          changes.add(ModifyParameters(modifications: parameterModifications));
         }
         _parameterModifications = null;
       }
-      if (expressionText != null && changes != null) {
+      if (expressionNode is YamlScalar &&
+          expressionText != null &&
+          changes != null) {
         var expression = CodeFragmentParser(errorReporter,
                 scope: transformVariableScope)
             .parseCondition(expressionText, _offsetOfString(expressionNode));
@@ -570,7 +565,7 @@
     }
   }
 
-  ChangesSelector _translateConditionalChanges(
+  ChangesSelector? _translateConditionalChanges(
       YamlNode node, ErrorContext context) {
     if (node is YamlList) {
       var changeMap = <Expression, List<Change>>{};
@@ -586,7 +581,7 @@
   /// Translate the [node] into a date. Return the resulting date, or `null`
   /// if the [node] does not represent a valid date. If the [node] is not
   /// valid, use the [context] to report the error.
-  DateTime _translateDate(YamlNode node, ErrorContext context) {
+  DateTime? _translateDate(YamlNode? node, ErrorContext context) {
     if (node is YamlScalar) {
       var value = node.value;
       if (value is String) {
@@ -608,7 +603,7 @@
   /// descriptor, or `null` if the [node] does not represent a valid element
   /// descriptor. If the [node] is not valid, use the [context] to report the
   /// error.
-  ElementDescriptor _translateElement(YamlNode node, ErrorContext context) {
+  ElementDescriptor? _translateElement(YamlNode? node, ErrorContext context) {
     if (node is YamlMap) {
       var urisNode = node.valueAt(_urisKey);
       var uris = _translateList(urisNode,
@@ -643,12 +638,15 @@
       }
       var components = [elementName];
       if (_containerKeyMap.containsKey(elementKey)) {
-        var validContainerKeys = _containerKeyMap[elementKey];
+        var validContainerKeys = _containerKeyMap[elementKey]!;
         var containerKey =
             _singleKey(node, validContainerKeys, node, required: false);
-        var containerName = _translateString(node.valueAt(containerKey),
-            ErrorContext(key: containerKey, parentNode: node),
-            required: false);
+        String? containerName;
+        if (containerKey != null) {
+          containerName = _translateString(node.valueAt(containerKey),
+              ErrorContext(key: containerKey, parentNode: node),
+              required: false);
+        }
         if (containerName == null) {
           if ([_constructorKey, _constantKey, _methodKey, _fieldKey]
               .contains(elementKey)) {
@@ -674,7 +672,7 @@
       }
       return ElementDescriptor(
           libraryUris: uris,
-          kind: ElementKindUtilities.fromName(elementKey),
+          kind: ElementKindUtilities.fromName(elementKey)!,
           components: components);
     } else if (node == null) {
       return _reportMissingKey(context);
@@ -686,7 +684,7 @@
   /// Translate the [node] into a value generator. Return the resulting
   /// generator, or `null` if the [node] does not represent a valid value
   /// extractor.
-  ValueGenerator _translateImportValue(YamlMap node) {
+  ValueGenerator? _translateImportValue(YamlMap node) {
     _reportUnsupportedKeys(node, const {_kindKey, _nameKey, _urisKey});
     var urisNode = node.valueAt(_urisKey);
     var uris = _translateList(
@@ -709,7 +707,7 @@
   /// Translate the [node] into an integer. Return the resulting integer, or
   /// `null` if the [node] does not represent a valid integer. If the [node] is
   /// not valid, use the [context] to report the error.
-  int _translateInteger(YamlNode node, ErrorContext context) {
+  int? _translateInteger(YamlNode? node, ErrorContext context) {
     if (node is YamlScalar) {
       var value = node.value;
       if (value is int) {
@@ -724,7 +722,7 @@
   }
 
   /// Translate the given [node] as a key.
-  String _translateKey(YamlNode node) {
+  String? _translateKey(YamlNode node) {
     String type;
     if (node is YamlScalar) {
       if (node.value is String) {
@@ -747,8 +745,8 @@
   /// valid list. If any of the elements of the list can't be translated, they
   /// will be omitted from the list, the [context] will be used to report the
   /// error, and the valid elements will be returned.
-  List<R> _translateList<R>(YamlNode node, ErrorContext context,
-      R Function(YamlNode, ErrorContext) elementTranslator) {
+  List<R>? _translateList<R>(YamlNode? node, ErrorContext context,
+      R? Function(YamlNode, ErrorContext) elementTranslator) {
     if (node is YamlList) {
       var translatedList = <R>[];
       for (var element in node.nodes) {
@@ -777,7 +775,7 @@
     if (parameterSpecKey == _indexKey) {
       var index = _translateInteger(node.valueAt(_indexKey),
           ErrorContext(key: _indexKey, parentNode: node));
-      if (parameterSpecKey == null) {
+      if (index == null) {
         // The error has already been reported.
         return null;
       }
@@ -791,13 +789,13 @@
       }
       reference = NamedParameterReference(name);
     }
-    _parameterModifications ??= [];
-    _parameterModifications.add(RemoveParameter(reference));
+    var parameterModifications = _parameterModifications ??= [];
+    parameterModifications.add(RemoveParameter(reference));
   }
 
   /// Translate the [node] into a rename change. Return the resulting change, or
   /// `null` if the [node] does not represent a valid rename change.
-  Rename _translateRenameChange(YamlMap node) {
+  Rename? _translateRenameChange(YamlMap node) {
     _reportUnsupportedKeys(node, const {_kindKey, _newNameKey});
     var newName = _translateString(node.valueAt(_newNameKey),
         ErrorContext(key: _newNameKey, parentNode: node));
@@ -810,7 +808,7 @@
 
   /// Translate the [node] into a rename parameter change. Return the resulting
   /// change, or `null` if the [node] does not represent a valid rename change.
-  RenameParameter _translateRenameParameterChange(YamlMap node) {
+  RenameParameter? _translateRenameParameterChange(YamlMap node) {
     _reportUnsupportedKeys(node, const {_kindKey, _newNameKey, _oldNameKey});
     var oldName = _translateString(node.valueAt(_oldNameKey),
         ErrorContext(key: _oldNameKey, parentNode: node));
@@ -827,7 +825,7 @@
   /// if the [node] doesn't represent a valid string. If the [node] isn't valid,
   /// use the [context] to report the error. If the [node] doesn't exist and
   /// [required] is `true`, then report an error.
-  String _translateString(YamlNode node, ErrorContext context,
+  String? _translateString(YamlNode? node, ErrorContext context,
       {bool required = true}) {
     if (node is YamlScalar) {
       var value = node.value;
@@ -849,7 +847,7 @@
   /// the enclosing scope if the [node] does not represent a valid variables
   /// map. If the [node] is not valid, use the [context] to report the error.
   VariableScope _translateTemplateVariables(
-      YamlNode node, ErrorContext context) {
+      YamlNode? node, ErrorContext context) {
     if (node is YamlMap) {
       var generators = <String, ValueGenerator>{};
       for (var entry in node.nodes.entries) {
@@ -874,8 +872,7 @@
   /// Translate the [node] into a transform. Return the resulting transform, or
   /// `null` if the [node] does not represent a valid transform. If the [node]
   /// is not valid, use the [context] to report the error.
-  Transform _translateTransform(YamlNode node, ErrorContext context) {
-    assert(node != null);
+  Transform? _translateTransform(YamlNode node, ErrorContext context) {
     if (node is YamlMap) {
       _reportUnsupportedKeys(node, const {
         _bulkApplyKey,
@@ -899,12 +896,12 @@
       transformVariableScope = _translateTemplateVariables(
           node.valueAt(_variablesKey),
           ErrorContext(key: _variablesKey, parentNode: node));
-      ChangesSelector selector;
+      ChangesSelector? selector;
       var key = _singleKey(
           node, const [_changesKey, _oneOfKey], context.parentNode,
           required: true);
       if (key == _oneOfKey) {
-        selector = _translateConditionalChanges(node.valueAt(_oneOfKey),
+        selector = _translateConditionalChanges(node.valueAt(_oneOfKey)!,
             ErrorContext(key: _oneOfKey, parentNode: node));
       } else if (key == _changesKey) {
         var changes = _translateList(node.valueAt(_changesKey),
@@ -914,8 +911,9 @@
           _parameterModifications = null;
           return null;
         }
-        if (_parameterModifications != null) {
-          changes.add(ModifyParameters(modifications: _parameterModifications));
+        var parameterModifications = _parameterModifications;
+        if (parameterModifications != null) {
+          changes.add(ModifyParameters(modifications: parameterModifications));
           _parameterModifications = null;
         }
         selector = UnconditionalChangesSelector(changes);
@@ -944,14 +942,13 @@
 
   /// Translate the [node] into a transform set. Return the resulting transform
   /// set, or `null` if the [node] does not represent a valid transform set.
-  TransformSet _translateTransformSet(YamlNode node) {
-    assert(node != null);
+  TransformSet? _translateTransformSet(YamlNode node) {
     if (node is YamlMap) {
       _reportUnsupportedKeys(node, const {_transformsKey, _versionKey});
       var versionNode = node.valueAt(_versionKey);
       var version = _translateInteger(
           versionNode, ErrorContext(key: _versionKey, parentNode: node));
-      if (version == null) {
+      if (versionNode == null || version == null) {
         // The error has already been reported.
         return null;
       } else if (version < 1 || version > currentVersion) {
@@ -987,7 +984,7 @@
   /// the [node] doesn't represent a valid URI. If the [node] isn't valid, use
   /// the [context] to report the error. If the [node] doesn't exist and
   /// [required] is `true`, then report an error.
-  Uri _translateUri(YamlNode node, ErrorContext context,
+  Uri? _translateUri(YamlNode? node, ErrorContext context,
       {bool required = true}) {
     if (node is YamlScalar) {
       var value = node.value;
@@ -1012,12 +1009,13 @@
   /// extractor, or `null` if the [node] does not represent a valid value
   /// extractor. If the [node] is not valid, use the [context] to report the
   /// error.
-  ValueGenerator _translateValueGenerator(YamlNode node, ErrorContext context) {
+  ValueGenerator? _translateValueGenerator(
+      YamlNode? node, ErrorContext context) {
     if (node is YamlMap) {
       var kindNode = node.valueAt(_kindKey);
       var kindContext = ErrorContext(key: _kindKey, parentNode: node);
       var kind = _translateString(kindNode, kindContext);
-      if (kind == null) {
+      if (kindNode == null || kind == null) {
         return null;
       } else if (kind == _fragmentKind) {
         return _translateCodeFragment(node);
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_generator.dart
index fc9b2fb..ec53b79 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_generator.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_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:analysis_server/src/services/correction/fix/data_driven/accessor.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/code_template.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -22,7 +20,7 @@
 
   @override
   String evaluateIn(TemplateContext context) {
-    Object target = context.node;
+    Object? target = context.node;
     for (var i = 0; i < accessors.length; i++) {
       var result = accessors[i].getValue(target);
       if (!result.isValid) {
@@ -46,7 +44,7 @@
 
   @override
   bool validate(TemplateContext context) {
-    Object target = context.node;
+    Object? target = context.node;
     for (var accessor in accessors) {
       var result = accessor.getValue(target);
       if (!result.isValid) {
@@ -59,7 +57,7 @@
 
   @override
   void writeOn(DartEditBuilder builder, TemplateContext context) {
-    Object target = context.node;
+    Object? target = context.node;
     for (var accessor in accessors) {
       target = accessor.getValue(target).result;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/variable_scope.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/variable_scope.dart
index 6137a32..77a3e75 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/variable_scope.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/variable_scope.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:analysis_server/src/services/correction/fix/data_driven/value_generator.dart';
 
 /// A scope in which the generators associated with variables can be looked up.
@@ -12,7 +10,7 @@
   static final empty = VariableScope(null, {});
 
   /// The outer scope in which this scope is nested.
-  final VariableScope outerScope;
+  final VariableScope? outerScope;
 
   /// A table mapping variable names to generators.
   final Map<String, ValueGenerator> _generators;
@@ -24,7 +22,7 @@
 
   /// Return the generator used to generate the value of the variable with the
   /// given [variableName], or `null` if the variable is not defined.
-  ValueGenerator lookup(String variableName) {
+  ValueGenerator? lookup(String variableName) {
     return _generators[variableName] ?? outerScope?.lookup(variableName);
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 02560a0..2eeadb5 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.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:core';
 
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
@@ -165,10 +163,8 @@
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
-import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/change_builder/conflicting_edit_exception.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart' hide FixContributor;
-import 'package:meta/meta.dart';
 
 /// A function that can be executed to create a multi-correction producer.
 typedef MultiProducerGenerator = MultiCorrectionProducer Function();
@@ -226,7 +222,9 @@
 
     var fixes = <Fix>[];
     for (var generator in generators) {
-      var fixState = FixState(workspace);
+      _FixState fixState = _EmptyFixState(
+        ChangeBuilder(workspace: workspace),
+      );
       for (var error in errors) {
         var fixContext = DartFixContextImpl(
           instrumentationService,
@@ -235,12 +233,12 @@
           error,
           (name) => [],
         );
-        await _fixError(fixContext, fixState, generator(), error);
+        fixState = await _fixError(fixContext, fixState, generator(), error);
       }
-      var sourceChange = fixState.builder.sourceChange;
-      if (sourceChange.edits.isNotEmpty) {
-        var fixKind = fixState.fixKind;
-        if (fixState.fixCount > 1) {
+      if (fixState is _NotEmptyFixState) {
+        var sourceChange = fixState.builder.sourceChange;
+        if (sourceChange.edits.isNotEmpty && fixState.fixCount > 1) {
+          var fixKind = fixState.fixKind;
           sourceChange.message = fixKind.message;
           fixes.add(Fix(fixKind, sourceChange));
         }
@@ -249,7 +247,7 @@
     return fixes;
   }
 
-  Future<void> _fixError(DartFixContext fixContext, FixState fixState,
+  Future<_FixState> _fixError(DartFixContext fixContext, _FixState fixState,
       CorrectionProducer producer, AnalysisError diagnostic) async {
     var context = CorrectionProducerContext.create(
       applyingBulkFixes: true,
@@ -261,7 +259,7 @@
       workspace: fixContext.workspace,
     );
     if (context == null) {
-      return;
+      return fixState;
     }
 
     producer.configure(context);
@@ -269,14 +267,23 @@
     try {
       var localBuilder = fixState.builder.copy();
       await producer.compute(localBuilder);
-      fixState.builder = localBuilder;
+
+      var multiFixKind = producer.multiFixKind;
+      if (multiFixKind == null) {
+        return fixState;
+      }
+
       // todo (pq): consider discarding the change if the producer's fixKind
       // doesn't match a previously cached one.
-      fixState.fixKind = producer.multiFixKind;
-      fixState.fixCount++;
+      return _NotEmptyFixState(
+        builder: localBuilder,
+        fixKind: multiFixKind,
+        fixCount: fixState.fixCount + 1,
+      );
     } on ConflictingEditException {
       // If a conflicting edit was added in [compute], then the [localBuilder]
       // is discarded and we revert to the previous state of the builder.
+      return fixState;
     }
   }
 
@@ -308,9 +315,9 @@
   final bool canBeBulkApplied;
   final List<ProducerGenerator> generators;
   const FixInfo({
-    @required this.canBeAppliedToFile,
-    @required this.canBeBulkApplied,
-    @required this.generators,
+    required this.canBeAppliedToFile,
+    required this.canBeBulkApplied,
+    required this.generators,
   });
 }
 
@@ -1726,19 +1733,23 @@
     return fixes;
   }
 
-  Future<Fix> computeFix() async {
+  Future<Fix?> computeFix() async {
     await _addFromProducers();
     fixes.sort(Fix.SORT_BY_RELEVANCE);
     return fixes.isNotEmpty ? fixes.first : null;
   }
 
   void _addFixFromBuilder(ChangeBuilder builder, CorrectionProducer producer) {
-    if (builder == null) return;
     var change = builder.sourceChange;
     if (change.edits.isEmpty) {
       return;
     }
+
     var kind = producer.fixKind;
+    if (kind == null) {
+      return;
+    }
+
     change.id = kind.id;
     change.message = formatList(kind.message, producer.fixArguments);
     fixes.add(Fix(kind, change));
@@ -1801,11 +1812,37 @@
   }
 }
 
+/// [_FixState] that is still empty.
+class _EmptyFixState implements _FixState {
+  @override
+  final ChangeBuilder builder;
+
+  _EmptyFixState(this.builder);
+
+  @override
+  int get fixCount => 0;
+}
+
 /// State associated with producing fix-all-in-file fixes.
-class FixState {
-  ChangeBuilder builder;
-  FixKind fixKind;
-  int fixCount = 0;
-  FixState(ChangeWorkspace workspace)
-      : builder = ChangeBuilder(workspace: workspace);
+abstract class _FixState {
+  ChangeBuilder get builder;
+
+  int get fixCount;
+}
+
+/// [_FixState] that has a fix, so knows its kind.
+class _NotEmptyFixState implements _FixState {
+  @override
+  final ChangeBuilder builder;
+
+  final FixKind fixKind;
+
+  @override
+  final int fixCount;
+
+  _NotEmptyFixState({
+    required this.builder,
+    required this.fixKind,
+    required this.fixCount,
+  });
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/selection_analyzer.dart b/pkg/analysis_server/lib/src/services/correction/selection_analyzer.dart
index d71a7e1..5e42503 100644
--- a/pkg/analysis_server/lib/src/services/correction/selection_analyzer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/selection_analyzer.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:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -13,18 +11,18 @@
 class SelectionAnalyzer extends GeneralizingAstVisitor<void> {
   final SourceRange selection;
 
-  AstNode _coveringNode;
-  List<AstNode> _selectedNodes;
+  AstNode? _coveringNode;
+  List<AstNode> _selectedNodes = [];
 
   SelectionAnalyzer(this.selection);
 
   /// Return the [AstNode] with the shortest length which completely covers the
   /// specified selection.
-  AstNode get coveringNode => _coveringNode;
+  AstNode? get coveringNode => _coveringNode;
 
   /// Returns the first selected [AstNode], may be `null`.
-  AstNode get firstSelectedNode {
-    if (_selectedNodes == null || _selectedNodes.isEmpty) {
+  AstNode? get firstSelectedNode {
+    if (_selectedNodes.isEmpty) {
       return null;
     }
     return _selectedNodes[0];
@@ -32,15 +30,14 @@
 
   /// Returns `true` if there are [AstNode]s fully covered by the
   /// selection [SourceRange].
-  bool get hasSelectedNodes =>
-      _selectedNodes != null && _selectedNodes.isNotEmpty;
+  bool get hasSelectedNodes => _selectedNodes.isNotEmpty;
 
   /// Returns `true` if there was no selected nodes yet.
-  bool get isFirstNode => _selectedNodes == null;
+  bool get isFirstNode => _selectedNodes.isEmpty;
 
   /// Returns the last selected [AstNode], may be `null`.
-  AstNode get lastSelectedNode {
-    if (_selectedNodes == null || _selectedNodes.isEmpty) {
+  AstNode? get lastSelectedNode {
+    if (_selectedNodes.isEmpty) {
       return null;
     }
     return _selectedNodes[_selectedNodes.length - 1];
@@ -48,9 +45,6 @@
 
   /// Return the [AstNode]s fully covered by the selection [SourceRange].
   List<AstNode> get selectedNodes {
-    if (_selectedNodes == null || _selectedNodes.isEmpty) {
-      return [];
-    }
     return _selectedNodes;
   }
 
@@ -62,7 +56,7 @@
 
   /// Adds second or more selected [AstNode].
   void handleNextSelectedNode(AstNode node) {
-    if (firstSelectedNode.parent == node.parent) {
+    if (firstSelectedNode?.parent == node.parent) {
       _selectedNodes.add(node);
     }
   }
@@ -75,7 +69,7 @@
 
   /// Resets selected nodes.
   void reset() {
-    _selectedNodes = null;
+    _selectedNodes = [];
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
index 3f62794..320aae7 100644
--- a/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.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:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/services/correction/selection_analyzer.dart';
 import 'package:analysis_server/src/services/correction/status.dart';
@@ -12,6 +10,7 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -22,7 +21,8 @@
 List<Token> _getTokens(String text, FeatureSet featureSet) {
   try {
     var tokens = <Token>[];
-    var scanner = Scanner(null, CharSequenceReader(text), null)
+    var scanner = Scanner(_SourceMock.instance, CharSequenceReader(text),
+        AnalysisErrorListener.NULL_LISTENER)
       ..configureFeatures(
         featureSetForOverriding: featureSet,
         featureSet: featureSet,
@@ -30,11 +30,11 @@
     var token = scanner.tokenize();
     while (token.type != TokenType.EOF) {
       tokens.add(token);
-      token = token.next;
+      token = token.next!;
     }
     return tokens;
   } catch (e) {
-    return List<Token>.filled(0, null);
+    return const <Token>[];
   }
 }
 
@@ -52,11 +52,11 @@
 
   /// Analyze the selection, compute [status] and nodes.
   void analyze() {
-    resolveResult.unit.accept(this);
+    resolveResult.unit!.accept(this);
   }
 
   /// Records fatal error with given message and [Location].
-  void invalidSelection(String message, [Location context]) {
+  void invalidSelection(String message, [Location? context]) {
     if (!_status.hasFatalError) {
       _status.addFatalError(message, context);
     }
@@ -64,16 +64,16 @@
   }
 
   @override
-  Object visitCompilationUnit(CompilationUnit node) {
+  void visitCompilationUnit(CompilationUnit node) {
     super.visitCompilationUnit(node);
     if (!hasSelectedNodes) {
-      return null;
+      return;
     }
     // check that selection does not begin/end in comment
     {
       var selectionStart = selection.offset;
       var selectionEnd = selection.end;
-      var commentRanges = getCommentRanges(resolveResult.unit);
+      var commentRanges = getCommentRanges(resolveResult.unit!);
       for (var commentRange in commentRanges) {
         if (commentRange.contains(selectionStart)) {
           invalidSelection('Selection begins inside a comment.');
@@ -87,22 +87,20 @@
     if (!_status.hasFatalError) {
       _checkSelectedNodes(node);
     }
-    return null;
   }
 
   @override
-  Object visitDoStatement(DoStatement node) {
+  void visitDoStatement(DoStatement node) {
     super.visitDoStatement(node);
     var selectedNodes = this.selectedNodes;
     if (_contains(selectedNodes, node.body)) {
       invalidSelection(
           "Operation not applicable to a 'do' statement's body and expression.");
     }
-    return null;
   }
 
   @override
-  Object visitForStatement(ForStatement node) {
+  void visitForStatement(ForStatement node) {
     super.visitForStatement(node);
     var forLoopParts = node.forLoopParts;
     if (forLoopParts is ForParts) {
@@ -129,11 +127,10 @@
             "Operation not applicable to a 'for' statement's updaters and body.");
       }
     }
-    return null;
   }
 
   @override
-  Object visitSwitchStatement(SwitchStatement node) {
+  void visitSwitchStatement(SwitchStatement node) {
     super.visitSwitchStatement(node);
     var selectedNodes = this.selectedNodes;
     List<SwitchMember> switchMembers = node.members;
@@ -144,11 +141,10 @@
         break;
       }
     }
-    return null;
   }
 
   @override
-  Object visitTryStatement(TryStatement node) {
+  void visitTryStatement(TryStatement node) {
     super.visitTryStatement(node);
     var firstSelectedNode = this.firstSelectedNode;
     if (firstSelectedNode != null) {
@@ -168,11 +164,10 @@
         }
       }
     }
-    return null;
   }
 
   @override
-  Object visitWhileStatement(WhileStatement node) {
+  void visitWhileStatement(WhileStatement node) {
     super.visitWhileStatement(node);
     var selectedNodes = this.selectedNodes;
     if (_contains(selectedNodes, node.condition) &&
@@ -180,7 +175,6 @@
       invalidSelection(
           "Operation not applicable to a while statement's expression and body.");
     }
-    return null;
   }
 
   /// Checks final selected [AstNode]s after processing [CompilationUnit].
@@ -214,13 +208,13 @@
 
   /// Returns `true` if there are [Token]s in the given [SourceRange].
   bool _hasTokens(SourceRange range) {
-    var fullText = resolveResult.content;
+    var fullText = resolveResult.content!;
     var rangeText = fullText.substring(range.offset, range.end);
-    return _getTokens(rangeText, resolveResult.unit.featureSet).isNotEmpty;
+    return _getTokens(rangeText, resolveResult.unit!.featureSet).isNotEmpty;
   }
 
   /// Returns `true` if [nodes] contains [node].
-  static bool _contains(List<AstNode> nodes, AstNode node) =>
+  static bool _contains(List<AstNode> nodes, AstNode? node) =>
       nodes.contains(node);
 
   /// Returns `true` if [nodes] contains one of the [otherNodes].
@@ -233,3 +227,10 @@
     return false;
   }
 }
+
+class _SourceMock implements Source {
+  static final Source instance = _SourceMock();
+
+  @override
+  dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index c61a3fd..2f4bec9 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -429,7 +429,7 @@
 
 /// Returns the given [statement] if not a block, or the first child statement
 /// if a block, or `null` if more than one child.
-Statement? getSingleStatement(Statement statement) {
+Statement? getSingleStatement(Statement? statement) {
   if (statement is Block) {
     List<Statement> blockStatements = statement.statements;
     if (blockStatements.length != 1) {
diff --git a/pkg/analysis_server/test/analysis/get_hover_test.dart b/pkg/analysis_server/test/analysis/get_hover_test.dart
index 47d5d33..d361d10 100644
--- a/pkg/analysis_server/test/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/analysis/get_hover_test.dart
@@ -14,11 +14,36 @@
 
 void main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(AnalysisHoverBazelTest);
     defineReflectiveTests(AnalysisHoverTest);
   });
 }
 
 @reflectiveTest
+class AnalysisHoverBazelTest extends AbstractAnalysisTest {
+  Future<void> test_bazel_notOwnedUri() async {
+    newFile('/workspace/WORKSPACE');
+    projectPath = newFolder('/workspace').path;
+    testFile = convertPath('/workspace/dart/my/lib/test.dart');
+
+    newFile(
+      '/workspace/bazel-genfiles/dart/my/lib/test.dart',
+      content: '// generated',
+    );
+
+    createProject();
+
+    addTestFile('''
+class A {}
+''');
+
+    var request = AnalysisGetHoverParams(testFile, 0).toRequest('0');
+    var response = await waitResponse(request);
+    expect(response.error, isNotNull);
+  }
+}
+
+@reflectiveTest
 class AnalysisHoverTest extends AbstractAnalysisTest {
   Future<HoverInformation> prepareHover(String search) {
     var offset = findOffset(search);
diff --git a/pkg/analysis_server/test/src/plugin/notification_manager_test.dart b/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
index 25f5615..0f7483d 100644
--- a/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/notification_manager_test.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:analysis_server/protocol/protocol.dart' as server;
 import 'package:analysis_server/protocol/protocol_generated.dart' as server;
 import 'package:analysis_server/src/channel/channel.dart';
@@ -33,13 +31,13 @@
 
 @reflectiveTest
 class NotificationManagerTest extends ProtocolTestUtilities {
-  String testDir;
-  String fileA;
-  String fileB;
+  late String testDir;
+  late String fileA;
+  late String fileB;
 
-  TestChannel channel;
+  late TestChannel channel;
 
-  NotificationManager manager;
+  late NotificationManager manager;
 
   void setUp() {
     var provider = MemoryResourceProvider();
@@ -389,8 +387,7 @@
   }
 
   void _verifyErrors(String fileName, List<AnalysisError> expectedErrors) {
-    var notification = channel.sentNotification;
-    expect(notification, isNotNull);
+    var notification = channel.sentNotification!;
     expect(notification.event, 'analysis.errors');
     var params = server.AnalysisErrorsParams.fromNotification(notification);
     expect(params, isNotNull);
@@ -401,8 +398,7 @@
 
   void _verifyFoldingRegions(
       String fileName, List<FoldingRegion> expectedRegions) {
-    var notification = channel.sentNotification;
-    expect(notification, isNotNull);
+    var notification = channel.sentNotification!;
     expect(notification.event, 'analysis.folding');
     var params = server.AnalysisFoldingParams.fromNotification(notification);
     expect(params, isNotNull);
@@ -413,8 +409,7 @@
 
   void _verifyHighlightRegions(
       String fileName, List<HighlightRegion> expectedRegions) {
-    var notification = channel.sentNotification;
-    expect(notification, isNotNull);
+    var notification = channel.sentNotification!;
     expect(notification.event, 'analysis.highlights');
     var params = server.AnalysisHighlightsParams.fromNotification(notification);
     expect(params, isNotNull);
@@ -424,8 +419,7 @@
   }
 
   void _verifyNavigationParams(server.AnalysisNavigationParams expectedParams) {
-    var notification = channel.sentNotification;
-    expect(notification, isNotNull);
+    var notification = channel.sentNotification!;
     expect(notification.event, 'analysis.navigation');
     var params = server.AnalysisNavigationParams.fromNotification(notification);
     expect(params, isNotNull);
@@ -438,8 +432,7 @@
 
   void _verifyOccurrences(
       String fileName, List<Occurrences> expectedOccurrences) {
-    var notification = channel.sentNotification;
-    expect(notification, isNotNull);
+    var notification = channel.sentNotification!;
     expect(notification.event, 'analysis.occurrences');
     var params =
         server.AnalysisOccurrencesParams.fromNotification(notification);
@@ -450,8 +443,7 @@
   }
 
   void _verifyOutlines(String fileName, Outline expectedOutline) {
-    var notification = channel.sentNotification;
-    expect(notification, isNotNull);
+    var notification = channel.sentNotification!;
     expect(notification.event, 'analysis.outline');
     var params = server.AnalysisOutlineParams.fromNotification(notification);
     expect(params, isNotNull);
@@ -461,8 +453,7 @@
   }
 
   void _verifyPluginError(bool isFatal, String message, String stackTrace) {
-    var notification = channel.sentNotification;
-    expect(notification, isNotNull);
+    var notification = channel.sentNotification!;
     expect(notification.event, 'server.error');
     var params = server.ServerErrorParams.fromNotification(notification);
     expect(params, isNotNull);
@@ -474,7 +465,7 @@
 }
 
 class TestChannel implements ServerCommunicationChannel {
-  server.Notification sentNotification;
+  server.Notification? sentNotification;
 
   @override
   void close() {
@@ -483,7 +474,7 @@
 
   @override
   void listen(void Function(server.Request) onRequest,
-      {Function onError, void Function() onDone}) {
+      {Function? onError, void Function()? onDone}) {
     fail('Unexpected invocation of listen');
   }
 
diff --git a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
index ae1ba51..39e4ddc 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_manager_test.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' as io;
 
 import 'package:analysis_server/src/plugin/notification_manager.dart';
@@ -36,12 +34,12 @@
 
 @reflectiveTest
 class BuiltInPluginInfoTest with ResourceProviderMixin, _ContextRoot {
-  TestNotificationManager notificationManager;
-  BuiltInPluginInfo plugin;
+  late TestNotificationManager notificationManager;
+  late BuiltInPluginInfo plugin;
 
   void setUp() {
     notificationManager = TestNotificationManager();
-    plugin = BuiltInPluginInfo(null, 'test plugin', notificationManager,
+    plugin = BuiltInPluginInfo((_) {}, 'test plugin', notificationManager,
         InstrumentationService.NULL_SERVICE);
   }
 
@@ -105,11 +103,11 @@
 
 @reflectiveTest
 class DiscoveredPluginInfoTest with ResourceProviderMixin, _ContextRoot {
-  TestNotificationManager notificationManager;
+  late TestNotificationManager notificationManager;
   String pluginPath = '/pluginDir';
   String executionPath = '/pluginDir/bin/plugin.dart';
   String packagesPath = '/pluginDir/.packages';
-  DiscoveredPluginInfo plugin;
+  late DiscoveredPluginInfo plugin;
 
   void setUp() {
     notificationManager = TestNotificationManager();
@@ -130,7 +128,7 @@
     expect(plugin.contextRoots, [contextRoot1]);
     var sentRequests = channel.sentRequests;
     expect(sentRequests, hasLength(1));
-    List<Map> roots = sentRequests[0].params['roots'];
+    var roots = sentRequests[0].params['roots'] as List<Map>;
     expect(roots[0]['optionsFile'], optionsFile.path);
   }
 
@@ -188,7 +186,7 @@
 @reflectiveTest
 class PluginManagerFromDiskTest extends PluginTestSupport {
   String byteStorePath = '/byteStore';
-  PluginManager manager;
+  late PluginManager manager;
 
   @override
   void setUp() {
@@ -447,10 +445,10 @@
 
 @reflectiveTest
 class PluginManagerTest with ResourceProviderMixin, _ContextRoot {
-  String byteStorePath;
-  String sdkPath;
-  TestNotificationManager notificationManager;
-  PluginManager manager;
+  late String byteStorePath;
+  late String sdkPath;
+  late TestNotificationManager notificationManager;
+  late PluginManager manager;
 
   void setUp() {
     byteStorePath = resourceProvider.convertPath('/byteStore');
@@ -500,7 +498,7 @@
     newFolder('/workspaceRoot/bazel-bin');
     newFolder('/workspaceRoot/bazel-genfiles');
 
-    String newPackage(String packageName, [List<String> dependencies]) {
+    String newPackage(String packageName, [List<String>? dependencies]) {
       var packageRoot =
           newFolder('/workspaceRoot/third_party/dart/$packageName').path;
       newFile('$packageRoot/lib/$packageName.dart');
@@ -579,13 +577,13 @@
 
 @reflectiveTest
 class PluginSessionTest with ResourceProviderMixin {
-  TestNotificationManager notificationManager;
-  String pluginPath;
-  String executionPath;
-  String packagesPath;
-  String sdkPath;
-  PluginInfo plugin;
-  PluginSession session;
+  late TestNotificationManager notificationManager;
+  late String pluginPath;
+  late String executionPath;
+  late String packagesPath;
+  late String sdkPath;
+  late PluginInfo plugin;
+  late PluginSession session;
 
   void setUp() {
     notificationManager = TestNotificationManager();
@@ -655,7 +653,7 @@
   Future<void> test_start_running() async {
     TestServerCommunicationChannel(session);
     try {
-      await session.start(null, '');
+      await session.start('', '');
       fail('Expected a StateError to be thrown');
     } on StateError {
       // Expected behavior
@@ -677,12 +675,12 @@
 /// A class designed to be used as a superclass for test classes that define
 /// tests that require plugins to be created on disk.
 abstract class PluginTestSupport {
-  PhysicalResourceProvider resourceProvider;
-  TestNotificationManager notificationManager;
+  late PhysicalResourceProvider resourceProvider;
+  late TestNotificationManager notificationManager;
 
   /// The content to be used for the '.packages' file, or `null` if the content
   /// has not yet been computed.
-  String _packagesFileContent;
+  String? _packagesFileContent;
 
   void setUp() {
     resourceProvider = PhysicalResourceProvider.INSTANCE;
@@ -705,9 +703,9 @@
   /// The [test] function will be passed the path of the directory that was
   /// created.
   Future<void> withPlugin(
-      {String content,
-      String pluginName,
-      Future<void> Function(String) test}) async {
+      {String? content,
+      String? pluginName,
+      required Future<void> Function(String) test}) async {
     var tempDirectory =
         io.Directory.systemTemp.createTempSync(pluginName ?? 'test_plugin');
     try {
@@ -752,9 +750,9 @@
   /// The [test] function will be passed the path of the directory that was
   /// created.
   Future<void> withPubspecPlugin(
-      {String content,
-      String pluginName,
-      Future<void> Function(String) test}) async {
+      {String? content,
+      String? pluginName,
+      required Future<void> Function(String) test}) async {
     var tempDirectory =
         io.Directory.systemTemp.createTempSync(pluginName ?? 'test_plugin');
     try {
@@ -850,13 +848,14 @@
 
   /// Return the content to be used for the '.packages' file.
   String _getPackagesFileContent() {
-    if (_packagesFileContent == null) {
+    var packagesFileContent = _packagesFileContent;
+    if (packagesFileContent == null) {
       var sdkPackagesFile = io.File(_sdkPackagesPath());
       var sdkPackageMap = sdkPackagesFile.readAsLinesSync();
-      _packagesFileContent =
+      packagesFileContent = _packagesFileContent =
           _convertPackageMap(path.dirname(sdkPackagesFile.path), sdkPackageMap);
     }
-    return _packagesFileContent;
+    return packagesFileContent;
   }
 
   /// Return the content to be used for the 'pubspec.yaml' file.
@@ -926,9 +925,9 @@
   }
 
   @override
-  void listen(void Function(Response) onResponse,
-      void Function(Notification) onNotification,
-      {void Function(dynamic) onError, void Function() onDone}) {
+  void listen(void Function(Response response) onResponse,
+      void Function(Notification notification) onNotification,
+      {void Function(dynamic error)? onError, void Function()? onDone}) {
     fail('Unexpected invocation of listen');
   }
 
diff --git a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
index 7906315..62eb89f 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.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:async';
 
 import 'package:analysis_server/src/plugin/plugin_locator.dart';
@@ -26,8 +24,8 @@
 
 @reflectiveTest
 class PluginWatcherTest extends AbstractContextTest {
-  TestPluginManager manager;
-  PluginWatcher watcher;
+  late TestPluginManager manager;
+  late PluginWatcher watcher;
 
   @override
   void setUp() {
@@ -88,7 +86,7 @@
 
   void test_removedDriver() {
     var driver = driverFor(testPackageRootPath);
-    var contextRoot = driver.analysisContext.contextRoot;
+    var contextRoot = driver.analysisContext!.contextRoot;
     watcher.addedDriver(driver);
     watcher.removedDriver(driver);
     expect(manager.removedContextRoots, equals([contextRoot]));
diff --git a/pkg/analysis_server/test/src/plugin/test_all.dart b/pkg/analysis_server/test/src/plugin/test_all.dart
index 70d0fd0..9240a5d 100644
--- a/pkg/analysis_server/test/src/plugin/test_all.dart
+++ b/pkg/analysis_server/test/src/plugin/test_all.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:test_reflective_loader/test_reflective_loader.dart';
 
 import 'notification_manager_test.dart' as notification_manager_test;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/add_diagnostic_property_reference_test.dart b/pkg/analysis_server/test/src/services/correction/assist/add_diagnostic_property_reference_test.dart
index 6a79a03..f9b684c 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/add_diagnostic_property_reference_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/add_diagnostic_property_reference_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/add_not_null_assert_test.dart b/pkg/analysis_server/test/src/services/correction/assist/add_not_null_assert_test.dart
index ac70f98..d100c48 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/add_not_null_assert_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/add_not_null_assert_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/add_return_type_test.dart b/pkg/analysis_server/test/src/services/correction/assist/add_return_type_test.dart
index 3224af1..c288dd0 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/add_return_type_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/add_return_type_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
index e897474..06724fb 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart b/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart
index 9630000..3fa857a 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart b/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart
index ae5b9a6..9dc4e9f 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/assist_processor.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:analysis_server/plugin/edit/assist/assist_core.dart';
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/assist_internal.dart';
@@ -23,11 +21,11 @@
 
 /// A base class defining support for writing assist processor tests.
 abstract class AssistProcessorTest extends AbstractSingleUnitTest {
-  int _offset;
-  int _length;
+  late int _offset;
+  late int _length;
 
-  SourceChange _change;
-  String _resultCode;
+  late SourceChange _change;
+  late String _resultCode;
 
   /// Return the kind of assist expected by this class.
   AssistKind get kind;
@@ -67,9 +65,8 @@
     super.addTestSource(code);
   }
 
-  void assertExitPosition({String before, String after}) {
-    var exitPosition = _change.selection;
-    expect(exitPosition, isNotNull);
+  void assertExitPosition({String? before, String? after}) {
+    var exitPosition = _change.selection!;
     expect(exitPosition.file, testFile);
     if (before != null) {
       expect(exitPosition.offset, _resultCode.indexOf(before));
@@ -88,7 +85,7 @@
   /// pairs of source code: the states of the code before and after the edits
   /// have been applied.
   Future<void> assertHasAssist(String expected,
-      {Map<String, List<String>> additionallyChangedFiles}) async {
+      {Map<String, List<String>>? additionallyChangedFiles}) async {
     if (useLineEndingsForPlatform) {
       expected = normalizeNewlinesForPlatform(expected);
       additionallyChangedFiles = additionallyChangedFiles?.map((key, value) =>
@@ -105,13 +102,14 @@
       expect(_resultCode, expected);
     } else {
       expect(fileEdits, hasLength(additionallyChangedFiles.length + 1));
-      _resultCode = SourceEdit.applySequence(
-          testCode, _change.getFileEdit(testFile).edits);
+      var fileEdit = _change.getFileEdit(testFile)!;
+      _resultCode = SourceEdit.applySequence(testCode, fileEdit.edits);
       expect(_resultCode, expected);
-      for (var filePath in additionallyChangedFiles.keys) {
-        var pair = additionallyChangedFiles[filePath];
-        var resultCode = SourceEdit.applySequence(
-            pair[0], _change.getFileEdit(filePath).edits);
+      for (var additionalEntry in additionallyChangedFiles.entries) {
+        var filePath = additionalEntry.key;
+        var pair = additionalEntry.value;
+        var fileEdit = _change.getFileEdit(filePath)!;
+        var resultCode = SourceEdit.applySequence(pair[0], fileEdit.edits);
         expect(resultCode, pair[1]);
       }
     }
@@ -137,7 +135,7 @@
   }
 
   void assertLinkedGroup(int groupIndex, List<String> expectedStrings,
-      [List<LinkedEditSuggestion> expectedSuggestions]) {
+      [List<LinkedEditSuggestion>? expectedSuggestions]) {
     var group = _change.linkedEditGroups[groupIndex];
     var expectedPositions = _findResultPositions(expectedStrings);
     expect(group.positions, unorderedEquals(expectedPositions));
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_class_to_mixin_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_class_to_mixin_test.dart
index 20b116b..9ccf27d 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_class_to_mixin_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_class_to_mixin_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_block_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_block_test.dart
index b7b2a62..9fe4f87 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_block_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_block_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_line_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_line_test.dart
index 660e128..92a8449 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_line_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_line_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart
index 353acef..0120636 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart
index 869228d..db04588 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart
index 612ddfb..6e8152d 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.dart
index 5e2aaba..345eda1 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_for_index_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_for_index_test.dart
index 6fc9393..d6aca70 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_for_index_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_for_index_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_generic_function_syntax_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_generic_function_syntax_test.dart
index 90c02e0..cb80726 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_generic_function_syntax_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_generic_function_syntax_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_getter_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_getter_test.dart
index d806251..ffc7664 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_getter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_getter_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_empty_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_empty_test.dart
index c34ba7e..ce777b0 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_empty_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_empty_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_test.dart
index e66f540..5a68942 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart
index e9f455e..4f99ef9 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart
index 16bd7b3..813e4bc 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_field_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_field_parameter_test.dart
index acb1577..f616eab 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_field_parameter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_field_parameter_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_for_element_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_for_element_test.dart
index e9b0024..80cd6c1 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_for_element_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_for_element_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_if_element_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_if_element_test.dart
index 274f6d4..b277e60 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_if_element_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_if_element_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_int_literal_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_int_literal_test.dart
index 7ebfdae..919ab32 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_int_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_int_literal_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_list_literal_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_list_literal_test.dart
index 68a565d..880a6f1 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_list_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_list_literal_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_map_literal_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_map_literal_test.dart
index f2d4e19..9b6b24b 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_map_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_map_literal_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart
index 1f3291a..1e52915 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_multiline_string_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_normal_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_normal_parameter_test.dart
index c26c19b..90973a6 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_normal_parameter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_normal_parameter_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_null_aware_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_null_aware_test.dart
index 67d578c..7d6b659 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_null_aware_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_null_aware_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart
index 417fdcc..1fe3d84 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_set_literal_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_set_literal_test.dart
index 20eeb8c..76079f7 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_set_literal_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_set_literal_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart
index 8515b73..4214de8 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_spread_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_spread_test.dart
index 22cf5e0..dc43575 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_spread_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_spread_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.dart b/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.dart
index f359ea9..5817ae2 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/exchange_operands_test.dart b/pkg/analysis_server/test/src/services/correction/assist/exchange_operands_test.dart
index 5ea4c1f..c5921f3 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/exchange_operands_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/exchange_operands_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.dart
index 6241079..1bac364 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
index 16088e8..426fa2b 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
index ecab131..3ed98b5 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
index e713017..905d316 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
index 0cd56e9..f6ed88f 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart
index 7462d46..d13bb22 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_surround_with_set_state_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.dart
index 2cd225e..babc107 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
index e9e36b5..197470b 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart
index 1c8ecdc..0cf2d15 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_builder_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
index d34de66..877ffb7 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
index 4b960dd..fc79cb7 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
index 62aca16..04702fa 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.dart
index 5bc12d6..e8df73f 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
index 6e4e119..685b2df 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
index fd16ea4..a9e6554 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart
index 8f7b42b..74c6918 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_sized_box_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
index abb6e96..4c32342 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart b/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart
index 66bf905..e00ee78 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/inline_invocation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/inline_invocation_test.dart
index 41352e8..23749ff 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/inline_invocation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/inline_invocation_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/introduce_local_cast_type_test.dart b/pkg/analysis_server/test/src/services/correction/assist/introduce_local_cast_type_test.dart
index 29f7c3e..784efb9 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/introduce_local_cast_type_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/introduce_local_cast_type_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart b/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart
index 503faef..b86a190 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart
index c4e4a9a..3c19528 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart
index 56a6a4a..a31c29e 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/join_variable_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/assist/join_variable_declaration_test.dart
index f22173d..8b885c8 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/join_variable_declaration_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/join_variable_declaration_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
index 62bfeca..a1efc00 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/replace_conditional_with_if_else_test.dart b/pkg/analysis_server/test/src/services/correction/assist/replace_conditional_with_if_else_test.dart
index 7be0adc..e5f1923 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/replace_conditional_with_if_else_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/replace_conditional_with_if_else_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart b/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart
index cbbf880..7641070 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/replace_with_var_test.dart b/pkg/analysis_server/test/src/services/correction/assist/replace_with_var_test.dart
index d0ab5ce..6ab4ad8 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/replace_with_var_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/replace_with_var_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/shadow_field_test.dart b/pkg/analysis_server/test/src/services/correction/assist/shadow_field_test.dart
index ba8a0e3..f13b966 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/shadow_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/shadow_field_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart b/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
index 96c39a9..b407482 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart b/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart
index 5845e92..2e96ea7 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
index c9e5eb4..255f6e5 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart
index 085fec0..54ef449 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart
index ff7ca9c..d6ad18f 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart
index ecd4297..6b7ca74 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart
index 3ae3580..ca39826 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart
index 6b77b2c..91ed08c 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart
index 823ec7a..3fa1377 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart
index 81a75c4..e6d5010 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart
index c989ffd..24eb591 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
index f39e638..1773afd 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/test_all.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:test_reflective_loader/test_reflective_loader.dart';
 
 import 'add_diagnostic_property_reference_test.dart' as add_diagnostic_property;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/use_curly_braces_test.dart b/pkg/analysis_server/test/src/services/correction/assist/use_curly_braces_test.dart
index df54292..93d28d6 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/use_curly_braces_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/use_curly_braces_test.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:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart
index 1cb910e..9deceb5 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart
@@ -482,6 +482,7 @@
   Transform _add(int index, {List<String> components, String extendedType}) =>
       Transform(
           title: 'title',
+          date: DateTime.now(),
           element: ElementDescriptor(
               libraryUris: [Uri.parse(importUri)],
               kind: ElementKindUtilities.fromName(_kind),
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
index bec1da6..3c72b70 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
@@ -1011,6 +1011,7 @@
           List<ParameterModification> modifications, {String newName}) =>
       Transform(
           title: 'title',
+          date: DateTime.now(),
           element: ElementDescriptor(
               libraryUris: [Uri.parse(importUri)],
               kind: ElementKindUtilities.fromName(_kind),
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_parameter_test.dart
index 856d4e0..e846a6a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_parameter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_parameter_test.dart
@@ -333,6 +333,7 @@
   Transform _rename(List<String> components, String oldName, String newName) =>
       Transform(
           title: 'title',
+          date: DateTime.now(),
           element: ElementDescriptor(
               libraryUris: [Uri.parse(importUri)],
               kind: ElementKindUtilities.fromName(_kind),
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart
index 0affe38..ecf0e66 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart
@@ -1235,6 +1235,7 @@
 
   Transform _rename(List<String> components, String newName) => Transform(
       title: 'title',
+      date: DateTime.now(),
       element: ElementDescriptor(
           libraryUris: [Uri.parse(importUri)],
           kind: ElementKindUtilities.fromName(_kind),
diff --git a/pkg/analyzer/lib/dart/analysis/utilities.dart b/pkg/analyzer/lib/dart/analysis/utilities.dart
index 28ff71b..801d224 100644
--- a/pkg/analyzer/lib/dart/analysis/utilities.dart
+++ b/pkg/analyzer/lib/dart/analysis/utilities.dart
@@ -88,11 +88,18 @@
     featureSet: scanner.featureSet,
   );
   var unit = parser.parseCompilationUnit(token);
-  unit.lineInfo = LineInfo(scanner.lineStarts);
+  var lineInfo = LineInfo(scanner.lineStarts);
+  unit.lineInfo = lineInfo;
   ParseStringResult result =
       ParseStringResultImpl(content, unit, errorCollector.errors);
   if (throwIfDiagnostics && result.errors.isNotEmpty) {
-    throw ArgumentError('Content produced diagnostics when parsed');
+    var buffer = StringBuffer();
+    for (var error in result.errors) {
+      var location = lineInfo.getLocation(error.offset);
+      buffer.writeln('  ${error.errorCode.name}: ${error.message} - '
+          '${location.lineNumber}:${location.columnNumber}');
+    }
+    throw ArgumentError('Content produced diagnostics when parsed:\n$buffer');
   }
   return result;
 }
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index d41438e..5d1ae27 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -66,8 +66,6 @@
   LateLowering.nonNullableInitializedNonFinalLocal,
   LateLowering.nullableInitializedFinalLocal,
   LateLowering.nonNullableInitializedFinalLocal,
-  LateLowering.uninitializedNonFinalStaticField,
-  LateLowering.uninitializedFinalStaticField,
   LateLowering.initializedNonFinalStaticField,
   LateLowering.initializedFinalStaticField,
   LateLowering.uninitializedNonFinalInstanceField,
diff --git a/pkg/compiler/lib/src/kernel/transformations/late_lowering.dart b/pkg/compiler/lib/src/kernel/transformations/late_lowering.dart
index cf5c62c..3d0d2e0 100644
--- a/pkg/compiler/lib/src/kernel/transformations/late_lowering.dart
+++ b/pkg/compiler/lib/src/kernel/transformations/late_lowering.dart
@@ -9,41 +9,114 @@
 bool _shouldLowerVariable(VariableDeclaration node) =>
     node.initializer == null && node.isLate;
 
+bool _shouldLowerField(Field node) =>
+    node.initializer == null && node.isStatic && node.isLate;
+
+class _Reader {
+  final Procedure _procedure;
+  final FunctionType _type;
+  FunctionType _typeWithoutTypeParameters;
+
+  _Reader(this._procedure) : _type = _procedure.getterType {
+    _typeWithoutTypeParameters = _type.withoutTypeParameters;
+  }
+}
+
 class LateLowering {
   final Class _cellClass;
   final Constructor _cellConstructor;
 
-  final Procedure _readLocal;
-  List<TypeParameter> _readLocalTypeParameters;
-  FunctionType _readLocalTypeWithoutTypeParameters;
+  final _Reader _readLocal;
+  final _Reader _readField;
 
   final Procedure _setValue;
   final Procedure _setFinalLocalValue;
+  final Procedure _setFinalFieldValue;
 
-  final Map<VariableDeclaration, VariableDeclaration> _cells = {};
+  // TODO(fishythefish): Remove cells when exiting their scope.
+  final Map<VariableDeclaration, VariableDeclaration> _variableCells = {};
+  final Map<Field, Field> _fieldCells = {};
 
   Member _contextMember;
 
   LateLowering(LibraryIndex index)
       : _cellClass = index.getClass('dart:_late_helper', '_Cell'),
         _cellConstructor = index.getMember('dart:_late_helper', '_Cell', ''),
-        _readLocal = index.getMember('dart:_late_helper', '_Cell', 'readLocal'),
+        _readLocal =
+            _Reader(index.getMember('dart:_late_helper', '_Cell', 'readLocal')),
+        _readField =
+            _Reader(index.getMember('dart:_late_helper', '_Cell', 'readField')),
         _setValue = index.getMember('dart:_late_helper', '_Cell', 'set:value'),
         _setFinalLocalValue = index.getMember(
-            'dart:_late_helper', '_Cell', 'set:finalLocalValue') {
-    FunctionType _readLocalType = _readLocal.getterType;
-    _readLocalTypeParameters = _readLocalType.typeParameters;
-    _readLocalTypeWithoutTypeParameters = _readLocalType.withoutTypeParameters;
+            'dart:_late_helper', '_Cell', 'set:finalLocalValue'),
+        _setFinalFieldValue = index.getMember(
+            'dart:_late_helper', '_Cell', 'set:finalFieldValue');
+
+  void transformAdditionalExports(Library node) {
+    List<Reference> additionalExports = node.additionalExports;
+    Set<Reference> newExports = {};
+    additionalExports.removeWhere((Reference reference) {
+      Field cell = _fieldCells[reference.node];
+      if (cell == null) return false;
+      newExports.add(cell.getterReference);
+      return true;
+    });
+    additionalExports.addAll(newExports);
   }
 
+  ConstructorInvocation _callCellConstructor(int fileOffset) =>
+      ConstructorInvocation(
+          _cellConstructor, Arguments.empty()..fileOffset = fileOffset)
+        ..fileOffset = fileOffset;
+
+  InstanceInvocation _callReader(
+      _Reader reader, Expression receiver, DartType type, int fileOffset) {
+    Procedure procedure = reader._procedure;
+    List<DartType> typeArguments = [type];
+    return InstanceInvocation(
+        InstanceAccessKind.Instance,
+        receiver,
+        procedure.name,
+        Arguments(const [], types: typeArguments)..fileOffset = fileOffset,
+        interfaceTarget: procedure,
+        functionType:
+            Substitution.fromPairs(reader._type.typeParameters, typeArguments)
+                .substituteType(reader._typeWithoutTypeParameters))
+      ..fileOffset = fileOffset;
+  }
+
+  InstanceInvocation _callReadLocal(
+          Expression receiver, DartType type, int fileOffset) =>
+      _callReader(_readLocal, receiver, type, fileOffset);
+
+  InstanceInvocation _callReadField(
+          Expression receiver, DartType type, int fileOffset) =>
+      _callReader(_readField, receiver, type, fileOffset);
+
+  InstanceSet _callSetter(Procedure _setter, Expression receiver,
+          Expression value, int fileOffset) =>
+      InstanceSet(InstanceAccessKind.Instance, receiver, _setter.name, value,
+          interfaceTarget: _setter)
+        ..fileOffset = fileOffset;
+
+  InstanceSet _callSetValue(
+          Expression receiver, Expression value, int fileOffset) =>
+      _callSetter(_setValue, receiver, value, fileOffset);
+
+  InstanceSet _callSetFinalLocalValue(
+          Expression receiver, Expression value, int fileOffset) =>
+      _callSetter(_setFinalLocalValue, receiver, value, fileOffset);
+
+  InstanceSet _callSetFinalFieldValue(
+          Expression receiver, Expression value, int fileOffset) =>
+      _callSetter(_setFinalFieldValue, receiver, value, fileOffset);
+
   VariableDeclaration _variableCell(VariableDeclaration variable) {
     assert(_shouldLowerVariable(variable));
-    return _cells.putIfAbsent(variable, () {
+    return _variableCells.putIfAbsent(variable, () {
       int fileOffset = variable.fileOffset;
       return VariableDeclaration(variable.name,
-          initializer:
-              ConstructorInvocation(_cellConstructor, Arguments.empty())
-                ..fileOffset = fileOffset,
+          initializer: _callCellConstructor(fileOffset),
           type: InterfaceType(
               _cellClass, _contextMember.enclosingLibrary.nonNullable),
           isFinal: true)
@@ -76,17 +149,7 @@
 
     int fileOffset = node.fileOffset;
     VariableGet cell = _variableCellAccess(variable, fileOffset);
-    List<DartType> typeArguments = [node.promotedType ?? variable.type];
-    return InstanceInvocation(
-        InstanceAccessKind.Instance,
-        cell,
-        _readLocal.name,
-        Arguments(const [], types: typeArguments)..fileOffset = fileOffset,
-        interfaceTarget: _readLocal,
-        functionType:
-            Substitution.fromPairs(_readLocalTypeParameters, typeArguments)
-                .substituteType(_readLocalTypeWithoutTypeParameters))
-      ..fileOffset = fileOffset;
+    return _callReadLocal(cell, node.promotedType ?? variable.type, fileOffset);
   }
 
   TreeNode transformVariableSet(VariableSet node, Member contextMember) {
@@ -97,16 +160,64 @@
 
     int fileOffset = node.fileOffset;
     VariableGet cell = _variableCellAccess(variable, fileOffset);
-    if (variable.isFinal) {
-      return InstanceSet(InstanceAccessKind.Instance, cell,
-          _setFinalLocalValue.name, node.value,
-          interfaceTarget: _setFinalLocalValue)
-        ..fileOffset = fileOffset;
+    return variable.isFinal
+        ? _callSetFinalLocalValue(cell, node.value, fileOffset)
+        : _callSetValue(cell, node.value, fileOffset);
+  }
+
+  Field _fieldCell(Field field) {
+    assert(_shouldLowerField(field));
+    return _fieldCells.putIfAbsent(field, () {
+      int fileOffset = field.fileOffset;
+      field.getterReference.canonicalName?.unbind();
+      field.setterReference?.canonicalName?.unbind();
+      return Field.immutable(field.name,
+          type: InterfaceType(_cellClass, field.enclosingLibrary.nonNullable),
+          initializer: _callCellConstructor(fileOffset),
+          isFinal: true,
+          isStatic: true,
+          fileUri: field.fileUri)
+        ..fileOffset = fileOffset
+        ..isNonNullableByDefault = true;
+    });
+  }
+
+  StaticGet _fieldCellAccess(Field field, int fileOffset) =>
+      StaticGet(_fieldCell(field))..fileOffset = fileOffset;
+
+  TreeNode transformField(Field node, Member contextMember) {
+    _contextMember = contextMember;
+
+    if (!_shouldLowerField(node)) return node;
+
+    return _fieldCell(node);
+  }
+
+  TreeNode transformStaticGet(StaticGet node, Member contextMember) {
+    _contextMember = contextMember;
+
+    Member target = node.target;
+    if (target is Field && _shouldLowerField(target)) {
+      int fileOffset = node.fileOffset;
+      StaticGet cell = _fieldCellAccess(target, fileOffset);
+      return _callReadField(cell, target.type, fileOffset);
     } else {
-      return InstanceSet(
-          InstanceAccessKind.Instance, cell, _setValue.name, node.value,
-          interfaceTarget: _setValue)
-        ..fileOffset = fileOffset;
+      return node;
+    }
+  }
+
+  TreeNode transformStaticSet(StaticSet node, Member contextMember) {
+    _contextMember = contextMember;
+
+    Member target = node.target;
+    if (target is Field && _shouldLowerField(target)) {
+      int fileOffset = node.fileOffset;
+      StaticGet cell = _fieldCellAccess(target, fileOffset);
+      return target.isFinal
+          ? _callSetFinalFieldValue(cell, node.value, fileOffset)
+          : _callSetValue(cell, node.value, fileOffset);
+    } else {
+      return node;
     }
   }
 }
diff --git a/pkg/compiler/lib/src/kernel/transformations/lowering.dart b/pkg/compiler/lib/src/kernel/transformations/lowering.dart
index 915c5fb..ccc4d7e 100644
--- a/pkg/compiler/lib/src/kernel/transformations/lowering.dart
+++ b/pkg/compiler/lib/src/kernel/transformations/lowering.dart
@@ -17,6 +17,12 @@
     List<Library> libraries, CoreTypes coreTypes, ClassHierarchy hierarchy) {
   final transformer = _Lowering(coreTypes, hierarchy);
   libraries.forEach(transformer.visitLibrary);
+
+  // Do a second pass to remove/replace now-unused nodes.
+
+  // Since the transformer API doesn't visit `Library.additionalExports`, we
+  // have to manually replace references to transformed nodes.
+  libraries.forEach(transformer.transformAdditionalExports);
 }
 
 class _Lowering extends Transformer {
@@ -29,6 +35,10 @@
       : factorySpecializer = FactorySpecializer(coreTypes, hierarchy),
         _lateLowering = LateLowering(coreTypes.index);
 
+  void transformAdditionalExports(Library node) {
+    _lateLowering.transformAdditionalExports(node);
+  }
+
   @override
   TreeNode defaultMember(Member node) {
     _currentMember = node;
@@ -58,4 +68,22 @@
     node.transformChildren(this);
     return _lateLowering.transformVariableSet(node, _currentMember);
   }
+
+  @override
+  TreeNode visitField(Field node) {
+    node.transformChildren(this);
+    return _lateLowering.transformField(node, _currentMember);
+  }
+
+  @override
+  TreeNode visitStaticGet(StaticGet node) {
+    node.transformChildren(this);
+    return _lateLowering.transformStaticGet(node, _currentMember);
+  }
+
+  @override
+  TreeNode visitStaticSet(StaticSet node) {
+    node.transformChildren(this);
+    return _lateLowering.transformStaticSet(node, _currentMember);
+  }
 }
diff --git a/pkg/front_end/testcases/dart2js/late_statics.dart b/pkg/front_end/testcases/dart2js/late_statics.dart
index 1030ef4..4abe4c5 100644
--- a/pkg/front_end/testcases/dart2js/late_statics.dart
+++ b/pkg/front_end/testcases/dart2js/late_statics.dart
@@ -2,11 +2,18 @@
 // 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.
 
+import 'late_statics_lib.dart' as lib;
+export 'late_statics_lib.dart';
+
 void main() {
   testUninitializedNonFinalStaticField();
   testUninitializedFinalStaticField();
   testInitializedNonFinalStaticField();
   testInitializedFinalStaticField();
+  testUninitializedNonFinalTopLevelField();
+  testUninitializedFinalTopLevelField();
+  testInitializedNonFinalTopLevelField();
+  testInitializedFinalTopLevelField();
 }
 
 class Statics {
@@ -37,3 +44,25 @@
 void testInitializedFinalStaticField() {
   print(Statics.d);
 }
+
+void testUninitializedNonFinalTopLevelField() {
+  print(lib.a);
+  lib.a = 42;
+  print(lib.a);
+}
+
+void testUninitializedFinalTopLevelField() {
+  print(lib.b);
+  lib.b = 42;
+  print(lib.b);
+}
+
+void testInitializedNonFinalTopLevelField() {
+  print(lib.c);
+  lib.c = 42;
+  print(lib.c);
+}
+
+void testInitializedFinalTopLevelField() {
+  print(lib.d);
+}
diff --git a/pkg/front_end/testcases/dart2js/late_statics.dart.strong.expect b/pkg/front_end/testcases/dart2js/late_statics.dart.strong.expect
index f41ebf9..0a73391 100644
--- a/pkg/front_end/testcases/dart2js/late_statics.dart.strong.expect
+++ b/pkg/front_end/testcases/dart2js/late_statics.dart.strong.expect
@@ -2,38 +2,42 @@
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
+import "late_statics_lib.dart" as lat;
+additionalExports = (lat::a,
+  lat::a,
+  lat::b,
+  lat::b,
+  lat::c,
+  lat::c,
+  lat::d)
+
+import "org-dartlang-testcase:///late_statics_lib.dart" as lib;
+export "org-dartlang-testcase:///late_statics_lib.dart";
 
 class Statics extends core::Object {
-  static field core::int? _#a = null;
-  static field core::int? _#b = null;
+  late static field core::int a;
+  late static final [setter] field core::int b;
   static field core::int? _#c = null;
   static field core::int? _#d = null;
   synthetic constructor •() → self::Statics
     : super core::Object::•()
     ;
-  static get a() → core::int
-    return let final core::int? #t1 = self::Statics::_#a in #t1 == null ?{core::int} throw new _in::LateError::fieldNI("a") : #t1{core::int};
-  static set a(core::int #t2) → void
-    self::Statics::_#a = #t2;
-  static get b() → core::int
-    return let final core::int? #t3 = self::Statics::_#b in #t3 == null ?{core::int} throw new _in::LateError::fieldNI("b") : #t3{core::int};
-  static set b(core::int #t4) → void
-    if(self::Statics::_#b == null)
-      self::Statics::_#b = #t4;
-    else
-      throw new _in::LateError::fieldAI("b");
   static get c() → core::int
-    return let final core::int? #t5 = self::Statics::_#c in #t5 == null ?{core::int} self::Statics::_#c = 1.{core::int::unary-}(){() → core::int} : #t5{core::int};
-  static set c(core::int #t6) → void
-    self::Statics::_#c = #t6;
+    return let final core::int? #t1 = self::Statics::_#c in #t1 == null ?{core::int} self::Statics::_#c = 1.{core::int::unary-}(){() → core::int} : #t1{core::int};
+  static set c(core::int #t2) → void
+    self::Statics::_#c = #t2;
   static get d() → core::int
-    return let final core::int? #t7 = self::Statics::_#d in #t7 == null ?{core::int} let final core::int #t8 = 1.{core::int::unary-}(){() → core::int} in self::Statics::_#d == null ?{core::int} self::Statics::_#d = #t8 : throw new _in::LateError::fieldADI("d") : #t7{core::int};
+    return let final core::int? #t3 = self::Statics::_#d in #t3 == null ?{core::int} let final core::int #t4 = 1.{core::int::unary-}(){() → core::int} in self::Statics::_#d == null ?{core::int} self::Statics::_#d = #t4 : throw new _in::LateError::fieldADI("d") : #t3{core::int};
 }
 static method main() → void {
   self::testUninitializedNonFinalStaticField();
   self::testUninitializedFinalStaticField();
   self::testInitializedNonFinalStaticField();
   self::testInitializedFinalStaticField();
+  self::testUninitializedNonFinalTopLevelField();
+  self::testUninitializedFinalTopLevelField();
+  self::testInitializedNonFinalTopLevelField();
+  self::testInitializedFinalTopLevelField();
 }
 static method testUninitializedNonFinalStaticField() → void {
   core::print(self::Statics::a);
@@ -53,3 +57,37 @@
 static method testInitializedFinalStaticField() → void {
   core::print(self::Statics::d);
 }
+static method testUninitializedNonFinalTopLevelField() → void {
+  core::print(lat::a);
+  lat::a = 42;
+  core::print(lat::a);
+}
+static method testUninitializedFinalTopLevelField() → void {
+  core::print(lat::b);
+  lat::b = 42;
+  core::print(lat::b);
+}
+static method testInitializedNonFinalTopLevelField() → void {
+  core::print(lat::c);
+  lat::c = 42;
+  core::print(lat::c);
+}
+static method testInitializedFinalTopLevelField() → void {
+  core::print(lat::d);
+}
+
+library /*isNonNullableByDefault*/;
+import self as lat;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+late static field core::int a;
+late static final [setter] field core::int b;
+static field core::int? _#c = null;
+static field core::int? _#d = null;
+static get c() → core::int
+  return let final core::int? #t5 = lat::_#c in #t5 == null ?{core::int} lat::_#c = 1.{core::int::unary-}(){() → core::int} : #t5{core::int};
+static set c(core::int #t6) → void
+  lat::_#c = #t6;
+static get d() → core::int
+  return let final core::int? #t7 = lat::_#d in #t7 == null ?{core::int} let final core::int #t8 = 1.{core::int::unary-}(){() → core::int} in lat::_#d == null ?{core::int} lat::_#d = #t8 : throw new _in::LateError::fieldADI("d") : #t7{core::int};
diff --git a/pkg/front_end/testcases/dart2js/late_statics.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/late_statics.dart.strong.transformed.expect
index 1a4e13b..f251c18 100644
--- a/pkg/front_end/testcases/dart2js/late_statics.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/late_statics.dart.strong.transformed.expect
@@ -2,48 +2,51 @@
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
+import "dart:_late_helper" as _la;
+import "late_statics_lib.dart" as lat;
+additionalExports = (lat::c,
+  lat::c,
+  lat::d,
+  lat::a,
+  lat::b)
+
+import "org-dartlang-testcase:///late_statics_lib.dart" as lib;
+export "org-dartlang-testcase:///late_statics_lib.dart";
 
 class Statics extends core::Object {
-  static field core::int? _#a = null;
-  static field core::int? _#b = null;
+  static final field _la::_Cell a = new _la::_Cell::•();
+  static final field _la::_Cell b = new _la::_Cell::•();
   static field core::int? _#c = null;
   static field core::int? _#d = null;
   synthetic constructor •() → self::Statics
     : super core::Object::•()
     ;
-  static get a() → core::int
-    return let final core::int? #t1 = self::Statics::_#a in #t1 == null ?{core::int} throw new _in::LateError::fieldNI("a") : #t1{core::int};
-  static set a(core::int #t2) → void
-    self::Statics::_#a = #t2;
-  static get b() → core::int
-    return let final core::int? #t3 = self::Statics::_#b in #t3 == null ?{core::int} throw new _in::LateError::fieldNI("b") : #t3{core::int};
-  static set b(core::int #t4) → void
-    if(self::Statics::_#b == null)
-      self::Statics::_#b = #t4;
-    else
-      throw new _in::LateError::fieldAI("b");
   static get c() → core::int
-    return let final core::int? #t5 = self::Statics::_#c in #t5 == null ?{core::int} self::Statics::_#c = 1.{core::int::unary-}(){() → core::int} : #t5{core::int};
-  static set c(core::int #t6) → void
-    self::Statics::_#c = #t6;
+    return let final core::int? #t1 = self::Statics::_#c in #t1 == null ?{core::int} self::Statics::_#c = 1.{core::int::unary-}(){() → core::int} : #t1{core::int};
+  static set c(core::int #t2) → void
+    self::Statics::_#c = #t2;
   static get d() → core::int
-    return let final core::int? #t7 = self::Statics::_#d in #t7 == null ?{core::int} let final core::int #t8 = 1.{core::int::unary-}(){() → core::int} in self::Statics::_#d == null ?{core::int} self::Statics::_#d = #t8 : throw new _in::LateError::fieldADI("d") : #t7{core::int};
+    return let final core::int? #t3 = self::Statics::_#d in #t3 == null ?{core::int} let final core::int #t4 = 1.{core::int::unary-}(){() → core::int} in self::Statics::_#d == null ?{core::int} self::Statics::_#d = #t4 : throw new _in::LateError::fieldADI("d") : #t3{core::int};
 }
 static method main() → void {
   self::testUninitializedNonFinalStaticField();
   self::testUninitializedFinalStaticField();
   self::testInitializedNonFinalStaticField();
   self::testInitializedFinalStaticField();
+  self::testUninitializedNonFinalTopLevelField();
+  self::testUninitializedFinalTopLevelField();
+  self::testInitializedNonFinalTopLevelField();
+  self::testInitializedFinalTopLevelField();
 }
 static method testUninitializedNonFinalStaticField() → void {
-  core::print(self::Statics::a);
-  self::Statics::a = 42;
-  core::print(self::Statics::a);
+  core::print(self::Statics::a.{_la::_Cell::readField}<core::int>(){() → core::int});
+  self::Statics::a.{_la::_Cell::value} = 42;
+  core::print(self::Statics::a.{_la::_Cell::readField}<core::int>(){() → core::int});
 }
 static method testUninitializedFinalStaticField() → void {
-  core::print(self::Statics::b);
-  self::Statics::b = 42;
-  core::print(self::Statics::b);
+  core::print(self::Statics::b.{_la::_Cell::readField}<core::int>(){() → core::int});
+  self::Statics::b.{_la::_Cell::finalFieldValue} = 42;
+  core::print(self::Statics::b.{_la::_Cell::readField}<core::int>(){() → core::int});
 }
 static method testInitializedNonFinalStaticField() → void {
   core::print(self::Statics::c);
@@ -53,10 +56,48 @@
 static method testInitializedFinalStaticField() → void {
   core::print(self::Statics::d);
 }
+static method testUninitializedNonFinalTopLevelField() → void {
+  core::print(lat::a.{_la::_Cell::readField}<core::int>(){() → core::int});
+  lat::a.{_la::_Cell::value} = 42;
+  core::print(lat::a.{_la::_Cell::readField}<core::int>(){() → core::int});
+}
+static method testUninitializedFinalTopLevelField() → void {
+  core::print(lat::b.{_la::_Cell::readField}<core::int>(){() → core::int});
+  lat::b.{_la::_Cell::finalFieldValue} = 42;
+  core::print(lat::b.{_la::_Cell::readField}<core::int>(){() → core::int});
+}
+static method testInitializedNonFinalTopLevelField() → void {
+  core::print(lat::c);
+  lat::c = 42;
+  core::print(lat::c);
+}
+static method testInitializedFinalTopLevelField() → void {
+  core::print(lat::d);
+}
+
+library /*isNonNullableByDefault*/;
+import self as lat;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:_late_helper" as _la;
+
+static final field _la::_Cell a = new _la::_Cell::•();
+static final field _la::_Cell b = new _la::_Cell::•();
+static field core::int? _#c = null;
+static field core::int? _#d = null;
+static get c() → core::int
+  return let final core::int? #t5 = lat::_#c in #t5 == null ?{core::int} lat::_#c = 1.{core::int::unary-}(){() → core::int} : #t5{core::int};
+static set c(core::int #t6) → void
+  lat::_#c = #t6;
+static get d() → core::int
+  return let final core::int? #t7 = lat::_#d in #t7 == null ?{core::int} let final core::int #t8 = 1.{core::int::unary-}(){() → core::int} in lat::_#d == null ?{core::int} lat::_#d = #t8 : throw new _in::LateError::fieldADI("d") : #t7{core::int};
 
 
 Extra constant evaluation status:
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics.dart:15:23 -> DoubleConstant(-1.0)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics.dart:16:29 -> DoubleConstant(-1.0)
-Evaluated: VariableGet @ org-dartlang-testcase:///late_statics.dart:16:25 -> DoubleConstant(-1.0)
-Extra constant evaluation: evaluated: 70, effectively constant: 3
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics.dart:22:23 -> DoubleConstant(-1.0)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics.dart:23:29 -> DoubleConstant(-1.0)
+Evaluated: VariableGet @ org-dartlang-testcase:///late_statics.dart:23:25 -> DoubleConstant(-1.0)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics_lib.dart:7:14 -> DoubleConstant(-1.0)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics_lib.dart:8:20 -> DoubleConstant(-1.0)
+Evaluated: VariableGet @ org-dartlang-testcase:///late_statics_lib.dart:8:16 -> DoubleConstant(-1.0)
+Extra constant evaluation: evaluated: 108, effectively constant: 6
diff --git a/pkg/front_end/testcases/dart2js/late_statics.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/late_statics.dart.textual_outline.expect
index c9f0b3d..37ed746 100644
--- a/pkg/front_end/testcases/dart2js/late_statics.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/dart2js/late_statics.dart.textual_outline.expect
@@ -1,3 +1,5 @@
+import 'late_statics_lib.dart' as lib;
+export 'late_statics_lib.dart';
 void main() {}
 class Statics {
   static late int ;
@@ -13,3 +15,7 @@
 void testUninitializedFinalStaticField() {}
 void testInitializedNonFinalStaticField() {}
 void testInitializedFinalStaticField() {}
+void testUninitializedNonFinalTopLevelField() {}
+void testUninitializedFinalTopLevelField() {}
+void testInitializedNonFinalTopLevelField() {}
+void testInitializedFinalTopLevelField() {}
diff --git a/pkg/front_end/testcases/dart2js/late_statics.dart.weak.expect b/pkg/front_end/testcases/dart2js/late_statics.dart.weak.expect
index fb7425e..c53c058 100644
--- a/pkg/front_end/testcases/dart2js/late_statics.dart.weak.expect
+++ b/pkg/front_end/testcases/dart2js/late_statics.dart.weak.expect
@@ -2,38 +2,42 @@
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
+import "late_statics_lib.dart" as lat;
+additionalExports = (lat::a,
+  lat::a,
+  lat::b,
+  lat::b,
+  lat::c,
+  lat::c,
+  lat::d)
+
+import "org-dartlang-testcase:///late_statics_lib.dart" as lib;
+export "org-dartlang-testcase:///late_statics_lib.dart";
 
 class Statics extends core::Object {
-  static field core::int? _#a = _in::createSentinel<core::int>();
-  static field core::int? _#b = _in::createSentinel<core::int>();
+  late static field core::int a;
+  late static final [setter] field core::int b;
   static field core::int? _#c = _in::createSentinel<core::int>();
   static field core::int? _#d = _in::createSentinel<core::int>();
   synthetic constructor •() → self::Statics
     : super core::Object::•()
     ;
-  static get a() → core::int
-    return let final core::int? #t1 = self::Statics::_#a in _in::isSentinel(#t1) ?{core::int} throw new _in::LateError::fieldNI("a") : #t1{core::int};
-  static set a(core::int #t2) → void
-    self::Statics::_#a = #t2;
-  static get b() → core::int
-    return let final core::int? #t3 = self::Statics::_#b in _in::isSentinel(#t3) ?{core::int} throw new _in::LateError::fieldNI("b") : #t3{core::int};
-  static set b(core::int #t4) → void
-    if(_in::isSentinel(self::Statics::_#b))
-      self::Statics::_#b = #t4;
-    else
-      throw new _in::LateError::fieldAI("b");
   static get c() → core::int
-    return let final core::int? #t5 = self::Statics::_#c in _in::isSentinel(#t5) ?{core::int} self::Statics::_#c = 1.{core::int::unary-}(){() → core::int} : #t5{core::int};
-  static set c(core::int #t6) → void
-    self::Statics::_#c = #t6;
+    return let final core::int? #t1 = self::Statics::_#c in _in::isSentinel(#t1) ?{core::int} self::Statics::_#c = 1.{core::int::unary-}(){() → core::int} : #t1{core::int};
+  static set c(core::int #t2) → void
+    self::Statics::_#c = #t2;
   static get d() → core::int
-    return let final core::int #t7 = self::Statics::_#d in _in::isSentinel(#t7) ?{core::int} let final core::int #t8 = 1.{core::int::unary-}(){() → core::int} in _in::isSentinel(self::Statics::_#d) ?{core::int} self::Statics::_#d = #t8 : throw new _in::LateError::fieldADI("d") : #t7;
+    return let final core::int #t3 = self::Statics::_#d in _in::isSentinel(#t3) ?{core::int} let final core::int #t4 = 1.{core::int::unary-}(){() → core::int} in _in::isSentinel(self::Statics::_#d) ?{core::int} self::Statics::_#d = #t4 : throw new _in::LateError::fieldADI("d") : #t3;
 }
 static method main() → void {
   self::testUninitializedNonFinalStaticField();
   self::testUninitializedFinalStaticField();
   self::testInitializedNonFinalStaticField();
   self::testInitializedFinalStaticField();
+  self::testUninitializedNonFinalTopLevelField();
+  self::testUninitializedFinalTopLevelField();
+  self::testInitializedNonFinalTopLevelField();
+  self::testInitializedFinalTopLevelField();
 }
 static method testUninitializedNonFinalStaticField() → void {
   core::print(self::Statics::a);
@@ -53,3 +57,37 @@
 static method testInitializedFinalStaticField() → void {
   core::print(self::Statics::d);
 }
+static method testUninitializedNonFinalTopLevelField() → void {
+  core::print(lat::a);
+  lat::a = 42;
+  core::print(lat::a);
+}
+static method testUninitializedFinalTopLevelField() → void {
+  core::print(lat::b);
+  lat::b = 42;
+  core::print(lat::b);
+}
+static method testInitializedNonFinalTopLevelField() → void {
+  core::print(lat::c);
+  lat::c = 42;
+  core::print(lat::c);
+}
+static method testInitializedFinalTopLevelField() → void {
+  core::print(lat::d);
+}
+
+library /*isNonNullableByDefault*/;
+import self as lat;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+late static field core::int a;
+late static final [setter] field core::int b;
+static field core::int? _#c = _in::createSentinel<core::int>();
+static field core::int? _#d = _in::createSentinel<core::int>();
+static get c() → core::int
+  return let final core::int? #t5 = lat::_#c in _in::isSentinel(#t5) ?{core::int} lat::_#c = 1.{core::int::unary-}(){() → core::int} : #t5{core::int};
+static set c(core::int #t6) → void
+  lat::_#c = #t6;
+static get d() → core::int
+  return let final core::int #t7 = lat::_#d in _in::isSentinel(#t7) ?{core::int} let final core::int #t8 = 1.{core::int::unary-}(){() → core::int} in _in::isSentinel(lat::_#d) ?{core::int} lat::_#d = #t8 : throw new _in::LateError::fieldADI("d") : #t7;
diff --git a/pkg/front_end/testcases/dart2js/late_statics.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/late_statics.dart.weak.outline.expect
index 7f9136d..21ef816 100644
--- a/pkg/front_end/testcases/dart2js/late_statics.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/dart2js/late_statics.dart.weak.outline.expect
@@ -1,20 +1,27 @@
 library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:core" as core;
+import "late_statics_lib.dart" as lat;
+additionalExports = (lat::a,
+  lat::a,
+  lat::b,
+  lat::b,
+  lat::c,
+  lat::c,
+  lat::d)
+
+import "org-dartlang-testcase:///late_statics_lib.dart" as lib;
+export "org-dartlang-testcase:///late_statics_lib.dart";
 
 class Statics extends core::Object {
-  static field core::int? _#a;
-  static field core::int? _#b;
+  late static field core::int a;
+  late static final [setter] field core::int b;
   static field core::int? _#c;
   static field core::int? _#d;
   synthetic constructor •() → self::Statics
     ;
-  static get a() → core::int;
-  static set a(core::int #t1) → void;
-  static get b() → core::int;
-  static set b(core::int #t2) → void;
   static get c() → core::int;
-  static set c(core::int #t3) → void;
+  static set c(core::int #t1) → void;
   static get d() → core::int;
 }
 static method main() → void
@@ -27,3 +34,23 @@
   ;
 static method testInitializedFinalStaticField() → void
   ;
+static method testUninitializedNonFinalTopLevelField() → void
+  ;
+static method testUninitializedFinalTopLevelField() → void
+  ;
+static method testInitializedNonFinalTopLevelField() → void
+  ;
+static method testInitializedFinalTopLevelField() → void
+  ;
+
+library /*isNonNullableByDefault*/;
+import self as lat;
+import "dart:core" as core;
+
+late static field core::int a;
+late static final [setter] field core::int b;
+static field core::int? _#c;
+static field core::int? _#d;
+static get c() → core::int;
+static set c(core::int #t2) → void;
+static get d() → core::int;
diff --git a/pkg/front_end/testcases/dart2js/late_statics.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/late_statics.dart.weak.transformed.expect
index 68a4534..3806163 100644
--- a/pkg/front_end/testcases/dart2js/late_statics.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/dart2js/late_statics.dart.weak.transformed.expect
@@ -2,48 +2,51 @@
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
+import "dart:_late_helper" as _la;
+import "late_statics_lib.dart" as lat;
+additionalExports = (lat::c,
+  lat::c,
+  lat::d,
+  lat::a,
+  lat::b)
+
+import "org-dartlang-testcase:///late_statics_lib.dart" as lib;
+export "org-dartlang-testcase:///late_statics_lib.dart";
 
 class Statics extends core::Object {
-  static field core::int? _#a = _in::createSentinel<core::int>();
-  static field core::int? _#b = _in::createSentinel<core::int>();
+  static final field _la::_Cell a = new _la::_Cell::•();
+  static final field _la::_Cell b = new _la::_Cell::•();
   static field core::int? _#c = _in::createSentinel<core::int>();
   static field core::int? _#d = _in::createSentinel<core::int>();
   synthetic constructor •() → self::Statics
     : super core::Object::•()
     ;
-  static get a() → core::int
-    return let final core::int? #t1 = self::Statics::_#a in _in::isSentinel(#t1) ?{core::int} throw new _in::LateError::fieldNI("a") : #t1{core::int};
-  static set a(core::int #t2) → void
-    self::Statics::_#a = #t2;
-  static get b() → core::int
-    return let final core::int? #t3 = self::Statics::_#b in _in::isSentinel(#t3) ?{core::int} throw new _in::LateError::fieldNI("b") : #t3{core::int};
-  static set b(core::int #t4) → void
-    if(_in::isSentinel(self::Statics::_#b))
-      self::Statics::_#b = #t4;
-    else
-      throw new _in::LateError::fieldAI("b");
   static get c() → core::int
-    return let final core::int? #t5 = self::Statics::_#c in _in::isSentinel(#t5) ?{core::int} self::Statics::_#c = 1.{core::int::unary-}(){() → core::int} : #t5{core::int};
-  static set c(core::int #t6) → void
-    self::Statics::_#c = #t6;
+    return let final core::int? #t1 = self::Statics::_#c in _in::isSentinel(#t1) ?{core::int} self::Statics::_#c = 1.{core::int::unary-}(){() → core::int} : #t1{core::int};
+  static set c(core::int #t2) → void
+    self::Statics::_#c = #t2;
   static get d() → core::int
-    return let final core::int #t7 = self::Statics::_#d in _in::isSentinel(#t7) ?{core::int} let final core::int #t8 = 1.{core::int::unary-}(){() → core::int} in _in::isSentinel(self::Statics::_#d) ?{core::int} self::Statics::_#d = #t8 : throw new _in::LateError::fieldADI("d") : #t7;
+    return let final core::int #t3 = self::Statics::_#d in _in::isSentinel(#t3) ?{core::int} let final core::int #t4 = 1.{core::int::unary-}(){() → core::int} in _in::isSentinel(self::Statics::_#d) ?{core::int} self::Statics::_#d = #t4 : throw new _in::LateError::fieldADI("d") : #t3;
 }
 static method main() → void {
   self::testUninitializedNonFinalStaticField();
   self::testUninitializedFinalStaticField();
   self::testInitializedNonFinalStaticField();
   self::testInitializedFinalStaticField();
+  self::testUninitializedNonFinalTopLevelField();
+  self::testUninitializedFinalTopLevelField();
+  self::testInitializedNonFinalTopLevelField();
+  self::testInitializedFinalTopLevelField();
 }
 static method testUninitializedNonFinalStaticField() → void {
-  core::print(self::Statics::a);
-  self::Statics::a = 42;
-  core::print(self::Statics::a);
+  core::print(self::Statics::a.{_la::_Cell::readField}<core::int>(){() → core::int});
+  self::Statics::a.{_la::_Cell::value} = 42;
+  core::print(self::Statics::a.{_la::_Cell::readField}<core::int>(){() → core::int});
 }
 static method testUninitializedFinalStaticField() → void {
-  core::print(self::Statics::b);
-  self::Statics::b = 42;
-  core::print(self::Statics::b);
+  core::print(self::Statics::b.{_la::_Cell::readField}<core::int>(){() → core::int});
+  self::Statics::b.{_la::_Cell::finalFieldValue} = 42;
+  core::print(self::Statics::b.{_la::_Cell::readField}<core::int>(){() → core::int});
 }
 static method testInitializedNonFinalStaticField() → void {
   core::print(self::Statics::c);
@@ -53,10 +56,48 @@
 static method testInitializedFinalStaticField() → void {
   core::print(self::Statics::d);
 }
+static method testUninitializedNonFinalTopLevelField() → void {
+  core::print(lat::a.{_la::_Cell::readField}<core::int>(){() → core::int});
+  lat::a.{_la::_Cell::value} = 42;
+  core::print(lat::a.{_la::_Cell::readField}<core::int>(){() → core::int});
+}
+static method testUninitializedFinalTopLevelField() → void {
+  core::print(lat::b.{_la::_Cell::readField}<core::int>(){() → core::int});
+  lat::b.{_la::_Cell::finalFieldValue} = 42;
+  core::print(lat::b.{_la::_Cell::readField}<core::int>(){() → core::int});
+}
+static method testInitializedNonFinalTopLevelField() → void {
+  core::print(lat::c);
+  lat::c = 42;
+  core::print(lat::c);
+}
+static method testInitializedFinalTopLevelField() → void {
+  core::print(lat::d);
+}
+
+library /*isNonNullableByDefault*/;
+import self as lat;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:_late_helper" as _la;
+
+static final field _la::_Cell a = new _la::_Cell::•();
+static final field _la::_Cell b = new _la::_Cell::•();
+static field core::int? _#c = _in::createSentinel<core::int>();
+static field core::int? _#d = _in::createSentinel<core::int>();
+static get c() → core::int
+  return let final core::int? #t5 = lat::_#c in _in::isSentinel(#t5) ?{core::int} lat::_#c = 1.{core::int::unary-}(){() → core::int} : #t5{core::int};
+static set c(core::int #t6) → void
+  lat::_#c = #t6;
+static get d() → core::int
+  return let final core::int #t7 = lat::_#d in _in::isSentinel(#t7) ?{core::int} let final core::int #t8 = 1.{core::int::unary-}(){() → core::int} in _in::isSentinel(lat::_#d) ?{core::int} lat::_#d = #t8 : throw new _in::LateError::fieldADI("d") : #t7;
 
 
 Extra constant evaluation status:
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics.dart:15:23 -> DoubleConstant(-1.0)
-Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics.dart:16:29 -> DoubleConstant(-1.0)
-Evaluated: VariableGet @ org-dartlang-testcase:///late_statics.dart:16:25 -> DoubleConstant(-1.0)
-Extra constant evaluation: evaluated: 74, effectively constant: 3
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics.dart:22:23 -> DoubleConstant(-1.0)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics.dart:23:29 -> DoubleConstant(-1.0)
+Evaluated: VariableGet @ org-dartlang-testcase:///late_statics.dart:23:25 -> DoubleConstant(-1.0)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics_lib.dart:7:14 -> DoubleConstant(-1.0)
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_statics_lib.dart:8:20 -> DoubleConstant(-1.0)
+Evaluated: VariableGet @ org-dartlang-testcase:///late_statics_lib.dart:8:16 -> DoubleConstant(-1.0)
+Extra constant evaluation: evaluated: 112, effectively constant: 6
diff --git a/pkg/front_end/testcases/dart2js/late_statics_lib.dart b/pkg/front_end/testcases/dart2js/late_statics_lib.dart
new file mode 100644
index 0000000..853ea39
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/late_statics_lib.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// 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.
+
+late int a;
+late final int b;
+late int c = -1;
+late final int d = -1;
diff --git a/tools/VERSION b/tools/VERSION
index c7caf78..0f39adc 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 232
+PRERELEASE 233
 PRERELEASE_PATCH 0
\ No newline at end of file
