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 8446ae0..9841ec8 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
@@ -22,7 +22,8 @@
   /// Return the transform sets associated with the [library].
   List<TransformSet> forLibrary(LibraryElement library) {
     var transformSets = <TransformSet>[];
-    var workspace = library.session.analysisContext.workspace;
+    var analysisContext = library.session.analysisContext;
+    var workspace = analysisContext.workspace;
     var libraryPath = library.source.fullName;
     var package = workspace.findPackageFor(libraryPath);
     if (package == null) {
@@ -37,14 +38,12 @@
         transformSets.add(transformSet);
       }
     }
-    var sdkRoot = library.session.analysisContext.sdkRoot;
+    var sdkRoot = analysisContext.sdkRoot;
     if (sdkRoot != null) {
       var file = sdkRoot.getChildAssumingFile('lib/_internal/$dataFileName');
-      if (file.exists) {
-        var transformSet = _loadTransformSet(file);
-        if (transformSet != null) {
-          transformSets.add(transformSet);
-        }
+      var transformSet = _loadTransformSet(file);
+      if (transformSet != null) {
+        transformSets.add(transformSet);
       }
     }
     return transformSets;
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index 8f04747..c64abed 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -482,6 +482,8 @@
     buf.writeln(writeOption('Context location', escape(contextPath)));
     buf.writeln(writeOption('Analysis options path',
         escape(driver.contextRoot.optionsFilePath ?? 'none')));
+    buf.writeln(
+        writeOption('SDK root', escape(driver.analysisContext.sdkRoot.path)));
 
     buf.writeln('<div class="columns">');
 
diff --git a/pkg/dev_compiler/lib/js/legacy/dart_library.js b/pkg/dev_compiler/lib/js/legacy/dart_library.js
index 9be3935..ac7b2b2 100644
--- a/pkg/dev_compiler/lib/js/legacy/dart_library.js
+++ b/pkg/dev_compiler/lib/js/legacy/dart_library.js
@@ -7,314 +7,316 @@
 if (!dart_library) {
   dart_library = typeof module != "undefined" && module.exports || {};
 
-(function (dart_library) {
-  'use strict';
+  (function (dart_library) {
+    'use strict';
 
-  // Throws an error related to module loading.
-  //
-  // This does not throw a Dart error because the Dart SDK may not have loaded
-  // yet, and module loading errors cannot be caught by Dart code.
-  function throwLibraryError(message) {
-    // Dispatch event to allow others to react to the load error without
-    // capturing the exception.
-    if (!!self.dispatchEvent) {
-      self.dispatchEvent(
-        new CustomEvent('dartLoadException', { detail: message }));
-    }
-    throw Error(message);
-  }
-
-  const libraryImports = Symbol('libraryImports');
-  dart_library.libraryImports = libraryImports;
-
-  // Module support.  This is a simplified module system for Dart.
-  // Longer term, we can easily migrate to an existing JS module system:
-  // ES6, AMD, RequireJS, ....
-
-  // Returns a proxy that delegates to the underlying loader.
-  // This defers loading of a module until a library is actually used.
-  const loadedModule = Symbol('loadedModule');
-  dart_library.defer = function (module, name, patch) {
-    let done = false;
-    function loadDeferred() {
-      done = true;
-      let mod = module[loadedModule];
-      let lib = mod[name];
-      // Install unproxied module and library in caller's context.
-      patch(mod, lib);
-    }
-    // The deferred library object.  Note, the only legal operations on a Dart
-    // library object should be get (to read a top-level variable, method, or
-    // Class) or set (to write a top-level variable).
-    return new Proxy({}, {
-      get: function (o, p) {
-        if (!done) loadDeferred();
-        return module[name][p];
-      },
-      set: function (o, p, value) {
-        if (!done) loadDeferred();
-        module[name][p] = value;
-        return true;
-      },
-    });
-  };
-
-  let _reverseImports = new Map();
-  class LibraryLoader {
-
-    constructor(name, defaultValue, imports, loader) {
-      imports.forEach(function (i) {
-        let deps = _reverseImports.get(i);
-        if (!deps) {
-          deps = new Set();
-          _reverseImports.set(i, deps);
-        }
-        deps.add(name);
-      });
-      this._name = name;
-      this._library = defaultValue ? defaultValue : {};
-      this._imports = imports;
-      this._loader = loader;
-
-      // Cyclic import detection
-      this._state = LibraryLoader.NOT_LOADED;
-    }
-
-    loadImports() {
-      let results = [];
-      for (let name of this._imports) {
-        results.push(import_(name));
+    // Throws an error related to module loading.
+    //
+    // This does not throw a Dart error because the Dart SDK may not have loaded
+    // yet, and module loading errors cannot be caught by Dart code.
+    function throwLibraryError(message) {
+      // Dispatch event to allow others to react to the load error without
+      // capturing the exception.
+      if (!!self.dispatchEvent) {
+        self.dispatchEvent(
+          new CustomEvent('dartLoadException', {detail: message}));
       }
-      return results;
+      throw Error(message);
     }
 
-    load() {
-      // Check for cycles
-      if (this._state == LibraryLoader.LOADING) {
-        throwLibraryError('Circular dependence on library: ' + this._name);
-      } else if (this._state >= LibraryLoader.READY) {
+    const libraryImports = Symbol('libraryImports');
+    dart_library.libraryImports = libraryImports;
+
+    // Module support.  This is a simplified module system for Dart.
+    // Longer term, we can easily migrate to an existing JS module system:
+    // ES6, AMD, RequireJS, ....
+
+    // Returns a proxy that delegates to the underlying loader.
+    // This defers loading of a module until a library is actually used.
+    const loadedModule = Symbol('loadedModule');
+    dart_library.defer = function (module, name, patch) {
+      let done = false;
+      function loadDeferred() {
+        done = true;
+        let mod = module[loadedModule];
+        let lib = mod[name];
+        // Install unproxied module and library in caller's context.
+        patch(mod, lib);
+      }
+      // The deferred library object.  Note, the only legal operations on a Dart
+      // library object should be get (to read a top-level variable, method, or
+      // Class) or set (to write a top-level variable).
+      return new Proxy({}, {
+        get: function (o, p) {
+          if (!done) loadDeferred();
+          return module[name][p];
+        },
+        set: function (o, p, value) {
+          if (!done) loadDeferred();
+          module[name][p] = value;
+          return true;
+        },
+      });
+    };
+
+    let _reverseImports = new Map();
+    class LibraryLoader {
+
+      constructor(name, defaultValue, imports, loader) {
+        imports.forEach(function (i) {
+          let deps = _reverseImports.get(i);
+          if (!deps) {
+            deps = new Set();
+            _reverseImports.set(i, deps);
+          }
+          deps.add(name);
+        });
+        this._name = name;
+        this._library = defaultValue ? defaultValue : {};
+        this._imports = imports;
+        this._loader = loader;
+
+        // Cyclic import detection
+        this._state = LibraryLoader.NOT_LOADED;
+      }
+
+      loadImports() {
+        let results = [];
+        for (let name of this._imports) {
+          results.push(import_(name));
+        }
+        return results;
+      }
+
+      load() {
+        // Check for cycles
+        if (this._state == LibraryLoader.LOADING) {
+          throwLibraryError('Circular dependence on library: ' + this._name);
+        } else if (this._state >= LibraryLoader.READY) {
+          return this._library;
+        }
+        this._state = LibraryLoader.LOADING;
+
+        // Handle imports
+        let args = this.loadImports();
+
+        // Load the library
+        let loader = this;
+        let library = this._library;
+
+        library[libraryImports] = this._imports;
+        library[loadedModule] = library;
+        args.unshift(library);
+
+        if (this._name == 'dart_sdk') {
+          // Eagerly load the SDK.
+          this._loader.apply(null, args);
+        } else {
+          // Load / parse other modules on demand.
+          let done = false;
+          this._library = new Proxy(library, {
+            get: function (o, name) {
+              if (!done) {
+                done = true;
+                loader._loader.apply(null, args);
+              }
+              return o[name];
+            }
+          });
+        }
+
+        this._state = LibraryLoader.READY;
         return this._library;
       }
-      this._state = LibraryLoader.LOADING;
 
-      // Handle imports
-      let args = this.loadImports();
+      stub() {
+        return this._library;
+      }
+    }
+    LibraryLoader.NOT_LOADED = 0;
+    LibraryLoader.LOADING = 1;
+    LibraryLoader.READY = 2;
 
-      // Load the library
-      let loader = this;
-      let library = this._library;
+    // Map from name to LibraryLoader
+    let _libraries = new Map();
+    dart_library.libraries = function () {
+      return _libraries.keys();
+    };
+    dart_library.debuggerLibraries = function () {
+      let debuggerLibraries = [];
+      _libraries.forEach(function (value, key, map) {
+        debuggerLibraries.push(value.load());
+      });
+      debuggerLibraries.__proto__ = null;
+      return debuggerLibraries;
+    };
 
-      library[libraryImports] = this._imports;
-      library[loadedModule] = library;
-      args.unshift(library);
+    // Invalidate a library and all things that depend on it
+    function _invalidateLibrary(name) {
+      let lib = _libraries.get(name);
+      if (lib._state == LibraryLoader.NOT_LOADED) return;
+      lib._state = LibraryLoader.NOT_LOADED;
+      lib._library = {};
+      let deps = _reverseImports.get(name);
+      if (!deps) return;
+      deps.forEach(_invalidateLibrary);
+    }
 
-      if (this._name == 'dart_sdk') {
-        // Eagerly load the SDK.
-        this._loader.apply(null, args);
-      } else {
-        // Load / parse other modules on demand.
-        let done = false;
-        this._library = new Proxy(library, {
-          get: function (o, name) {
-            if (!done) {
-              done = true;
-              loader._loader.apply(null, args);
-            }
-            return o[name];
+    function library(name, defaultValue, imports, loader) {
+      let result = _libraries.get(name);
+      if (result) {
+        console.log('Re-loading ' + name);
+        _invalidateLibrary(name);
+      }
+      result = new LibraryLoader(name, defaultValue, imports, loader);
+      _libraries.set(name, result);
+      return result;
+    }
+    dart_library.library = library;
+
+    // Maintain a stack of active imports.  If a requested library/module is not
+    // available, print the stack to show where/how it was requested.
+    let _stack = [];
+    function import_(name) {
+      let lib = _libraries.get(name);
+      if (!lib) {
+        let message = 'Module ' + name + ' not loaded in the browser.';
+        if (_stack != []) {
+          message += '\nDependency via:';
+          let indent = '';
+          for (let last = _stack.length - 1; last >= 0; last--) {
+            indent += ' ';
+            message += '\n' + indent + '- ' + _stack[last];
           }
+        }
+        throwLibraryError(message);
+      }
+      _stack.push(name);
+      let result = lib.load();
+      _stack.pop();
+      return result;
+    }
+    dart_library.import = import_;
+
+    let _debuggerInitialized = false;
+
+    // Called to initiate a hot restart of the application.
+    //
+    // "Hot restart" means all application state is cleared, the newly compiled
+    // modules are loaded, and `main()` is called.
+    //
+    // Note: `onReloadEnd()` can be provided, and if so will be used instead of
+    // `main()` for hot restart.
+    //
+    // This happens in the following sequence:
+    //
+    // 1. Look for `onReloadStart()` in the same library that has `main()`, and
+    //    call it if present. This function is implemented by the application to
+    //    ensure any global browser/DOM state is cleared, so the application can
+    //    restart.
+    // 2. Wait for `onReloadStart()` to complete (either synchronously, or async
+    //    if it returned a `Future`).
+    // 3. Call dart:_runtime's `hotRestart()` function to clear any state that
+    //    `dartdevc` is tracking, such as initialized static fields and type
+    //    caches.
+    // 4. Call `window.$dartWarmReload()` (provided by the HTML page) to reload
+    //    the relevant JS modules, passing a callback that will invoke `main()`.
+    // 5. `$dartWarmReload` calls the callback to rerun main.
+    //
+    function reload(clearState) {
+      // TODO(jmesserly): once we've rolled out `clearState` make it the default,
+      // and eventually remove the parameter.
+      if (clearState == null) clearState = true;
+
+
+      // TODO(jmesserly): we may want to change these APIs to use the
+      // "hot restart" terminology for consistency with Flutter. In Flutter,
+      // "hot reload" refers to keeping the application state and attempting to
+      // patch the code for the application while it is executing
+      // (https://flutter.io/hot-reload/), whereas "hot restart" refers to what
+      // dartdevc supports: tear down the app, update the code, and rerun the app.
+      if (!self || !self.$dartWarmReload) {
+        console.warn('Hot restart not supported in this environment.');
+        return;
+      }
+
+      // Call the application's `onReloadStart()` function, if provided.
+      let result;
+      if (_lastLibrary && _lastLibrary.onReloadStart) {
+        result = _lastLibrary.onReloadStart();
+      }
+
+      let sdk = _libraries.get("dart_sdk");
+
+      /// Once the `onReloadStart()` completes, this finishes the restart.
+      function finishHotRestart() {
+        self.console.clear();
+        if (clearState) {
+          // This resets all initialized fields and clears type caches and other
+          // temporary data structures used by the compiler/SDK.
+          sdk.dart.hotRestart();
+        }
+        // Call the module loader to reload the necessary modules.
+        self.$dartWarmReload(() => {
+          // Once the modules are loaded, rerun `main()`.
+          start(_lastModuleName, _lastLibraryName, true);
         });
       }
 
-      this._state = LibraryLoader.READY;
-      return this._library;
-    }
-
-    stub() {
-      return this._library;
-    }
-  }
-  LibraryLoader.NOT_LOADED = 0;
-  LibraryLoader.LOADING = 1;
-  LibraryLoader.READY = 2;
-
-  // Map from name to LibraryLoader
-  let _libraries = new Map();
-  dart_library.libraries = function () { return _libraries.keys(); };
-  dart_library.debuggerLibraries = function () {
-    let debuggerLibraries = [];
-    _libraries.forEach(function (value, key, map) {
-      debuggerLibraries.push(value.load());
-    });
-    debuggerLibraries.__proto__ = null;
-    return debuggerLibraries;
-  };
-
-  // Invalidate a library and all things that depend on it
-  function _invalidateLibrary(name) {
-    let lib = _libraries.get(name);
-    if (lib._state == LibraryLoader.NOT_LOADED) return;
-    lib._state = LibraryLoader.NOT_LOADED;
-    lib._library = {};
-    let deps = _reverseImports.get(name);
-    if (!deps) return;
-    deps.forEach(_invalidateLibrary);
-  }
-
-  function library(name, defaultValue, imports, loader) {
-    let result = _libraries.get(name);
-    if (result) {
-      console.log('Re-loading ' + name);
-      _invalidateLibrary(name);
-    }
-    result = new LibraryLoader(name, defaultValue, imports, loader);
-    _libraries.set(name, result);
-    return result;
-  }
-  dart_library.library = library;
-
-  // Maintain a stack of active imports.  If a requested library/module is not
-  // available, print the stack to show where/how it was requested.
-  let _stack = [];
-  function import_(name) {
-    let lib = _libraries.get(name);
-    if (!lib) {
-      let message = 'Module ' + name + ' not loaded in the browser.';
-      if (_stack != []) {
-        message += '\nDependency via:';
-        let indent = '';
-        for (let last = _stack.length - 1; last >= 0; last--) {
-          indent += ' ';
-          message += '\n' + indent + '- ' + _stack[last];
-        }
-      }
-      throwLibraryError(message);
-    }
-    _stack.push(name);
-    let result = lib.load();
-    _stack.pop();
-    return result;
-  }
-  dart_library.import = import_;
-
-  let _debuggerInitialized = false;
-
-  // Called to initiate a hot restart of the application.
-  //
-  // "Hot restart" means all application state is cleared, the newly compiled
-  // modules are loaded, and `main()` is called.
-  //
-  // Note: `onReloadEnd()` can be provided, and if so will be used instead of
-  // `main()` for hot restart.
-  //
-  // This happens in the following sequence:
-  //
-  // 1. Look for `onReloadStart()` in the same library that has `main()`, and
-  //    call it if present. This function is implemented by the application to
-  //    ensure any global browser/DOM state is cleared, so the application can
-  //    restart.
-  // 2. Wait for `onReloadStart()` to complete (either synchronously, or async
-  //    if it returned a `Future`).
-  // 3. Call dart:_runtime's `hotRestart()` function to clear any state that
-  //    `dartdevc` is tracking, such as initialized static fields and type
-  //    caches.
-  // 4. Call `window.$dartWarmReload()` (provided by the HTML page) to reload
-  //    the relevant JS modules, passing a callback that will invoke `main()`.
-  // 5. `$dartWarmReload` calls the callback to rerun main.
-  //
-  function reload(clearState) {
-    // TODO(jmesserly): once we've rolled out `clearState` make it the default,
-    // and eventually remove the parameter.
-    if (clearState == null) clearState = true;
-
-
-    // TODO(jmesserly): we may want to change these APIs to use the
-    // "hot restart" terminology for consistency with Flutter. In Flutter,
-    // "hot reload" refers to keeping the application state and attempting to
-    // patch the code for the application while it is executing
-    // (https://flutter.io/hot-reload/), whereas "hot restart" refers to what
-    // dartdevc supports: tear down the app, update the code, and rerun the app.
-    if (!self || !self.$dartWarmReload) {
-      console.warn('Hot restart not supported in this environment.');
-      return;
-    }
-
-    // Call the application's `onReloadStart()` function, if provided.
-    let result;
-    if (_lastLibrary && _lastLibrary.onReloadStart) {
-      result = _lastLibrary.onReloadStart();
-    }
-
-    let sdk = _libraries.get("dart_sdk");
-
-    /// Once the `onReloadStart()` completes, this finishes the restart.
-    function finishHotRestart() {
-      self.console.clear();
-      if (clearState) {
-        // This resets all initialized fields and clears type caches and other
-        // temporary data structures used by the compiler/SDK.
-        sdk.dart.hotRestart();
-      }
-      // Call the module loader to reload the necessary modules.
-      self.$dartWarmReload(() => {
-        // Once the modules are loaded, rerun `main()`.
-        start(_lastModuleName, _lastLibraryName, true);
-      });
-    }
-
-    if (result && result.then) {
-      result.then(sdk._library.dart.Dynamic)(finishHotRestart);
-    } else {
-      finishHotRestart();
-    }
-  }
-  dart_library.reload = reload;
-
-
-  let _lastModuleName;
-  let _lastLibraryName;
-  let _lastLibrary;
-  let _originalBody;
-
-  function start(moduleName, libraryName, isReload) {
-    if (libraryName == null) libraryName = moduleName;
-    _lastModuleName = moduleName;
-    _lastLibraryName = libraryName;
-    let library = import_(moduleName)[libraryName];
-    _lastLibrary = library;
-    let dart_sdk = import_('dart_sdk');
-
-    if (!_debuggerInitialized) {
-      // This import is only needed for chrome debugging. We should provide an
-      // option to compile without it.
-      dart_sdk._debugger.registerDevtoolsFormatter();
-
-      // Create isolate.
-      _debuggerInitialized = true;
-    }
-    if (isReload) {
-      if (library.onReloadEnd) {
-        library.onReloadEnd();
-        return;
+      if (result && result.then) {
+        result.then(sdk._library.dart.Dynamic)(finishHotRestart);
       } else {
-        if (!!self.document) {
-          // Note: we expect _originalBody to be undefined in non-browser
-          // environments, but in that case so is the body.
-          if (!_originalBody && !!self.document.body) {
-            self.console.warn('No body saved to update on reload');
-          } else {
-            self.document.body = _originalBody;
+        finishHotRestart();
+      }
+    }
+    dart_library.reload = reload;
+
+
+    let _lastModuleName;
+    let _lastLibraryName;
+    let _lastLibrary;
+    let _originalBody;
+
+    function start(moduleName, libraryName, isReload) {
+      if (libraryName == null) libraryName = moduleName;
+      _lastModuleName = moduleName;
+      _lastLibraryName = libraryName;
+      let library = import_(moduleName)[libraryName];
+      _lastLibrary = library;
+      let dart_sdk = import_('dart_sdk');
+
+      if (!_debuggerInitialized) {
+        // This import is only needed for chrome debugging. We should provide an
+        // option to compile without it.
+        dart_sdk._debugger.registerDevtoolsFormatter();
+
+        // Create isolate.
+        _debuggerInitialized = true;
+      }
+      if (isReload) {
+        if (library.onReloadEnd) {
+          library.onReloadEnd();
+          return;
+        } else {
+          if (!!self.document) {
+            // Note: we expect _originalBody to be undefined in non-browser
+            // environments, but in that case so is the body.
+            if (!_originalBody && !!self.document.body) {
+              self.console.warn('No body saved to update on reload');
+            } else {
+              self.document.body = _originalBody;
+            }
           }
         }
+      } else {
+        // If not a reload then store the initial html to reset it on reload.
+        if (!!self.document && !!self.document.body) {
+          _originalBody = self.document.body.cloneNode(true);
+        }
       }
-    } else {
-      // If not a reload then store the initial html to reset it on reload.
-      if (!!self.document && !!self.document.body) {
-        _originalBody = self.document.body.cloneNode(true);
-      }
+      library.main([]);
     }
-    library.main([]);
-  }
-  dart_library.start = start;
+    dart_library.start = start;
 
-})(dart_library);
+  })(dart_library);
 }
diff --git a/samples/sample_extension/sample_asynchronous_extension.dart b/samples/sample_extension/sample_asynchronous_extension.dart
index 541652d..7d18902 100644
--- a/samples/sample_extension/sample_asynchronous_extension.dart
+++ b/samples/sample_extension/sample_asynchronous_extension.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 library sample_asynchronous_extension;
 
 import 'dart:async';
@@ -12,15 +10,12 @@
 
 // A class caches the native port used to call an asynchronous extension.
 class RandomArray {
-  static SendPort _port;
+  static SendPort? _port;
 
   Future<List<int>> randomArray(int seed, int length) {
     var completer = new Completer<List<int>>();
     var replyPort = new RawReceivePort();
-    var args = new List(3);
-    args[0] = seed;
-    args[1] = length;
-    args[2] = replyPort.sendPort;
+    var args = [seed, length, replyPort.sendPort];
     _servicePort.send(args);
     replyPort.handler = (result) {
       replyPort.close();
@@ -37,7 +32,7 @@
     if (_port == null) {
       _port = _newServicePort();
     }
-    return _port;
+    return _port!;
   }
 
   SendPort _newServicePort() native "RandomArray_ServicePort";
diff --git a/samples/sample_extension/sample_synchronous_extension.dart b/samples/sample_extension/sample_synchronous_extension.dart
index e5ad660..727cd4c 100644
--- a/samples/sample_extension/sample_synchronous_extension.dart
+++ b/samples/sample_extension/sample_synchronous_extension.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 library sample_synchronous_extension;
 
 import 'dart-ext:sample_extension';
diff --git a/samples/sample_extension/test/sample_extension_app_snapshot_test.dart b/samples/sample_extension/test/sample_extension_app_snapshot_test.dart
index b2eb204..558b108 100644
--- a/samples/sample_extension/test/sample_extension_app_snapshot_test.dart
+++ b/samples/sample_extension/test/sample_extension_app_snapshot_test.dart
@@ -4,8 +4,6 @@
 //
 // Dart test program for testing native extensions.
 
-// @dart = 2.9
-
 // OtherResources=../sample_synchronous_extension.dart
 // OtherResources=../sample_asynchronous_extension.dart
 // OtherResources=../test_sample_synchronous_extension.dart
diff --git a/samples/sample_extension/test/sample_extension_test.dart b/samples/sample_extension/test/sample_extension_test.dart
index 393463b..4311ff5 100644
--- a/samples/sample_extension/test/sample_extension_test.dart
+++ b/samples/sample_extension/test/sample_extension_test.dart
@@ -4,8 +4,6 @@
 //
 // Dart test program for testing native extensions.
 
-// @dart = 2.9
-
 import 'sample_extension_test_helper.dart';
 
 void main() {
diff --git a/samples/sample_extension/test/sample_extension_test_helper.dart b/samples/sample_extension/test/sample_extension_test_helper.dart
index 9c701bf..d4cae3d 100644
--- a/samples/sample_extension/test/sample_extension_test_helper.dart
+++ b/samples/sample_extension/test/sample_extension_test_helper.dart
@@ -4,8 +4,6 @@
 //
 // Dart test program for testing native extensions.
 
-// @dart = 2.9
-
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
@@ -26,7 +24,7 @@
       result = await Process.run('cmd.exe', ['/C', 'copy $src $dst']);
       break;
     default:
-      Expect.fail('Unknown operating system ${Platform.operatingSystem}');
+      throw 'Unknown operating system ${Platform.operatingSystem}';
   }
   if (result.exitCode != 0) {
     print(result.stdout);
@@ -46,7 +44,7 @@
   }
 }
 
-Future testNativeExtensions(String snapshotKind) async {
+Future testNativeExtensions(String? snapshotKind) async {
   String buildDirectory = dirname(Platform.executable);
   Directory tempDirectory =
       Directory.systemTemp.createTempSync('sample_extension_');
diff --git a/samples/sample_extension/test_sample_asynchronous_extension.dart b/samples/sample_extension/test_sample_asynchronous_extension.dart
index 5ceb7c8..b1fd419 100644
--- a/samples/sample_extension/test_sample_asynchronous_extension.dart
+++ b/samples/sample_extension/test_sample_asynchronous_extension.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 library test_sample_extension;
 
 import 'sample_asynchronous_extension.dart';
@@ -32,16 +30,16 @@
 void checkNormal(List l) {
   // Count how many times each byte value occurs.  Assert that the counts
   // are all within a reasonable (six-sigma) range.
-  List counts = new List<int>.filled(256, 0);
+  List<int> counts = new List<int>.filled(256, 0);
   for (var e in l) {
     counts[e]++;
   }
   new RandomArray().randomArray(18, 256000).then(checkCorrelation(counts));
 }
 
-Function checkCorrelation(List counts) {
-  return (List l) {
-    List counts_2 = new List<int>.filled(256, 0);
+dynamic Function(List<int>) checkCorrelation(List<int> counts) {
+  return (List<int> l) {
+    List<int> counts_2 = new List<int>.filled(256, 0);
     for (var e in l) {
       counts_2[e]++;
     }
diff --git a/samples/sample_extension/test_sample_synchronous_extension.dart b/samples/sample_extension/test_sample_synchronous_extension.dart
index 77d2fc3..ac17724 100644
--- a/samples/sample_extension/test_sample_synchronous_extension.dart
+++ b/samples/sample_extension/test_sample_synchronous_extension.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 library test_sample_extension;
 
 import 'sample_synchronous_extension.dart';
diff --git a/tools/VERSION b/tools/VERSION
index 382c739..881e000 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 257
+PRERELEASE 258
 PRERELEASE_PATCH 0
\ No newline at end of file
