Version 2.18.0-203.0.dev

Merge commit '65e8411498812312c7685eff283161bf4d620cf7' into 'dev'
diff --git a/DEPS b/DEPS
index d3febf3..e2d546a 100644
--- a/DEPS
+++ b/DEPS
@@ -107,7 +107,7 @@
 
   "dartdoc_rev": "58348a98b992ce99b95d23131b67227bdb2b4875",
   "devtools_rev": "51ac983d2db7eb19b3ce5956cb70b769d74fe784",
-  "ffi_rev": "0c8364a728cfe4e4ba859c53b99d56b3dbe3add4",
+  "ffi_rev": "0c8364a728cfe4e4ba859c53b99d56b3dbe3add4", # dart-lang/ffi/issues/148
   "file_rev": "0132eeedea2933513bf230513a766a8baeab0c4f",
   "fixnum_rev": "164712f6547cdfb2709b752188186baf31fd1730",
   "glob_rev": "e10eb2407c58427144004458ef85c9bbf7286e56",
@@ -122,7 +122,7 @@
   "linter_rev": "1ddc70948d94f2449fec69a95e3ceb7b6b6c8348", # 1.25.0
   "lints_rev": "8294e5648ab49474541527e2911e72e4c5aefe55",
   "logging_rev": "f6979e3bc3b6e1847a08335b7eb6304e18986195",
-  "markdown_rev": "73ad99eeddc1ecebd27faa3221e68c81dc8217eb", # 5.0.0
+  "markdown_rev": "e3f4bd28c9e61b522f75f291d4d6cfcfeccd83ee", # b/236358256
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
   "matcher_rev": "12cdc5fbafd666ed908359ae215d5d0306087969",
   "mime_rev": "0a75a41445eb642674a0a271eecde78cb025ee60",
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/rename_method_parameter.dart b/pkg/analysis_server/lib/src/services/correction/dart/rename_method_parameter.dart
new file mode 100644
index 0000000..8a84fe8
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/rename_method_parameter.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2022, 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.
+
+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/visitor.dart';
+import 'package:analyzer/dart/element/element.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 RenameMethodParameter extends CorrectionProducer {
+  String _oldName = '';
+  String _newName = '';
+
+  @override
+  List<Object> get fixArguments => [_oldName, _newName];
+
+  @override
+  FixKind get fixKind => DartFixKind.RENAME_METHOD_PARAMETER;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    final parameter = node.parent;
+    if (parameter is! FormalParameter) return;
+    var paramIdentifier = parameter.identifier;
+    if (paramIdentifier == null) return;
+
+    var method = parameter.thisOrAncestorOfType<MethodDeclaration>();
+    if (method == null) return;
+    var methodParameters = method.parameters;
+    if (methodParameters == null) return;
+
+    var classDeclaration = method.parent as Declaration;
+    var classElement = classDeclaration.declaredElement;
+    if (classElement is! ClassElement) return;
+
+    var parentMethod = classElement.lookUpInheritedMethod(
+        method.name.name, classElement.library);
+    if (parentMethod == null) return;
+
+    var parameters = methodParameters.parameters;
+    var parentParameters = parentMethod.parameters;
+    var oldName = paramIdentifier.name;
+
+    var i = parameters.indexOf(parameter);
+    if (0 <= i && i < parentParameters.length) {
+      var newName = parentParameters[i].name;
+
+      var collector = _Collector(newName, parameter.declaredElement!);
+      method.accept(collector);
+
+      if (!collector.error) {
+        _oldName = oldName;
+        _newName = newName;
+
+        await builder.addDartFileEdit(file, (builder) {
+          for (var i in collector.oldIdentifiers) {
+            builder.addSimpleReplacement(range.node(i), newName);
+          }
+        });
+      }
+    }
+  }
+}
+
+class _Collector extends RecursiveAstVisitor<void> {
+  var error = false;
+  final String newName;
+  final ParameterElement target;
+
+  final oldIdentifiers = <SimpleIdentifier>[];
+
+  _Collector(this.newName, this.target);
+
+  @override
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    if (error) return;
+
+    var nodeElement = node.staticElement;
+    if (nodeElement == target) {
+      oldIdentifiers.add(node);
+    } else if (node.name == newName) {
+      error = true;
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
index 3461471..3f8f4d7 100644
--- a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
+++ b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
@@ -1584,7 +1584,7 @@
 LintCode.avoid_relative_lib_imports:
   status: hasFix
 LintCode.avoid_renaming_method_parameters:
-  status: needsEvaluation
+  status: hasFix
 LintCode.avoid_return_types_on_setters:
   status: hasFix
 LintCode.avoid_returning_null:
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 9dd1286..ed8f791 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -1273,6 +1273,11 @@
     DartFixKindPriority.DEFAULT,
     "Remove 'var'",
   );
+  static const RENAME_METHOD_PARAMETER = FixKind(
+    'dart.fix.rename.methodParameter',
+    DartFixKindPriority.DEFAULT,
+    "Rename '{0}' to '{1}'",
+  );
   static const RENAME_TO_CAMEL_CASE = FixKind(
     'dart.fix.rename.toCamelCase',
     DartFixKindPriority.DEFAULT,
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 8446643..c79ab5f 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -153,6 +153,7 @@
 import 'package:analysis_server/src/services/correction/dart/remove_unused_local_variable.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_unused_parameter.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_var.dart';
+import 'package:analysis_server/src/services/correction/dart/rename_method_parameter.dart';
 import 'package:analysis_server/src/services/correction/dart/rename_to_camel_case.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_Null_with_void.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_boolean_with_bool.dart';
@@ -401,6 +402,9 @@
     LintNames.avoid_relative_lib_imports: [
       ConvertToPackageImport.new,
     ],
+    LintNames.avoid_renaming_method_parameters: [
+      RenameMethodParameter.new,
+    ],
     LintNames.avoid_return_types_on_setters: [
       RemoveTypeAnnotation.new,
     ],
diff --git a/pkg/analysis_server/lib/src/services/linter/lint_names.dart b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
index e37937f..eebcda7 100644
--- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart
+++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
@@ -29,6 +29,8 @@
   static const String avoid_redundant_argument_values =
       'avoid_redundant_argument_values';
   static const String avoid_relative_lib_imports = 'avoid_relative_lib_imports';
+  static const String avoid_renaming_method_parameters =
+      'avoid_renaming_method_parameters';
   static const String avoid_return_types_on_setters =
       'avoid_return_types_on_setters';
   static const String avoid_returning_null_for_future =
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
index 1d8a795..26b9a08 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
@@ -166,9 +166,7 @@
     if (element is LocalElement) {
       var targetRange = _getVisibleRange(target);
       var elementRange = _getVisibleRange(element);
-      return targetRange != null &&
-          elementRange != null &&
-          elementRange.intersects(targetRange);
+      return elementRange != null && elementRange.intersects(targetRange);
     }
     return false;
   }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/rename_method_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/rename_method_parameter_test.dart
new file mode 100644
index 0000000..70faf54
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/rename_method_parameter_test.dart
@@ -0,0 +1,135 @@
+// Copyright (c) 2022, 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.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RenameMethodParameterTest);
+  });
+}
+
+@reflectiveTest
+class RenameMethodParameterTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.RENAME_METHOD_PARAMETER;
+
+  @override
+  String get lintCode => LintNames.avoid_renaming_method_parameters;
+
+  Future<void> test_conflict_parameters() async {
+    await resolveTestCode('''
+class A {
+  void m(a, b) {}
+}
+class B extends A {
+  void m(b, a) {
+  }
+}
+''');
+    await assertNoFix(
+        errorFilter: (error) => error.message.contains("parameter 'a'"));
+  }
+
+  Future<void> test_local_variable() async {
+    await resolveTestCode('''
+class A {
+  void m(a) {}
+}
+class B extends A {
+  void m(b) {
+    var a = '';
+    print(a);
+  }
+}
+''');
+    await assertNoFix();
+  }
+
+  Future<void> test_member() async {
+    await resolveTestCode('''
+class A {
+  void m(a) {}
+}
+class B extends A {
+  int? a;
+
+  void m(b) {
+    a = 1;
+  }
+}
+''');
+    await assertNoFix();
+  }
+
+  Future<void> test_rename() async {
+    await resolveTestCode('''
+class A {
+  void m(a, b, c) {}
+}
+class B extends A {
+  void m(a, d, c) {}
+}
+''');
+    await assertHasFix('''
+class A {
+  void m(a, b, c) {}
+}
+class B extends A {
+  void m(a, b, c) {}
+}
+''');
+  }
+
+  Future<void> test_shadowed() async {
+    await resolveTestCode('''
+class A {
+  void m(a) {}
+}
+class B extends A {
+  void m(b) {
+    print(b);
+    if (b > 0) {
+      var b = 0;
+      print(b);
+    }
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  void m(a) {}
+}
+class B extends A {
+  void m(a) {
+    print(a);
+    if (a > 0) {
+      var b = 0;
+      print(b);
+    }
+  }
+}
+''');
+  }
+
+  Future<void> test_topLevel() async {
+    await resolveTestCode('''
+int? a;
+class A {
+  void m(a) {}
+}
+class B extends A {
+  void m(b) {
+    a = 1;
+  }
+}
+''');
+    await assertNoFix();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index 58af344..768c4c6 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -188,6 +188,7 @@
 import 'remove_unused_local_variable_test.dart' as remove_unused_local_variable;
 import 'remove_unused_parameter_test.dart' as remove_unused_parameter;
 import 'remove_var_test.dart' as remove_var;
+import 'rename_method_parameter_test.dart' as rename_method_parameter;
 import 'rename_to_camel_case_test.dart' as rename_to_camel_case;
 import 'replace_Null_with_void_test.dart' as replace_null_with_void;
 import 'replace_boolean_with_bool_test.dart' as replace_boolean_with_bool;
@@ -398,6 +399,7 @@
     remove_unused_parameter.main();
     remove_var.main();
     rename_to_camel_case.main();
+    rename_method_parameter.main();
     replace_boolean_with_bool.main();
     replace_cascade_with_dot.main();
     replace_colon_with_equals.main();
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index feca390..0bc4b59 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -95,7 +95,8 @@
     List<String> errorsPlain,
     List<String> errorsColorized,
     String invocationModes,
-    String verbosityLevel) {
+    String verbosityLevel,
+    bool enableMirrors) {
   final expFlags = <String>[];
   if (experimentalFlags != null) {
     for (String flag in experimentalFlags) {
@@ -107,7 +108,8 @@
   return new CompilerOptions()
     ..fileSystem = fileSystem
     ..target = new VmTarget(new TargetFlags(
-        enableNullSafety: nullSafety == kNullSafetyOptionStrong))
+        enableNullSafety: nullSafety == kNullSafetyOptionStrong,
+        supportMirrors: enableMirrors))
     ..packagesFileUri = packagesUri
     ..sdkSummary = platformKernelPath
     ..verbose = verbose
@@ -165,6 +167,7 @@
   final String? packageConfig;
   final String invocationModes;
   final String verbosityLevel;
+  final bool enableMirrors;
 
   // Code coverage and hot reload are only supported by incremental compiler,
   // which is used if vm-service is enabled.
@@ -184,7 +187,8 @@
       this.supportHotReload: false,
       this.packageConfig: null,
       this.invocationModes: '',
-      this.verbosityLevel: Verbosity.defaultValue}) {
+      this.verbosityLevel: Verbosity.defaultValue,
+      required this.enableMirrors}) {
     Uri? packagesUri = null;
     final packageConfig = this.packageConfig ?? Platform.packageConfig;
     if (packageConfig != null) {
@@ -208,7 +212,8 @@
         errorsPlain,
         errorsColorized,
         invocationModes,
-        verbosityLevel);
+        verbosityLevel,
+        enableMirrors);
   }
 
   Future<CompilerResult> compile(Uri script) {
@@ -295,7 +300,8 @@
       List<String>? experimentalFlags,
       String? packageConfig,
       String invocationModes: '',
-      String verbosityLevel: Verbosity.defaultValue})
+      String verbosityLevel: Verbosity.defaultValue,
+      required bool enableMirrors})
       : super(isolateGroupId, fileSystem, platformKernelPath,
             enableAsserts: enableAsserts,
             nullSafety: nullSafety,
@@ -304,7 +310,8 @@
             supportCodeCoverage: true,
             packageConfig: packageConfig,
             invocationModes: invocationModes,
-            verbosityLevel: verbosityLevel);
+            verbosityLevel: verbosityLevel,
+            enableMirrors: enableMirrors);
 
   factory IncrementalCompilerWrapper.forExpressionCompilationOnly(
       Component component,
@@ -314,13 +321,15 @@
       {bool enableAsserts: false,
       List<String>? experimentalFlags,
       String? packageConfig,
-      String invocationModes: ''}) {
+      String invocationModes: '',
+      required bool enableMirrors}) {
     IncrementalCompilerWrapper result = IncrementalCompilerWrapper(
         isolateGroupId, fileSystem, platformKernelPath,
         enableAsserts: enableAsserts,
         experimentalFlags: experimentalFlags,
         packageConfig: packageConfig,
-        invocationModes: invocationModes);
+        invocationModes: invocationModes,
+        enableMirrors: enableMirrors);
     result.generator = new IncrementalCompiler.forExpressionCompilationOnly(
         component,
         result.options,
@@ -349,7 +358,8 @@
         nullSafety: nullSafety,
         experimentalFlags: experimentalFlags,
         packageConfig: packageConfig,
-        invocationModes: invocationModes);
+        invocationModes: invocationModes,
+        enableMirrors: enableMirrors);
     final generator = this.generator!;
     // TODO(VM TEAM): This does not seem safe. What if cloning while having
     // pending deltas for instance?
@@ -384,14 +394,16 @@
       List<String>? experimentalFlags,
       String? packageConfig,
       String invocationModes: '',
-      String verbosityLevel: Verbosity.defaultValue})
+      String verbosityLevel: Verbosity.defaultValue,
+      required bool enableMirrors})
       : super(isolateGroupId, fileSystem, platformKernelPath,
             enableAsserts: enableAsserts,
             nullSafety: nullSafety,
             experimentalFlags: experimentalFlags,
             packageConfig: packageConfig,
             invocationModes: invocationModes,
-            verbosityLevel: verbosityLevel);
+            verbosityLevel: verbosityLevel,
+            enableMirrors: enableMirrors);
 
   @override
   Future<CompilerResult> compileInternal(Uri script) async {
@@ -428,7 +440,8 @@
     String? multirootFilepaths,
     String? multirootScheme,
     String invocationModes: '',
-    String verbosityLevel: Verbosity.defaultValue}) async {
+    String verbosityLevel: Verbosity.defaultValue,
+    required bool enableMirrors}) async {
   IncrementalCompilerWrapper? compiler =
       lookupIncrementalCompiler(isolateGroupId);
   if (compiler != null) {
@@ -457,7 +470,8 @@
           experimentalFlags: experimentalFlags,
           packageConfig: packageConfig,
           invocationModes: invocationModes,
-          verbosityLevel: verbosityLevel);
+          verbosityLevel: verbosityLevel,
+          enableMirrors: enableMirrors);
     }
     isolateCompilers[isolateGroupId] = compiler;
   }
@@ -513,6 +527,7 @@
   final bool enableAsserts = request[16];
   final List<String>? experimentalFlags =
       request[17] != null ? request[17].cast<String>() : null;
+  final bool enableMirrors = request[18];
 
   IncrementalCompilerWrapper? compiler = isolateCompilers[isolateGroupId];
 
@@ -595,7 +610,8 @@
             component, isolateGroupId, fileSystem, null,
             enableAsserts: enableAsserts,
             experimentalFlags: experimentalFlags,
-            packageConfig: dotPackagesFile);
+            packageConfig: dotPackagesFile,
+            enableMirrors: enableMirrors);
         isolateCompilers[isolateGroupId] = compiler;
         await compiler.compile(
             component.mainMethod?.enclosingLibrary.importUri ??
@@ -776,6 +792,7 @@
   final String? multirootScheme = request[13];
   final String? workingDirectory = request[14];
   final String verbosityLevel = request[15];
+  final bool enableMirrors = request[16];
   Uri platformKernelPath;
   List<int>? platformKernel = null;
   if (request[3] is String) {
@@ -844,7 +861,8 @@
         errorsPlain,
         errorsColorized,
         invocationModes,
-        verbosityLevel);
+        verbosityLevel,
+        false);
 
     // script should only be null for kUpdateSourcesTag.
     await autoDetectNullSafetyMode(script!, options);
@@ -870,7 +888,8 @@
         multirootFilepaths: multirootFilepaths,
         multirootScheme: multirootScheme,
         invocationModes: invocationModes,
-        verbosityLevel: verbosityLevel);
+        verbosityLevel: verbosityLevel,
+        enableMirrors: enableMirrors);
   } else {
     FileSystem fileSystem = _buildFileSystem(
         sourceFiles, platformKernel, multirootFilepaths, multirootScheme);
@@ -882,7 +901,8 @@
         experimentalFlags: experimentalFlags,
         packageConfig: packageConfig,
         invocationModes: invocationModes,
-        verbosityLevel: verbosityLevel);
+        verbosityLevel: verbosityLevel,
+        enableMirrors: enableMirrors);
   }
 
   CompilationResult result;
@@ -1044,6 +1064,7 @@
     null /* multirootScheme */,
     null /* original working directory */,
     'all' /* CFE logging mode */,
+    true /* enableMirrors */,
   ];
   await _processLoadRequest(request);
 }
diff --git a/runtime/tests/vm/dart/enable_mirrors_lib_false.dart b/runtime/tests/vm/dart/enable_mirrors_lib_false.dart
new file mode 100644
index 0000000..040b701
--- /dev/null
+++ b/runtime/tests/vm/dart/enable_mirrors_lib_false.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, 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.
+
+// Auxiliary library for enable_mirrors_test.dart.
+
+bool dartLibraryMirrorsConditionalImport = false;
diff --git a/runtime/tests/vm/dart/enable_mirrors_lib_true.dart b/runtime/tests/vm/dart/enable_mirrors_lib_true.dart
new file mode 100644
index 0000000..5aa936c
--- /dev/null
+++ b/runtime/tests/vm/dart/enable_mirrors_lib_true.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, 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.
+
+// Auxiliary library for enable_mirrors_test.dart.
+
+bool dartLibraryMirrorsConditionalImport = true;
diff --git a/runtime/tests/vm/dart/enable_mirrors_test.dart b/runtime/tests/vm/dart/enable_mirrors_test.dart
new file mode 100644
index 0000000..e9f8e19
--- /dev/null
+++ b/runtime/tests/vm/dart/enable_mirrors_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2022, 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.
+
+// VMOptions=--enable-mirrors=false
+
+// Verfies that '--enable-mirrors=false' affects conditional imports and
+// constant bool.fromEnvironment.
+
+import "package:expect/expect.dart";
+
+import 'enable_mirrors_lib_false.dart'
+    if (dart.library.mirrors) 'enable_mirrors_lib_true.dart';
+
+main() {
+  Expect.isFalse(const bool.fromEnvironment('dart.library.mirrors'));
+  Expect.isFalse(dartLibraryMirrorsConditionalImport);
+}
diff --git a/runtime/tests/vm/dart_2/enable_mirrors_lib_false.dart b/runtime/tests/vm/dart_2/enable_mirrors_lib_false.dart
new file mode 100644
index 0000000..d3d682a
--- /dev/null
+++ b/runtime/tests/vm/dart_2/enable_mirrors_lib_false.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2022, 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.
+
+// Auxiliary library for enable_mirrors_test.dart.
+
+// @dart = 2.9
+
+bool dartLibraryMirrorsConditionalImport = false;
diff --git a/runtime/tests/vm/dart_2/enable_mirrors_lib_true.dart b/runtime/tests/vm/dart_2/enable_mirrors_lib_true.dart
new file mode 100644
index 0000000..f824c2c
--- /dev/null
+++ b/runtime/tests/vm/dart_2/enable_mirrors_lib_true.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2022, 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.
+
+// Auxiliary library for enable_mirrors_test.dart.
+
+// @dart = 2.9
+
+bool dartLibraryMirrorsConditionalImport = true;
diff --git a/runtime/tests/vm/dart_2/enable_mirrors_test.dart b/runtime/tests/vm/dart_2/enable_mirrors_test.dart
new file mode 100644
index 0000000..072c740
--- /dev/null
+++ b/runtime/tests/vm/dart_2/enable_mirrors_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2022, 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.
+
+// VMOptions=--enable-mirrors=false
+
+// Verfies that '--enable-mirrors=false' affects conditional imports and
+// constant bool.fromEnvironment.
+
+// @dart = 2.9
+
+import "package:expect/expect.dart";
+
+import 'enable_mirrors_lib_false.dart'
+    if (dart.library.mirrors) 'enable_mirrors_lib_true.dart';
+
+main() {
+  Expect.isFalse(const bool.fromEnvironment('dart.library.mirrors'));
+  Expect.isFalse(dartLibraryMirrorsConditionalImport);
+}
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index c6f3222..0ffba9b 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -699,6 +699,10 @@
     experimental_flags_object.value.as_array.values = experimental_flags_array;
     experimental_flags_object.value.as_array.length = num_experimental_flags;
 
+    Dart_CObject enable_mirrors;
+    enable_mirrors.type = Dart_CObject_kBool;
+    enable_mirrors.value.as_bool = FLAG_enable_mirrors;
+
     Dart_CObject message;
     message.type = Dart_CObject_kArray;
     Dart_CObject* message_arr[] = {&tag,
@@ -718,7 +722,8 @@
                                    &dills_object,
                                    &num_blob_loads,
                                    &enable_asserts,
-                                   &experimental_flags_object};
+                                   &experimental_flags_object,
+                                   &enable_mirrors};
     message.value.as_array.values = message_arr;
     message.value.as_array.length = ARRAY_SIZE(message_arr);
 
@@ -942,6 +947,10 @@
     verbosity_str.value.as_string =
         const_cast<char*>(KernelCompilationVerbosityLevelToString(verbosity));
 
+    Dart_CObject enable_mirrors;
+    enable_mirrors.type = Dart_CObject_kBool;
+    enable_mirrors.value.as_bool = FLAG_enable_mirrors;
+
     Dart_CObject* message_arr[] = {&tag,
                                    &send_port,
                                    &uri,
@@ -957,7 +966,8 @@
                                    &multiroot_filepaths_object,
                                    &multiroot_scheme_object,
                                    &original_working_directory_object,
-                                   &verbosity_str};
+                                   &verbosity_str,
+                                   &enable_mirrors};
     message.value.as_array.values = message_arr;
     message.value.as_array.length = ARRAY_SIZE(message_arr);
     // Send the message.
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart b/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart
index 45773c0..005f182 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart
@@ -2,9 +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
-
-
 part of layout;
 
 /**
@@ -47,9 +44,9 @@
 //  - Optimize for the "incremental update" cases
 class GridLayout extends ViewLayout {
   /** Configuration parameters defined in CSS. */
-  final GridTrackList rows;
-  final GridTrackList columns;
-  final GridTemplate template;
+  final GridTrackList? rows;
+  final GridTrackList? columns;
+  final GridTemplate? template;
 
   /** The default sizing for new rows. */
   final TrackSizing rowSizing;
@@ -61,33 +58,33 @@
    * This stores the grid's size during a layout.
    * Used for rows/columns with % or fr units.
    */
-  int _gridWidth, _gridHeight;
+  int? _gridWidth, _gridHeight;
 
   /**
    * During a layout, this stores all row/column size information.
    * Because grid-items can implicitly specify their own rows/columns, we can't
    * compute this until we know the set of items.
    */
-  List<GridTrack> _rowTracks, _columnTracks;
+  late List<GridTrack> _rowTracks, _columnTracks;
 
   /** During a layout, tracks which dimension we're processing. */
-  Dimension _dimension;
+  Dimension? _dimension;
 
   GridLayout(Positionable view)
       : rows = _GridTrackParser.parse(view.customStyle['grid-rows']),
         columns = _GridTrackParser.parse(view.customStyle['grid-columns']),
         template = _GridTemplateParser.parse(view.customStyle['grid-template']),
-        rowSizing = _GridTrackParser
-            .parseTrackSizing(view.customStyle['grid-row-sizing']),
-        columnSizing = _GridTrackParser
-            .parseTrackSizing(view.customStyle['grid-column-sizing']),
+        rowSizing = _GridTrackParser.parseTrackSizing(
+            view.customStyle['grid-row-sizing']),
+        columnSizing = _GridTrackParser.parseTrackSizing(
+            view.customStyle['grid-column-sizing']),
         super(view) {
-    _rowTracks = rows != null ? rows.tracks : new List<GridTrack>();
-    _columnTracks = columns != null ? columns.tracks : new List<GridTrack>();
+    _rowTracks = rows?.tracks ?? [];
+    _columnTracks = columns?.tracks ?? [];
   }
 
-  int get currentWidth => _gridWidth;
-  int get currentHeight => _gridHeight;
+  int? get currentWidth => _gridWidth;
+  int? get currentHeight => _gridHeight;
 
   void cacheExistingBrowserLayout() {
     // We don't need to do anything as we don't rely on the _cachedViewRect
@@ -97,11 +94,11 @@
   // TODO(jacobr): cleanup this method so that it returns a Future
   // rather than taking a Completer as an argument.
   /** The main entry point for layout computation. */
-  void measureLayout(Future<Size> size, Completer<bool> changed) {
+  void measureLayout(Future<Size> size, Completer<bool>? changed) {
     _ensureAllTracks();
     size.then((value) {
-      _gridWidth = value.width;
-      _gridHeight = value.height;
+      _gridWidth = value.width as int?;
+      _gridHeight = value.height as int?;
 
       if (_rowTracks.length > 0 && _columnTracks.length > 0) {
         _measureTracks();
@@ -135,7 +132,7 @@
   }
 
   num _getRemainingSpace(List<GridTrack> tracks) {
-    num remaining = _getGridContentSize();
+    num remaining = _getGridContentSize()!;
     remaining -= CollectionUtils.sum(tracks, (t) => t.usedBreadth);
     return Math.max(0, remaining);
   }
@@ -152,7 +149,7 @@
   void _computeUsedBreadthOfTracks(List<GridTrack> tracks) {
     // TODO(jmesserly): as a performance optimization we could cache this
     final items = view.childViews.map((view_) => view_.layout).toList();
-    CollectionUtils.sortBy(items, (item) => _getSpanCount(item));
+    CollectionUtils.sortBy(items, (item) => _getSpanCount(item)!);
 
     // 1. Initialize per Grid Track variables
     for (final t in tracks) {
@@ -224,7 +221,7 @@
     num finalPosition = position;
 
     for (int i = 0; i < tracks.length; i++) {
-      int startEdge = tracks[i].start;
+      int startEdge = tracks[i].start as int;
       int endEdge;
       if (i < tracks.length - 1) {
         endEdge = tracks[i + 1].start.round();
@@ -266,7 +263,7 @@
     CollectionUtils.sortBy(fractionTracks, (t) => t.tempBreadth);
 
     num spaceNeededFromFractionTracks = _getRemainingSpace(tracks);
-    num currentBandFractionBreadth = 0;
+    num? currentBandFractionBreadth = 0;
     num accumulatedFractions = 0;
     for (final t in fractionTracks) {
       if (t.tempBreadth != currentBandFractionBreadth) {
@@ -287,7 +284,7 @@
    * computed, updatedBreadth, that represents the Grid Track's share of
    * freeSpace.
    */
-  void _distributeSpaceToTracks(List<GridTrack> tracks, num freeSpace,
+  void _distributeSpaceToTracks(List<GridTrack?> tracks, num? freeSpace,
       _BreadthAccumulator breadth, bool ignoreMaxBreadth) {
     // TODO(jmesserly): in some cases it would be safe to sort the passed in
     // list in place. Not always though.
@@ -298,9 +295,9 @@
     // their maxBreadth values. Because there are different MaxBreadths
     // assigned to the different Grid Tracks, this can result in uneven growth.
     for (int i = 0; i < tracks.length; i++) {
-      num share = freeSpace / (tracks.length - i);
-      share = Math.min(share, tracks[i].maxBreadth);
-      tracks[i].tempBreadth = share;
+      num share = freeSpace! / (tracks.length - i);
+      share = Math.min(share, tracks[i]!.maxBreadth);
+      tracks[i]!.tempBreadth = share;
       freeSpace -= share;
     }
 
@@ -309,10 +306,10 @@
     // evenly and assign it to each Grid Track without regard for its
     // maxBreadth. This phase of growth will always be even, but only occurs
     // when the ignoreMaxBreadth flag is true.
-    if (freeSpace > 0 && ignoreMaxBreadth) {
+    if (freeSpace! > 0 && ignoreMaxBreadth) {
       for (int i = 0; i < tracks.length; i++) {
-        final share = freeSpace / (tracks.length - i);
-        tracks[i].tempBreadth += share;
+        final share = freeSpace! / (tracks.length - i);
+        tracks[i]!.tempBreadth = tracks[i]!.tempBreadth + share;
         freeSpace -= share;
       }
     }
@@ -320,7 +317,7 @@
     // Note: the spec has us updating all grid tracks, not just the passed in
     // tracks, but I think that's a spec bug.
     for (final t in tracks) {
-      t.updatedBreadth = Math.max(t.updatedBreadth, t.tempBreadth);
+      t!.updatedBreadth = Math.max(t.updatedBreadth, t.tempBreadth);
     }
   }
 
@@ -352,7 +349,7 @@
       // Remember that we need to update the sizes on these tracks
       tracks.addAll(spannedTracks);
 
-      // Each time we transition to a new spanCount, update any modified tracks
+      // Each time we transition to a spanCount, update any modified tracks
       bool spanCountFinished = false;
       if (i + 1 == items.length) {
         spanCountFinished = true;
@@ -362,7 +359,7 @@
 
       if (spanCountFinished) {
         for (final t in tracks) {
-          breadth.setSize(t, Math.max(breadth.getSize(t), t.updatedBreadth));
+          breadth.setSize(t, Math.max(breadth.getSize(t)!, t.updatedBreadth));
         }
         tracks = [];
       }
@@ -373,14 +370,14 @@
    * Returns true if we have an appropriate content sized dimension, and don't
    * cross a fractional track.
    */
-  static bool _hasContentSizedTracks(Iterable<GridTrack> tracks,
+  static bool _hasContentSizedTracks(Iterable<GridTrack?> tracks,
       ContentSizeMode sizeMode, _BreadthAccumulator breadth) {
     for (final t in tracks) {
       final fn = breadth.getSizingFunction(t);
       if (sizeMode == ContentSizeMode.MAX && fn.isMaxContentSized ||
           sizeMode == ContentSizeMode.MIN && fn.isContentSized) {
         // Make sure we don't cross a fractional track
-        return tracks.length == 1 || !tracks.any((t_) => t_.isFractional);
+        return tracks.length == 1 || !tracks.any((t_) => t_!.isFractional);
       }
     }
     return false;
@@ -400,7 +397,7 @@
     // Fill in tracks
     for (int i = first; i < length; i++) {
       if (tracks[i] == null) {
-        tracks[i] = new GridTrack(sizing);
+        tracks[i] = GridTrack(sizing);
       }
     }
   }
@@ -409,7 +406,7 @@
    * Scans children creating GridLayoutParams as needed, and creates all of the
    * rows and columns that we will need.
    *
-   * Note: this can potentially create new rows/columns, so this needs to be
+   * Note: this can potentially create new qrows/columns, so this needs to be
    * run before the track sizing algorithm.
    */
   void _ensureAllTracks() {
@@ -417,9 +414,9 @@
 
     for (final child in items) {
       if (child.layoutParams == null) {
-        final p = new GridLayoutParams(child.view, this);
-        _ensureTrack(_rowTracks, rowSizing, p.row, p.rowSpan);
-        _ensureTrack(_columnTracks, columnSizing, p.column, p.columnSpan);
+        final p = GridLayoutParams(child.view, this);
+        _ensureTrack(_rowTracks, rowSizing, p.row!, p.rowSpan!);
+        _ensureTrack(_columnTracks, columnSizing, p.column!, p.columnSpan!);
         child.layoutParams = p;
       }
       child.cacheExistingBrowserLayout();
@@ -433,12 +430,12 @@
     final items = view.childViews.map((view_) => view_.layout);
 
     for (final item in items) {
-      GridLayoutParams childLayout = item.layoutParams;
+      GridLayoutParams childLayout = item.layoutParams as GridLayoutParams;
       var xPos = _getTrackLocationX(childLayout);
       var yPos = _getTrackLocationY(childLayout);
 
-      int left = xPos.start, width = xPos.length;
-      int top = yPos.start, height = yPos.length;
+      int? left = xPos.start, width = xPos.length;
+      int? top = yPos.start, height = yPos.length;
 
       // Somewhat counterintuitively (at least to me):
       //   grid-col-align is the horizontal alignment
@@ -446,11 +443,11 @@
       xPos = childLayout.columnAlign.align(xPos, item.currentWidth);
       yPos = childLayout.rowAlign.align(yPos, item.currentHeight);
 
-      item.setBounds(xPos.start, yPos.start, xPos.length, yPos.length);
+      item.setBounds(xPos.start, yPos.start, xPos.length!, yPos.length!);
     }
   }
 
-  num _getGridContentSize() {
+  num? _getGridContentSize() {
     if (_dimension == Dimension.WIDTH) {
       return _gridWidth;
     } else if (_dimension == Dimension.HEIGHT) {
@@ -459,55 +456,52 @@
   }
 
   _GridLocation _getTrackLocationX(GridLayoutParams childLayout) {
-    int start = childLayout.column - 1;
-    int end = start + childLayout.columnSpan - 1;
+    int start = childLayout.column! - 1;
+    int end = start + childLayout.columnSpan! - 1;
 
-    start = _columnTracks[start].start;
-    end = _columnTracks[end].end;
+    start = _columnTracks[start].start as int;
+    end = _columnTracks[end].end as int;
 
-    return new _GridLocation(start, end - start);
+    return _GridLocation(start, end - start);
   }
 
   _GridLocation _getTrackLocationY(GridLayoutParams childLayout) {
-    int start = childLayout.row - 1;
-    int end = start + childLayout.rowSpan - 1;
+    int start = childLayout.row! - 1;
+    int end = start + childLayout.rowSpan! - 1;
 
-    start = _rowTracks[start].start;
-    end = _rowTracks[end].end;
+    start = _rowTracks[start].start as int;
+    end = _rowTracks[end].end as int;
 
-    return new _GridLocation(start, end - start);
+    return _GridLocation(start, end - start);
   }
 
   /** Gets the tracks that this item crosses. */
   // TODO(jmesserly): might be better to return an iterable
-  List<GridTrack> _getTracks(ViewLayout item) {
-    GridLayoutParams childLayout = item.layoutParams;
+  List<GridTrack?> _getTracks(ViewLayout item) {
+    GridLayoutParams? childLayout = item.layoutParams as GridLayoutParams?;
 
-    int start, span;
-    List<GridTrack> tracks;
+    int? start, span;
+    List<GridTrack>? tracks;
     if (_dimension == Dimension.WIDTH) {
-      start = childLayout.column - 1;
+      start = childLayout!.column! - 1;
       span = childLayout.columnSpan;
       tracks = _columnTracks;
     } else if (_dimension == Dimension.HEIGHT) {
-      start = childLayout.row - 1;
+      start = childLayout!.row! - 1;
       span = childLayout.rowSpan;
       tracks = _rowTracks;
     }
 
-    assert(start >= 0 && span >= 1);
+    assert(start! >= 0 && span! >= 1);
 
-    final result = new List<GridTrack>(span);
-    for (int i = 0; i < span; i++) {
-      result[i] = tracks[start + i];
-    }
+    final result = List<GridTrack>.generate(span!, (i) => tracks![start! + i]);
     return result;
   }
 
-  int _getSpanCount(ViewLayout item) {
-    GridLayoutParams childLayout = item.layoutParams;
+  int? _getSpanCount(ViewLayout item) {
+    GridLayoutParams? childLayout = item.layoutParams as GridLayoutParams?;
     return (_dimension == Dimension.WIDTH
-        ? childLayout.columnSpan
-        : childLayout.rowSpan);
+        ? childLayout!.columnSpan
+        : childLayout!.rowSpan);
   }
 }
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParams.dart b/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParams.dart
index f2de0f1..c47f2ca 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParams.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParams.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
-
 part of layout;
 
 /**
@@ -16,25 +14,24 @@
 // field ends up being mentioned 4 times instead of just twice.
 class GridLayoutParams extends LayoutParams {
   /** The coordinates of this item in the grid. */
-  int row;
-  int column;
-  int rowSpan;
-  int columnSpan;
-  int layer;
+  int? row;
+  int? column;
+  int? rowSpan;
+  int? columnSpan;
+  int? layer;
 
   /** Alignment within its box */
   GridItemAlignment rowAlign;
   GridItemAlignment columnAlign;
 
-  GridLayoutParams(Positionable view, GridLayout layout) : super(view.node) {
+  GridLayoutParams(Positionable view, GridLayout layout)
+      : rowAlign =
+            GridItemAlignment.fromString(view.customStyle['grid-row-align']),
+        columnAlign =
+            GridItemAlignment.fromString(view.customStyle['grid-column-align']),
+        super(view.node) {
     // TODO(jmesserly): this can be cleaned up a lot by just passing "view"
     // into the parsers.
-
-    rowAlign =
-        new GridItemAlignment.fromString(view.customStyle['grid-row-align']);
-    columnAlign =
-        new GridItemAlignment.fromString(view.customStyle['grid-column-align']);
-
     layer = StringUtils.parseInt(view.customStyle['grid-layer'], 0);
 
     rowSpan = StringUtils.parseInt(view.customStyle['grid-row-span']);
@@ -45,7 +42,7 @@
       row = line.start;
       if (line.length != null) {
         if (rowSpan != null) {
-          throw new UnsupportedError(
+          throw UnsupportedError(
               'grid-row-span cannot be with grid-row that defines an end');
         }
         rowSpan = line.length;
@@ -59,14 +56,14 @@
       column = line.start;
       if (line.length != null) {
         if (columnSpan != null) {
-          throw new UnsupportedError(
+          throw UnsupportedError(
               'grid-column-span cannot be with grid-column that defines an end');
         }
         columnSpan = line.length;
       }
     }
 
-    String cell = _GridTemplateParser.parseCell(view.customStyle['grid-cell']);
+    String? cell = _GridTemplateParser.parseCell(view.customStyle['grid-cell']);
     if (cell != null && cell != 'none') {
       // TODO(jmesserly): I didn't see anything spec'd about conflicts and
       // error handling. For now, throw an error on a misconfigured view.
@@ -76,16 +73,16 @@
           column != null ||
           rowSpan != null ||
           columnSpan != null) {
-        throw new UnsupportedError(
+        throw UnsupportedError(
             'grid-cell cannot be used with grid-row and grid-column');
       }
 
       if (layout.template == null) {
-        throw new UnsupportedError(
+        throw UnsupportedError(
             'grid-cell requires that grid-template is set on the parent');
       }
 
-      final rect = layout.template.lookupCell(cell);
+      final rect = layout.template!.lookupCell(cell);
       row = rect.row;
       column = rect.column;
       rowSpan = rect.rowSpan;
@@ -96,7 +93,7 @@
       if (columnSpan == null) columnSpan = 1;
 
       if (row == null && column == null) {
-        throw new UnsupportedError('grid-flow is not implemented' +
+        throw UnsupportedError('grid-flow is not implemented' +
             ' so at least one row or one column must be defined');
       }
 
@@ -104,6 +101,6 @@
       if (column == null) column = 1;
     }
 
-    assert(row > 0 && rowSpan > 0 && column > 0 && columnSpan > 0);
+    assert(row! > 0 && rowSpan! > 0 && column! > 0 && columnSpan! > 0);
   }
 }
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart b/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart
index 7cc87e8..009392a 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.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
-
 part of layout;
 
 /**
@@ -56,7 +54,7 @@
   }
 
   void _error(String msg) {
-    throw new SyntaxErrorException(msg, _src, _offset);
+    throw SyntaxErrorException(msg, _src, _offset);
   }
 
   int get length => _src.length;
@@ -132,7 +130,7 @@
     }
   }
 
-  String _maybeEatString() {
+  String? _maybeEatString() {
     // TODO(jmesserly): make this match CSS string parsing
     String quote = "'";
     if (!_maybeEat(quote)) {
@@ -171,7 +169,7 @@
   }
 
   /** Eats an integer. */
-  int _maybeEatInt() {
+  int? _maybeEatInt() {
     int start = _offset;
     bool dot = false;
     while (_offset < length && _isDigit(_peekChar())) {
@@ -186,8 +184,8 @@
   }
 
   /** Eats an integer. */
-  int _eatInt() {
-    int result = _maybeEatInt();
+  int? _eatInt() {
+    int? result = _maybeEatInt();
     if (result == null) {
       _error('expected positive integer');
     }
@@ -224,37 +222,37 @@
   _GridTemplateParser._internal(String src) : super(src);
 
   /** Parses the grid-rows and grid-columns CSS properties into object form. */
-  static GridTemplate parse(String str) {
+  static GridTemplate? parse(String? str) {
     if (str == null) return null;
-    final p = new _GridTemplateParser._internal(str);
+    final p = _GridTemplateParser._internal(str);
     final result = p._parseTemplate();
     p._eatEnd();
     return result;
   }
 
   /** Parses a grid-cell value. */
-  static String parseCell(String str) {
+  static String? parseCell(String? str) {
     if (str == null) return null;
-    final p = new _GridTemplateParser._internal(str);
+    final p = _GridTemplateParser._internal(str);
     final result = p._maybeEatString();
     p._eatEnd();
     return result;
   }
 
   // => <string>+ | 'none'
-  GridTemplate _parseTemplate() {
+  GridTemplate? _parseTemplate() {
     if (_maybeEat('none')) {
       return null;
     }
-    final rows = new List<String>();
-    String row;
+    final rows = <String?>[];
+    String? row;
     while ((row = _maybeEatString()) != null) {
       rows.add(row);
     }
     if (rows.length == 0) {
       _error('expected at least one cell, or "none"');
     }
-    return new GridTemplate(rows);
+    return GridTemplate(rows);
   }
 }
 
@@ -263,9 +261,9 @@
   _GridItemParser._internal(String src) : super(src);
 
   /** Parses the grid-rows and grid-columns CSS properties into object form. */
-  static _GridLocation parse(String cell, GridTrackList list) {
+  static _GridLocation? parse(String? cell, GridTrackList? list) {
     if (cell == null) return null;
-    final p = new _GridItemParser._internal(cell);
+    final p = _GridItemParser._internal(cell);
     final result = p._parseTrack(list);
     p._eatEnd();
     return result;
@@ -274,27 +272,27 @@
   // [ [ <integer> | <string> | 'start' | 'end' ]
   //   [ <integer> | <string> | 'start' | 'end' ]? ]
   // | 'auto'
-  _GridLocation _parseTrack(GridTrackList list) {
+  _GridLocation? _parseTrack(GridTrackList? list) {
     if (_maybeEat('auto')) {
       return null;
     }
-    int start = _maybeParseLine(list);
+    int? start = _maybeParseLine(list);
     if (start == null) {
       _error('expected row/column number or name');
     }
-    int end = _maybeParseLine(list);
-    int span = null;
+    int? end = _maybeParseLine(list);
+    int? span = null;
     if (end != null) {
-      span = end - start;
+      span = end - start!;
       if (span <= 0) {
         _error('expected row/column span to be a positive integer');
       }
     }
-    return new _GridLocation(start, span);
+    return _GridLocation(start, span);
   }
 
   // [ <integer> | <string> | 'start' | 'end' ]
-  int _maybeParseLine(GridTrackList list) {
+  int? _maybeParseLine(GridTrackList? list) {
     if (_maybeEat('start')) {
       return 1;
     } else if (_maybeEat('end')) {
@@ -303,14 +301,14 @@
       // TODO(jmesserly): this won't interact properly with implicit
       // rows/columns. Instead it will snap to the number of tracks at the point
       // where it is evaluated.
-      return list.tracks.length + 1;
+      return list!.tracks.length + 1;
     }
 
-    String name = _maybeEatString();
+    String? name = _maybeEatString();
     if (name == null) {
       return _maybeEatInt();
     } else {
-      int edge = list.lineNames[name];
+      int? edge = list!.lineNames[name];
       if (edge == null) {
         _error('row/column name "$name" not found in the parent\'s '
             ' grid-row/grid-columns properties');
@@ -329,17 +327,17 @@
 // CSS units, support for all escape sequences, etc.
 class _GridTrackParser extends _Parser {
   final List<GridTrack> _tracks;
-  final Map<String, int> _lineNames;
+  final Map<String?, int> _lineNames;
 
   _GridTrackParser._internal(String src)
-      : _tracks = new List<GridTrack>(),
-        _lineNames = new Map<String, int>(),
+      : _tracks = <GridTrack>[],
+        _lineNames = Map<String?, int>(),
         super(src);
 
   /** Parses the grid-rows and grid-columns CSS properties into object form. */
-  static GridTrackList parse(String str) {
+  static GridTrackList? parse(String? str) {
     if (str == null) return null;
-    final p = new _GridTrackParser._internal(str);
+    final p = _GridTrackParser._internal(str);
     final result = p._parseTrackList();
     p._eatEnd();
     return result;
@@ -349,28 +347,28 @@
    * Parses the grid-row-sizing and grid-column-sizing CSS properties into
    * object form.
    */
-  static TrackSizing parseTrackSizing(String str) {
+  static TrackSizing parseTrackSizing(String? str) {
     if (str == null) str = 'auto';
-    final p = new _GridTrackParser._internal(str);
+    final p = _GridTrackParser._internal(str);
     final result = p._parseTrackMinmax();
     p._eatEnd();
     return result;
   }
 
   // <track-list> => [ [ <string> ]* <track-group> [ <string> ]* ]+ | 'none'
-  GridTrackList _parseTrackList() {
+  GridTrackList? _parseTrackList() {
     if (_maybeEat('none')) {
       return null;
     }
     _parseTrackListHelper();
-    return new GridTrackList(_tracks, _lineNames);
+    return GridTrackList(_tracks, _lineNames);
   }
 
   /** Code shared by _parseTrackList and _parseTrackGroup */
-  void _parseTrackListHelper([List<GridTrack> resultTracks = null]) {
+  void _parseTrackListHelper([List<GridTrack>? resultTracks = null]) {
     _maybeEatWhitespace();
     while (!endOfInput) {
-      String name;
+      String? name;
       while ((name = _maybeEatString()) != null) {
         _lineNames[name] = _tracks.length + 1; // should be 1-based
       }
@@ -384,7 +382,7 @@
         if (_peekChar() == _Parser.R_PAREN) {
           return;
         }
-        resultTracks.add(new GridTrack(_parseTrackMinmax()));
+        resultTracks.add(GridTrack(_parseTrackMinmax()));
       } else {
         _parseTrackGroup();
       }
@@ -398,11 +396,11 @@
   //                  | <track-minmax>
   void _parseTrackGroup() {
     if (_maybeEat('(')) {
-      final tracks = new List<GridTrack>();
+      final tracks = <GridTrack>[];
       _parseTrackListHelper(tracks);
       _eat(')');
       if (_maybeEat('[')) {
-        num expand = _eatInt();
+        num expand = _eatInt()!;
         _eat(']');
 
         if (expand <= 0) {
@@ -419,7 +417,7 @@
         }
       }
     } else {
-      _tracks.add(new GridTrack(_parseTrackMinmax()));
+      _tracks.add(GridTrack(_parseTrackMinmax()));
     }
   }
 
@@ -434,10 +432,10 @@
       _eat(',');
       final max = _parseTrackBreadth();
       _eat(')');
-      return new TrackSizing(min, max);
+      return TrackSizing(min, max);
     } else {
       final breadth = _parseTrackBreadth();
-      return new TrackSizing(breadth, breadth);
+      return TrackSizing(breadth, breadth);
     }
   }
 
@@ -460,9 +458,9 @@
     }
 
     if (units == 'fr') {
-      return new FractionSizing(value);
+      return FractionSizing(value);
     } else {
-      return new FixedSizing(value, units);
+      return FixedSizing(value, units);
     }
   }
 }
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/GridTracks.dart b/samples-dev/swarm/swarm_ui_lib/layout/GridTracks.dart
index 2fa6eb9..8baa1fb 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/GridTracks.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/GridTracks.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
-
 part of layout;
 
 // This file has classes representing the grid tracks and grid template
@@ -21,7 +19,7 @@
    * is used as a start or end, it might be interpreted exclusively or
    * inclusively.
    */
-  final Map<String, int> lineNames;
+  final Map<String?, int> lineNames;
 
   GridTrackList(this.tracks, this.lineNames) {}
 }
@@ -32,15 +30,15 @@
    * The start position of this track. Equal to the sum of previous track's
    * usedBreadth.
    */
-  num start;
+  late num start;
 
   /** The final computed breadth of this track. */
-  num usedBreadth;
+  late num usedBreadth;
 
   // Fields used internally by the sizing algorithm
-  num maxBreadth;
-  num updatedBreadth;
-  num tempBreadth;
+  late num maxBreadth;
+  late num updatedBreadth;
+  late num tempBreadth;
 
   final TrackSizing sizing;
 
@@ -50,7 +48,7 @@
    * Support for the feature that repeats rows and columns, e.g.
    * [:grid-columns: 10px ("content" 250px 10px)[4]:]
    */
-  GridTrack clone() => new GridTrack(sizing.clone());
+  GridTrack clone() => GridTrack(sizing.clone());
 
   /** The min sizing function for the track. */
   SizingFunction get minSizing => sizing.min;
@@ -69,7 +67,7 @@
   final String value;
 
   // 'start' | 'end' | 'center' | 'stretch'
-  GridItemAlignment.fromString(String value)
+  GridItemAlignment.fromString(String? value)
       : this.value = (value == null) ? 'stretch' : value {
     switch (this.value) {
       case 'start':
@@ -78,24 +76,25 @@
       case 'stretch':
         break;
       default:
-        throw new UnsupportedError('invalid row/column alignment "$value"');
+        throw UnsupportedError('invalid row/column alignment "$value"');
     }
   }
 
-  _GridLocation align(_GridLocation span, int size) {
+  _GridLocation align(_GridLocation span, int? size) {
     switch (value) {
       case 'start':
-        return new _GridLocation(span.start, size);
+        return _GridLocation(span.start, size);
       case 'end':
-        return new _GridLocation(span.end - size, size);
+        return _GridLocation(span.end - size!, size);
       case 'center':
-        size = Math.min(size, span.length);
-        num center = span.start + span.length / 2;
+        size = Math.min(size!, span.length!);
+        num center = span.start! + span.length! / 2;
         num left = center - size / 2;
-        return new _GridLocation(left.round(), size);
+        return _GridLocation(left.round(), size);
       case 'stretch':
         return span;
     }
+    throw UnsupportedError('invalid row/column alignment "$value"');
   }
 }
 
@@ -107,23 +106,23 @@
   final Map<int, _GridTemplateRect> _rects;
   final int _numRows;
 
-  GridTemplate(List<String> rows)
-      : _rects = new Map<int, _GridTemplateRect>(),
+  GridTemplate(List<String?> rows)
+      : _rects = <int, _GridTemplateRect>{},
         _numRows = rows.length {
     _buildRects(rows);
   }
 
   /** Scans the template strings and computes bounds for each one. */
-  void _buildRects(List<String> templateRows) {
+  void _buildRects(List<String?> templateRows) {
     for (int r = 0; r < templateRows.length; r++) {
-      String row = templateRows[r];
+      String row = templateRows[r]!;
       for (int c = 0; c < row.length; c++) {
         int cell = row.codeUnitAt(c);
         final rect = _rects[cell];
         if (rect != null) {
           rect.add(r + 1, c + 1);
         } else {
-          _rects[cell] = new _GridTemplateRect(cell, r + 1, c + 1);
+          _rects[cell] = _GridTemplateRect(cell, r + 1, c + 1);
         }
       }
     }
@@ -139,12 +138,12 @@
    */
   _GridTemplateRect lookupCell(String cell) {
     if (cell.length != 1) {
-      throw new UnsupportedError(
+      throw UnsupportedError(
           'grid-cell "$cell" must be a one character string');
     }
     final rect = _rects[cell.codeUnitAt(0)];
     if (rect == null) {
-      throw new UnsupportedError(
+      throw UnsupportedError(
           'grid-cell "$cell" not found in parent\'s grid-template');
     }
     return rect;
@@ -171,8 +170,8 @@
     if (expected != _count) {
       // TODO(jmesserly): not sure if we should throw here, due to CSS's
       // permissiveness. At the moment we're noisy about errors.
-      String cell = new String.fromCharCodes([_char]);
-      throw new UnsupportedError('grid-template "$cell"'
+      String cell = String.fromCharCodes([_char]);
+      throw UnsupportedError('grid-template "$cell"'
           ' is not square, expected $expected cells but got $_count');
     }
   }
@@ -183,8 +182,8 @@
  * grid-column during parsing.
  */
 class _GridLocation {
-  final int start, length;
+  final int? start, length;
   _GridLocation(this.start, this.length) {}
 
-  int get end => start + length;
+  int get end => start! + length!;
 }
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart b/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart
index 56e25b3..bc4258a 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.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
-
 part of layout;
 
 // This file has classes representing the grid sizing functions
@@ -20,7 +18,7 @@
   bool get isMaxContentSized => false;
   bool get isFraction => false;
 
-  num resolveLength(num gridSize) => 0;
+  num resolveLength(num? gridSize) => 0;
 
   num get fractionValue => 0;
 
@@ -46,16 +44,16 @@
   FixedSizing(this.length, [this.units = 'px']) : _contentSized = false {
     if (units != 'px' && units != '%') {
       // TODO(jmesserly): support other unit types
-      throw new UnsupportedError('Units other than px and %');
+      throw UnsupportedError('Units other than px and %');
     }
   }
 
   // TODO(jmesserly): this is only needed because of our mutable property
-  FixedSizing clone() => new FixedSizing(length, units);
+  FixedSizing clone() => FixedSizing(length, units);
 
   bool get isMinContentSized => _contentSized;
 
-  num resolveLength(num gridSize) {
+  num resolveLength(num? gridSize) {
     if (units == '%') {
       if (gridSize == null) {
         // Use content size when the grid doesn't have an absolute size in this
@@ -120,38 +118,38 @@
   TrackSizing(this.min, this.max) {}
 
   // TODO(jmesserly): this is only needed because FixedSizing is mutable
-  TrackSizing clone() => new TrackSizing(min.clone(), max.clone());
+  TrackSizing clone() => TrackSizing(min.clone(), max.clone());
 }
 
 /** Represents a GridTrack breadth property. */
 // TODO(jmesserly): these classes could be replaced with reflection/mirrors
 abstract class _BreadthAccumulator {
-  void setSize(GridTrack t, num value);
-  num getSize(GridTrack t);
+  void setSize(GridTrack? t, num value);
+  num? getSize(GridTrack? t);
 
-  SizingFunction getSizingFunction(GridTrack t);
+  SizingFunction getSizingFunction(GridTrack? t);
 }
 
 class _UsedBreadthAccumulator implements _BreadthAccumulator {
   const _UsedBreadthAccumulator();
 
-  void setSize(GridTrack t, num value) {
-    t.usedBreadth = value;
+  void setSize(GridTrack? t, num value) {
+    t!.usedBreadth = value;
   }
 
-  num getSize(GridTrack t) => t.usedBreadth;
+  num? getSize(GridTrack? t) => t!.usedBreadth;
 
-  SizingFunction getSizingFunction(GridTrack t) => t.minSizing;
+  SizingFunction getSizingFunction(GridTrack? t) => t!.minSizing;
 }
 
 class _MaxBreadthAccumulator implements _BreadthAccumulator {
   const _MaxBreadthAccumulator();
 
-  void setSize(GridTrack t, num value) {
-    t.maxBreadth = value;
+  void setSize(GridTrack? t, num value) {
+    t!.maxBreadth = value;
   }
 
-  num getSize(GridTrack t) => t.maxBreadth;
+  num? getSize(GridTrack? t) => t!.maxBreadth;
 
-  SizingFunction getSizingFunction(GridTrack t) => t.maxSizing;
+  SizingFunction getSizingFunction(GridTrack? t) => t!.maxSizing;
 }
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/ViewLayout.dart b/samples-dev/swarm/swarm_ui_lib/layout/ViewLayout.dart
index aa0c3e9..5c284e1 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/ViewLayout.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/ViewLayout.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
-
 part of layout;
 
 /** The interface that the layout algorithms use to talk to the view. */
@@ -30,9 +28,9 @@
 class LayoutParams {
   // TODO(jmesserly): should be const, but there's a bug in DartC preventing us
   // from calling "window." in an initializer. See b/5332777
-  CssStyleDeclaration style;
+  CssStyleDeclaration? style;
 
-  int get layer => 0;
+  int? get layer => 0;
 
   LayoutParams(Element node) {
     style = node.getComputedStyle();
@@ -73,9 +71,9 @@
    * The layout parameters associated with this view and used by the parent
    * to determine how this view should be laid out.
    */
-  LayoutParams layoutParams;
-  int _offsetWidth;
-  int _offsetHeight;
+  LayoutParams? layoutParams;
+  int? _offsetWidth;
+  int? _offsetHeight;
 
   /** The view that this layout belongs to. */
   final Positionable view;
@@ -85,7 +83,7 @@
    * properties in the first pass while computing positions. Then we have a
    * second pass that actually moves everything.
    */
-  int _measuredLeft, _measuredTop, _measuredWidth, _measuredHeight;
+  int? _measuredLeft, _measuredTop, _measuredWidth, _measuredHeight;
 
   ViewLayout(this.view);
 
@@ -96,9 +94,9 @@
   // registered with a LayoutProvider.
   factory ViewLayout.fromView(Positionable view) {
     if (hasCustomLayout(view)) {
-      return new GridLayout(view);
+      return GridLayout(view);
     } else {
-      return new ViewLayout(view);
+      return ViewLayout(view);
     }
   }
 
@@ -106,36 +104,36 @@
     return view.customStyle['display'] == "-dart-grid";
   }
 
-  CssStyleDeclaration get _style => layoutParams.style;
+  CssStyleDeclaration? get _style => layoutParams!.style;
 
   void cacheExistingBrowserLayout() {
-    _offsetWidth = view.node.offset.width;
-    _offsetHeight = view.node.offset.height;
+    _offsetWidth = view.node.offset.width as int?;
+    _offsetHeight = view.node.offset.height as int?;
   }
 
-  int get currentWidth {
+  int? get currentWidth {
     return _offsetWidth;
   }
 
-  int get currentHeight {
+  int? get currentHeight {
     return _offsetHeight;
   }
 
-  int get borderLeftWidth => _toPixels(_style.borderLeftWidth);
-  int get borderTopWidth => _toPixels(_style.borderTopWidth);
-  int get borderRightWidth => _toPixels(_style.borderRightWidth);
-  int get borderBottomWidth => _toPixels(_style.borderBottomWidth);
+  int get borderLeftWidth => _toPixels(_style!.borderLeftWidth);
+  int get borderTopWidth => _toPixels(_style!.borderTopWidth);
+  int get borderRightWidth => _toPixels(_style!.borderRightWidth);
+  int get borderBottomWidth => _toPixels(_style!.borderBottomWidth);
   int get borderWidth => borderLeftWidth + borderRightWidth;
   int get borderHeight => borderTopWidth + borderBottomWidth;
 
   /** Implements the custom layout computation. */
-  void measureLayout(Future<Size> size, Completer<bool> changed) {}
+  void measureLayout(Future<Size> size, Completer<bool>? changed) {}
 
   /**
    * Positions the view within its parent container.
    * Also performs a layout of its children.
    */
-  void setBounds(int left, int top, int width, int height) {
+  void setBounds(int? left, int? top, int width, int height) {
     assert(width >= 0 && height >= 0);
 
     _measuredLeft = left;
@@ -144,8 +142,8 @@
     // Note: we need to save the client height
     _measuredWidth = width - borderWidth;
     _measuredHeight = height - borderHeight;
-    final completer = new Completer<Size>();
-    completer.complete(new Size(_measuredWidth, _measuredHeight));
+    final completer = Completer<Size>();
+    completer.complete(Size(_measuredWidth!, _measuredHeight!));
     measureLayout(completer.future, null);
   }
 
@@ -159,7 +157,7 @@
       style.top = '${_measuredTop}px';
       style.width = '${_measuredWidth}px';
       style.height = '${_measuredHeight}px';
-      style.zIndex = '${layoutParams.layer}';
+      style.zIndex = '${layoutParams!.layer}';
 
       _measuredLeft = null;
       _measuredTop = null;
@@ -181,8 +179,8 @@
     }
   }
 
-  int measureContent(ViewLayout parent, Dimension dimension,
-      [ContentSizeMode mode = null]) {
+  int? measureContent(ViewLayout parent, Dimension? dimension,
+      [ContentSizeMode? mode = null]) {
     if (dimension == Dimension.WIDTH) {
       return measureWidth(parent, mode);
     } else if (dimension == Dimension.HEIGHT) {
@@ -190,23 +188,23 @@
     }
   }
 
-  int measureWidth(ViewLayout parent, ContentSizeMode mode) {
-    final style = layoutParams.style;
+  int? measureWidth(ViewLayout parent, ContentSizeMode? mode) {
+    final style = layoutParams!.style;
     if (mode == ContentSizeMode.MIN) {
-      return _styleToPixels(style.minWidth, currentWidth, parent.currentWidth);
+      return _styleToPixels(style!.minWidth, currentWidth, parent.currentWidth);
     } else if (mode == ContentSizeMode.MAX) {
-      return _styleToPixels(style.maxWidth, currentWidth, parent.currentWidth);
+      return _styleToPixels(style!.maxWidth, currentWidth, parent.currentWidth);
     }
   }
 
-  int measureHeight(ViewLayout parent, ContentSizeMode mode) {
-    final style = layoutParams.style;
+  int? measureHeight(ViewLayout parent, ContentSizeMode? mode) {
+    final style = layoutParams!.style;
     if (mode == ContentSizeMode.MIN) {
       return _styleToPixels(
-          style.minHeight, currentHeight, parent.currentHeight);
+          style!.minHeight, currentHeight, parent.currentHeight);
     } else if (mode == ContentSizeMode.MAX) {
       return _styleToPixels(
-          style.maxHeight, currentHeight, parent.currentHeight);
+          style!.maxHeight, currentHeight, parent.currentHeight);
     }
   }
 
@@ -215,19 +213,18 @@
       return int.parse(style.substring(0, style.length - 2));
     } else {
       // TODO(jmesserly): other size units
-      throw new UnsupportedError(
-          'Unknown min/max content size format: "$style"');
+      throw UnsupportedError('Unknown min/max content size format: "$style"');
     }
   }
 
-  static int _styleToPixels(String style, num size, num parentSize) {
+  static int? _styleToPixels(String style, num? size, num? parentSize) {
     if (style == 'none') {
       // For an unset max-content size, use the actual size
-      return size;
+      return size as int?;
     }
     if (style.endsWith('%')) {
       num percent = double.parse(style.substring(0, style.length - 1));
-      return ((percent / 100) * parentSize).toInt();
+      return ((percent / 100) * parentSize!).toInt();
     }
     return _toPixels(style);
   }
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/layout.dart b/samples-dev/swarm/swarm_ui_lib/layout/layout.dart
index ddc5bb1..b060c6e 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/layout.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/layout.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 layout;
 
 import 'dart:async';
diff --git a/samples-dev/swarm/swarm_ui_lib/util/CollectionUtils.dart b/samples-dev/swarm/swarm_ui_lib/util/CollectionUtils.dart
index 546d126..bba7cf2 100644
--- a/samples-dev/swarm/swarm_ui_lib/util/CollectionUtils.dart
+++ b/samples-dev/swarm/swarm_ui_lib/util/CollectionUtils.dart
@@ -80,9 +80,9 @@
   }
 
   /** Orders an iterable by its values, or by a key selector. */
-  static List orderBy(Iterable source,
+  static List<T> orderBy<T>(Iterable<T> source,
       [NumericValueSelector? selector = null]) {
-    final result = List.from(source);
+    final result = List<T>.from(source);
     sortBy(result, selector);
     return result;
   }
diff --git a/tools/VERSION b/tools/VERSION
index 9f203d5..4a55559 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 202
+PRERELEASE 203
 PRERELEASE_PATCH 0
\ No newline at end of file