Version 2.10.0-20.0.dev

Merge commit '4049442385fc06af9742a763e1717e3348754898' into 'dev'
diff --git a/DEPS b/DEPS
index 2906f58..92fa1ff 100644
--- a/DEPS
+++ b/DEPS
@@ -48,7 +48,7 @@
   "co19_2_rev": "e48b3090826cf40b8037648f19d211e8eab1b4b6",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
-  "benchmarks_internal_rev": "991d4cb32af0e914763ebbdeced91395bed874d8",
+  "benchmarks_internal_rev": "760986cf29594acf424ee6e8af23a4322825935a",
   "checkout_benchmarks_internal": False,
 
   # As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index 27138b1..72328fa 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -17,6 +17,7 @@
 import 'package:analysis_server/src/services/correction/dart/convert_to_contains.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_generic_function_syntax.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_if_null.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_where_type.dart';
 import 'package:analysis_server/src/services/correction/dart/create_method.dart';
 import 'package:analysis_server/src/services/correction/dart/make_final.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_argument.dart';
@@ -42,6 +43,7 @@
 import 'package:analysis_server/src/services/correction/dart/replace_with_var.dart';
 import 'package:analysis_server/src/services/correction/dart/use_curly_braces.dart';
 import 'package:analysis_server/src/services/correction/dart/use_is_not_empty.dart';
+import 'package:analysis_server/src/services/correction/dart/use_rethrow.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
@@ -90,6 +92,7 @@
     LintNames.prefer_if_null_operators: ConvertToIfNull.newInstance,
     LintNames.prefer_is_empty: ReplaceWithIsEmpty.newInstance,
     LintNames.prefer_is_not_empty: UesIsNotEmpty.newInstance,
+    LintNames.prefer_iterable_whereType: ConvertToWhereType.newInstance,
     LintNames.prefer_single_quotes: ConvertToSingleQuotes.newInstance,
     LintNames.prefer_spread_collections: ConvertAddAllToSpread.newInstance,
     LintNames.slash_for_doc_comments: ConvertDocumentationIntoLine.newInstance,
@@ -100,6 +103,7 @@
     LintNames.unnecessary_new: RemoveUnnecessaryNew.newInstance,
     LintNames.unnecessary_overrides: RemoveMethodDeclaration.newInstance,
     LintNames.unnecessary_this: RemoveThisExpression.newInstance,
+    LintNames.use_rethrow_when_possible: UseRethrow.newInstance,
   };
 
   /// A map from an error code to a generator used to create the correction
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_where_type_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_where_type_test.dart
new file mode 100644
index 0000000..12bc2eb
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_where_type_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2020, 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/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToWhereTypeTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToWhereTypeTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.prefer_iterable_whereType;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+Iterable<C> f(List<Object> list) {
+  return list.where((e) => e is C);
+}
+Iterable<C> f2(List<Object> list) =>
+  list.where((e) => e is C);
+
+class C {}
+''');
+    await assertHasFix('''
+Iterable<C> f(List<Object> list) {
+  return list.whereType<C>();
+}
+Iterable<C> f2(List<Object> list) =>
+  list.whereType<C>();
+
+class C {}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
index 3524501..b7a2148 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
@@ -16,6 +16,7 @@
 import 'convert_to_single_quoted_strings_test.dart'
     as convert_to_single_quoted_strings;
 import 'convert_to_spread_test.dart' as convert_to_spread;
+import 'convert_to_where_type_test.dart' as convert_to_where_type;
 import 'create_method_test.dart' as create_method;
 import 'make_final_test.dart' as make_final;
 import 'remove_argument_test.dart' as remove_argument;
@@ -42,6 +43,7 @@
 import 'replace_with_var_test.dart' as replace_with_var;
 import 'use_curly_braces_test.dart' as use_curly_braces;
 import 'use_is_not_empty_test.dart' as use_is_not_empty;
+import 'use_rethrow_test.dart' as use_rethrow;
 
 void main() {
   defineReflectiveSuite(() {
@@ -54,6 +56,7 @@
     convert_to_if_null.main();
     convert_to_single_quoted_strings.main();
     convert_to_spread.main();
+    convert_to_where_type.main();
     create_method.main();
     make_final.main();
     remove_argument.main();
@@ -78,5 +81,6 @@
     replace_with_var.main();
     use_curly_braces.main();
     use_is_not_empty.main();
+    use_rethrow.main();
   }, name: 'bulk');
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/use_rethrow_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/use_rethrow_test.dart
new file mode 100644
index 0000000..967d352
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/use_rethrow_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2020, 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/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UseRethrowTest);
+  });
+}
+
+@reflectiveTest
+class UseRethrowTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.use_rethrow_when_possible;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+void f() {
+  try {} catch (e) {
+    throw e;
+  }
+}
+
+void f2() {
+  try {} catch (e, stackTrace) {
+    print(stackTrace);
+    throw e;
+  }
+}
+''');
+    await assertHasFix('''
+void f() {
+  try {} catch (e) {
+    rethrow;
+  }
+}
+
+void f2() {
+  try {} catch (e, stackTrace) {
+    print(stackTrace);
+    rethrow;
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index e891a3e..91f08b0 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -2584,8 +2584,12 @@
               [variable.name.name]);
         } else {
           var variableElement = variable.declaredElement;
-          if (variableElement is FieldElement && variableElement.isAbstract) {
-            // Abstract fields can't be initialized, so no error.
+          if (variableElement is FieldElement &&
+              (variableElement.isAbstract || variableElement.isExternal)) {
+            // Abstract and external fields can't be initialized, so no error.
+          } else if (variableElement is TopLevelVariableElement &&
+              variableElement.isExternal) {
+            // External top level variables can't be initialized, so no error.
           } else if (!_isNonNullableByDefault || !variable.isLate) {
             _errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.FINAL_NOT_INITIALIZED,
diff --git a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
index 46d0ab5..1f5e0cb 100644
--- a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/dart/ast/element_locator.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -18,11 +17,6 @@
 
 @reflectiveTest
 class ElementLocatorTest extends PubPackageResolutionTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions {
-    return AnalysisOptionsImpl()..hint = false;
-  }
-
   test_locate_AssignmentExpression() async {
     await resolveTestCode(r'''
 int x = 0;
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index fceef52..e97c021 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -351,11 +351,17 @@
 
   void writeTestPackageConfig(
     PackageConfigFileBuilder config, {
+    String languageVersion,
     bool js = false,
     bool meta = false,
   }) {
     config = config._copy();
-    config.add(name: 'test', rootPath: testPackageRootPath);
+
+    config.add(
+      name: 'test',
+      rootPath: testPackageRootPath,
+      languageVersion: languageVersion,
+    );
 
     if (js) {
       var jsPath = '/packages/js';
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
index 502b7bb..35822d2 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
@@ -148,6 +148,17 @@
 ''');
   }
 
+  test_set_external_variable_final_invalid() async {
+    await assertErrorsInCode('''
+external final int x;
+void f(int value) {
+  x = value;
+}
+''', [
+      error(CompileTimeErrorCode.ASSIGNMENT_TO_FINAL_LOCAL, 44, 1),
+    ]);
+  }
+
   test_topLevelVariable_late() async {
     await assertNoErrorsInCode('''
 late final int a;
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart
index b93d824..ddf030f 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart
@@ -98,4 +98,44 @@
 }
 ''');
   }
+
+  test_set_external_field_final_invalid() async {
+    await assertErrorsInCode('''
+class A {
+  external final int x;
+}
+void f(A a, int x) {
+  a.x = x;
+}
+''', [
+      error(CompileTimeErrorCode.ASSIGNMENT_TO_FINAL, 61, 1),
+    ]);
+  }
+
+  test_set_external_field_final_overridden_valid() async {
+    await assertNoErrorsInCode('''
+class A {
+  external final int x;
+}
+abstract class B extends A {
+  void set x(int value);
+}
+void f(B b, int x) {
+  b.x = x; // ok because setter provided in derived class
+}
+''');
+  }
+
+  test_set_external_static_field_final_invalid() async {
+    await assertErrorsInCode('''
+class A {
+  external static final int x;
+}
+void f(int x) {
+  A.x = x;
+}
+''', [
+      error(CompileTimeErrorCode.ASSIGNMENT_TO_FINAL, 63, 1),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart b/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart
index c85acdb..73c8ee9 100644
--- a/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart
@@ -68,4 +68,20 @@
           text: "'x' must have a method body because 'A' isn't abstract."),
     ]);
   }
+
+  test_external_field() async {
+    await assertNoErrorsInCode('''
+class A {
+  external int? x;
+}
+''');
+  }
+
+  test_external_field_final() async {
+    await assertNoErrorsInCode('''
+class A {
+  external final int? x;
+}
+''');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
index 54cccca..a2d7705 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -13,14 +10,94 @@
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(ConstEvalThrowsExceptionTest_language24);
     defineReflectiveTests(ConstEvalThrowsExceptionTest);
     defineReflectiveTests(ConstEvalThrowsExceptionWithNullSafetyTest);
-    defineReflectiveTests(ConstEvalThrowsExceptionWithConstantUpdateTest);
   });
 }
 
 @reflectiveTest
-class ConstEvalThrowsExceptionTest extends PubPackageResolutionTest {
+class ConstEvalThrowsExceptionTest extends PubPackageResolutionTest
+    with ConstEvalThrowsExceptionTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+
+  test_binaryMinus_null() async {
+    await assertErrorsInCode('''
+const dynamic D = null;
+const C = D - 5;
+''', [
+      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
+    ]);
+
+    await assertErrorsInCode('''
+const dynamic D = null;
+const C = 5 - D;
+''', [
+      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
+    ]);
+  }
+
+  test_binaryPlus_null() async {
+    await assertErrorsInCode('''
+const dynamic D = null;
+const C = D + 5;
+''', [
+      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
+    ]);
+
+    await assertErrorsInCode('''
+const dynamic D = null;
+const C = 5 + D;
+''', [
+      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
+    ]);
+  }
+
+  test_eqEq_nonPrimitiveRightOperand() async {
+    await assertNoErrorsInCode('''
+const c = const T.eq(1, const Object());
+class T {
+  final Object value;
+  const T.eq(Object o1, Object o2) : value = o1 == o2;
+}
+''');
+  }
+
+  test_fromEnvironment_ifElement() async {
+    await assertNoErrorsInCode('''
+const b = bool.fromEnvironment('foo');
+
+main() {
+  const l1 = [1, 2, 3];
+  const l2 = [if (b) ...l1];
+  print(l2);
+}
+''');
+  }
+}
+
+@reflectiveTest
+class ConstEvalThrowsExceptionTest_language24 extends PubPackageResolutionTest
+    with ConstEvalThrowsExceptionTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+@reflectiveTest
+mixin ConstEvalThrowsExceptionTestCases on PubPackageResolutionTest {
+  /// The expected state of this feature in the test.
+  bool get _constant_update_2018;
+
   test_assertInitializerThrows() async {
     await assertErrorsInCode(r'''
 class A {
@@ -206,7 +283,7 @@
 const dynamic nil = null;
 const c = [if (1 < 0) nil + 1];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 37, 18),
@@ -219,7 +296,7 @@
 const dynamic nonBool = 3;
 const c = const [if (nonBool) 'a'];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 48, 7),
               ]
@@ -235,7 +312,7 @@
 const dynamic nonBool = null;
 const c = const {if (nonBool) 'a' : 1};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 51, 7),
               ]
@@ -251,7 +328,7 @@
 const dynamic nonBool = 'a';
 const c = const {if (nonBool) 3};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 50, 7),
               ]
@@ -267,7 +344,7 @@
 const dynamic nil = null;
 const c = [if (0 < 1) 3 else nil + 1];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 37, 25),
@@ -362,70 +439,6 @@
 }
 
 @reflectiveTest
-class ConstEvalThrowsExceptionWithConstantUpdateTest
-    extends ConstEvalThrowsExceptionTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-
-  test_binaryMinus_null() async {
-    await assertErrorsInCode('''
-const dynamic D = null;
-const C = D - 5;
-''', [
-      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
-    ]);
-
-    await assertErrorsInCode('''
-const dynamic D = null;
-const C = 5 - D;
-''', [
-      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
-    ]);
-  }
-
-  test_binaryPlus_null() async {
-    await assertErrorsInCode('''
-const dynamic D = null;
-const C = D + 5;
-''', [
-      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
-    ]);
-
-    await assertErrorsInCode('''
-const dynamic D = null;
-const C = 5 + D;
-''', [
-      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
-    ]);
-  }
-
-  test_eqEq_nonPrimitiveRightOperand() async {
-    await assertNoErrorsInCode('''
-const c = const T.eq(1, const Object());
-class T {
-  final Object value;
-  const T.eq(Object o1, Object o2) : value = o1 == o2;
-}
-''');
-  }
-
-  test_fromEnvironment_ifElement() async {
-    await assertNoErrorsInCode('''
-const b = bool.fromEnvironment('foo');
-
-main() {
-  const l1 = [1, 2, 3];
-  const l2 = [if (b) ...l1];
-  print(l2);
-}
-''');
-  }
-}
-
-@reflectiveTest
 class ConstEvalThrowsExceptionWithNullSafetyTest
     extends ConstEvalThrowsExceptionTest with WithNullSafetyMixin {
   test_asExpression_typeParameter() async {
diff --git a/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart b/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart
index 48c5f70..054355c 100644
--- a/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart
@@ -2,24 +2,45 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(ConstSetElementTypeImplementsEqualsTest_language24);
     defineReflectiveTests(ConstSetElementTypeImplementsEqualsTest);
-    defineReflectiveTests(
-        ConstSetElementTypeImplementsEqualsWithUIAsCodeAndConstantsTest);
   });
 }
 
 @reflectiveTest
-class ConstSetElementTypeImplementsEqualsTest extends PubPackageResolutionTest {
+class ConstSetElementTypeImplementsEqualsTest extends PubPackageResolutionTest
+    with ConstSetElementTypeImplementsEqualsTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class ConstSetElementTypeImplementsEqualsTest_language24
+    extends PubPackageResolutionTest
+    with ConstSetElementTypeImplementsEqualsTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin ConstSetElementTypeImplementsEqualsTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_constField() async {
     await assertErrorsInCode(r'''
 class A {
@@ -125,7 +146,7 @@
   const {...[A()]};
 }
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode
@@ -150,7 +171,7 @@
   const {...{A()}};
 }
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode
@@ -186,13 +207,3 @@
     ]);
   }
 }
-
-@reflectiveTest
-class ConstSetElementTypeImplementsEqualsWithUIAsCodeAndConstantsTest
-    extends ConstSetElementTypeImplementsEqualsTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart b/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
index 6cbca9c..d2470d0 100644
--- a/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,19 +10,44 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ConstSpreadExpectedListOrSetTest);
-    defineReflectiveTests(ConstSpreadExpectedListOrSetWithConstantsTest);
+    defineReflectiveTests(ConstSpreadExpectedListOrSetTest_language24);
   });
 }
 
 @reflectiveTest
-class ConstSpreadExpectedListOrSetTest extends PubPackageResolutionTest {
+class ConstSpreadExpectedListOrSetTest extends PubPackageResolutionTest
+    with ConstSpreadExpectedListOrSetTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class ConstSpreadExpectedListOrSetTest_language24
+    extends PubPackageResolutionTest
+    with ConstSpreadExpectedListOrSetTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin ConstSpreadExpectedListOrSetTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_const_listInt() async {
     await assertErrorsInCode(
         '''
 const dynamic a = 5;
 var b = const <int>[...a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
                     44, 1),
@@ -41,7 +63,7 @@
 const dynamic a = [5];
 var b = const <int>[...a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 43, 4),
@@ -54,7 +76,7 @@
 const dynamic a = <int, int>{0: 1};
 var b = const <int>[...a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
                     59, 1),
@@ -70,7 +92,7 @@
 const dynamic a = null;
 var b = const <int>[...a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
                     47, 1),
@@ -86,7 +108,7 @@
 const dynamic a = null;
 var b = const <int>[...?a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 44, 5),
@@ -99,7 +121,7 @@
 const dynamic a = <int>{5};
 var b = const <int>[...a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 48, 4),
@@ -112,7 +134,7 @@
 const dynamic a = 5;
 var b = const <int>{...a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
                     44, 1),
@@ -128,7 +150,7 @@
 const dynamic a = <int>[5];
 var b = const <int>{...a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 48, 4),
@@ -141,7 +163,7 @@
 const dynamic a = <int, int>{1: 2};
 var b = const <int>{...a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
                     59, 1),
@@ -157,7 +179,7 @@
 const dynamic a = null;
 var b = const <int>{...a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
                     47, 1),
@@ -173,7 +195,7 @@
 const dynamic a = null;
 var b = const <int>{...?a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 44, 5),
@@ -186,7 +208,7 @@
 const dynamic a = <int>{5};
 var b = const <int>{...a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 48, 4),
@@ -207,13 +229,3 @@
 ''');
   }
 }
-
-@reflectiveTest
-class ConstSpreadExpectedListOrSetWithConstantsTest
-    extends ConstSpreadExpectedListOrSetTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart b/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
index 0548e36..937a847 100644
--- a/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,19 +10,43 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ConstSpreadExpectedMapTest);
-    defineReflectiveTests(ConstSpreadExpectedMapWithConstantsTest);
+    defineReflectiveTests(ConstSpreadExpectedMapTest_language24);
   });
 }
 
 @reflectiveTest
-class ConstSpreadExpectedMapTest extends PubPackageResolutionTest {
+class ConstSpreadExpectedMapTest extends PubPackageResolutionTest
+    with ConstSpreadExpectedMapTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class ConstSpreadExpectedMapTest_language24 extends PubPackageResolutionTest
+    with ConstSpreadExpectedMapTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin ConstSpreadExpectedMapTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_const_mapInt() async {
     await assertErrorsInCode(
         '''
 const dynamic a = 5;
 var b = const <int, int>{...a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 49, 1),
               ]
@@ -40,7 +61,7 @@
 const dynamic a = <int>[5];
 var b = const <int, int>{...a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 56, 1),
               ]
@@ -62,7 +83,7 @@
 const dynamic a = null;
 var b = const <int, int>{...a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 52, 1),
               ]
@@ -84,7 +105,7 @@
 const dynamic a = <int>{5};
 var b = const <int, int>{...a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 56, 1),
               ]
@@ -107,13 +128,3 @@
 ''');
   }
 }
-
-@reflectiveTest
-class ConstSpreadExpectedMapWithConstantsTest
-    extends ConstSpreadExpectedMapTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart b/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
index 8b43155..726859c 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(EqualElementsInConstSetTest);
-    defineReflectiveTests(EqualElementsInConstSetWithConstantsTest);
+    defineReflectiveTests(EqualElementsInConstSetTest_language24);
   });
 }
 
 @reflectiveTest
-class EqualElementsInConstSetTest extends PubPackageResolutionTest {
+class EqualElementsInConstSetTest extends PubPackageResolutionTest
+    with EqualElementsInConstSetTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class EqualElementsInConstSetTest_language24 extends PubPackageResolutionTest
+    with EqualElementsInConstSetTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin EqualElementsInConstSetTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_const_entry() async {
     await assertErrorsInCode('''
 var c = const {1, 2, 1};
@@ -33,7 +54,7 @@
         '''
 var c = const {1, if (1 < 0) 2 else 1};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 36, 1,
                     contextMessages: [
@@ -50,7 +71,7 @@
         '''
 var c = const {if (0 < 1) 1 else 1};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 15, 19),
@@ -62,7 +83,7 @@
         '''
 var c = const {1, if (0 < 1) 2 else 1};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 19),
@@ -74,7 +95,7 @@
         '''
 var c = const {if (0 < 1) 1 else 1};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 15, 19),
@@ -86,7 +107,7 @@
         '''
 var c = const {2, if (1 < 0) 2};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 12),
@@ -98,7 +119,7 @@
         '''
 var c = const {1, if (0 < 1) 1};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 29, 1,
                     contextMessages: [
@@ -139,7 +160,7 @@
         '''
 var c = const {1, ...{2}};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 6),
@@ -151,7 +172,7 @@
         '''
 var c = const {1, ...{1}};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 21, 3,
                     contextMessages: [
@@ -172,13 +193,3 @@
     ]);
   }
 }
-
-@reflectiveTest
-class EqualElementsInConstSetWithConstantsTest
-    extends EqualElementsInConstSetTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart b/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
index a9fde6b..2cc1a89 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(EqualKeysInConstMapTest);
-    defineReflectiveTests(EqualKeysInConstMapWithConstantsTest);
+    defineReflectiveTests(EqualKeysInConstMapTest_language24);
   });
 }
 
 @reflectiveTest
-class EqualKeysInConstMapTest extends PubPackageResolutionTest {
+class EqualKeysInConstMapTest extends PubPackageResolutionTest
+    with EqualKeysInConstMapTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class EqualKeysInConstMapTest_language24 extends PubPackageResolutionTest
+    with EqualKeysInConstMapTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin EqualKeysInConstMapTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_const_entry() async {
     await assertErrorsInCode('''
 var c = const {1: null, 2: null, 1: null};
@@ -33,7 +54,7 @@
         '''
 var c = const {1: null, if (1 < 0) 2: null else 1: null};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 48, 1,
                     contextMessages: [
@@ -50,7 +71,7 @@
         '''
 var c = const {if (0 < 1) 1: null else 1: null};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 15, 31),
@@ -62,7 +83,7 @@
         '''
 var c = const {1: null, if (0 < 1) 2: null else 1: null};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 31),
@@ -74,7 +95,7 @@
         '''
 var c = const {if (0 < 1) 1: null else 1: null};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 15, 31),
@@ -86,7 +107,7 @@
         '''
 var c = const {2: null, if (1 < 0) 2: 2};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 15),
@@ -98,7 +119,7 @@
         '''
 var c = const {1: null, if (0 < 1) 1: null};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 35, 1,
                     contextMessages: [
@@ -139,7 +160,7 @@
         '''
 var c = const {1: null, ...{2: null}};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 12),
@@ -151,7 +172,7 @@
         '''
 var c = const {1: null, ...{1: null}};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 27, 9,
                     contextMessages: [
@@ -172,12 +193,3 @@
     ]);
   }
 }
-
-@reflectiveTest
-class EqualKeysInConstMapWithConstantsTest extends EqualKeysInConstMapTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart b/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
index 8772ebf..699e6bf 100644
--- a/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
@@ -102,6 +102,23 @@
 ''');
   }
 
+  test_field_external() async {
+    await assertNoErrorsInCode('''
+class A {
+  external final int x;
+}
+''');
+  }
+
+  test_field_external_with_constructor() async {
+    await assertNoErrorsInCode('''
+class A {
+  external final int x;
+  A();
+}
+''');
+  }
+
   test_field_noConstructor_initializer() async {
     await assertNoErrorsInCode('''
 class C {
@@ -173,4 +190,18 @@
       error(HintCode.UNUSED_LOCAL_VARIABLE, 19, 1),
     ]);
   }
+
+  test_static_field_external() async {
+    await assertNoErrorsInCode('''
+class A {
+  external static final int x;
+}
+''');
+  }
+
+  test_variable_external() async {
+    await assertNoErrorsInCode('''
+external final int x;
+''');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/if_element_condition_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/if_element_condition_from_deferred_library_test.dart
index 710a5cf..3d332b9 100644
--- a/pkg/analyzer/test/src/diagnostics/if_element_condition_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/if_element_condition_from_deferred_library_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,14 +10,38 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(IfElementConditionFromDeferredLibraryTest);
-    defineReflectiveTests(
-        IfElementConditionFromDeferredLibraryWithConstantsTest);
+    defineReflectiveTests(IfElementConditionFromDeferredLibraryTest_language24);
   });
 }
 
 @reflectiveTest
-class IfElementConditionFromDeferredLibraryTest
-    extends PubPackageResolutionTest {
+class IfElementConditionFromDeferredLibraryTest extends PubPackageResolutionTest
+    with IfElementConditionFromDeferredLibraryTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class IfElementConditionFromDeferredLibraryTest_language24
+    extends PubPackageResolutionTest
+    with IfElementConditionFromDeferredLibraryTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin IfElementConditionFromDeferredLibraryTestCases
+    on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_inList_deferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const bool c = true;''');
@@ -30,7 +51,7 @@
 f() {
   return const [if(a.c) 0];
 }''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode
@@ -62,7 +83,7 @@
 f() {
   return const [if(a.c) 0];
 }''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 9),
@@ -78,7 +99,7 @@
 f() {
   return const {if(a.c) 0 : 0};
 }''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode
@@ -110,7 +131,7 @@
 f() {
   return const {if(a.c) 0 : 0};
 }''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 47, 13),
@@ -126,7 +147,7 @@
 f() {
   return const {if(a.c) 0};
 }''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode
@@ -158,20 +179,10 @@
 f() {
   return const {if(a.c) 0};
 }''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 47, 9),
               ]);
   }
 }
-
-@reflectiveTest
-class IfElementConditionFromDeferredLibraryWithConstantsTest
-    extends IfElementConditionFromDeferredLibraryTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart
index 7f20112..17c1ae2 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart
@@ -692,6 +692,31 @@
 ''');
   }
 
+  test_getter_overrides_external_field_final_invalid() async {
+    await assertErrorsInCode('''
+class A {
+  external final int x;
+}
+abstract class B implements A {
+  num get x;
+  void set x(num value);
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 78, 1),
+    ]);
+  }
+
+  test_getter_overrides_external_field_final_valid() async {
+    await assertNoErrorsInCode('''
+class A {
+  external final num x;
+}
+abstract class B implements A {
+  int get x;
+}
+''');
+  }
+
   test_getter_overrides_external_field_invalid() async {
     await assertErrorsInCode('''
 class A {
@@ -875,6 +900,18 @@
 ''');
   }
 
+  test_setter_overrides_external_field_final_valid() async {
+    await assertNoErrorsInCode('''
+class A {
+  external final num x;
+}
+abstract class B implements A {
+  int get x;
+  void set x(int value);
+}
+''');
+  }
+
   test_setter_overrides_external_field_invalid() async {
     await assertErrorsInCode('''
 class A {
diff --git a/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
index 9f57784..f2526bd 100644
--- a/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,37 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ListElementTypeNotAssignableTest);
-    defineReflectiveTests(ListElementTypeNotAssignableWithConstantsTest);
+    defineReflectiveTests(ListElementTypeNotAssignableTest_language24);
   });
 }
 
 @reflectiveTest
-class ListElementTypeNotAssignableTest extends PubPackageResolutionTest {
+class ListElementTypeNotAssignableTest extends PubPackageResolutionTest
+    with ListElementTypeNotAssignableTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class ListElementTypeNotAssignableTest_language24
+    extends PubPackageResolutionTest
+    with ListElementTypeNotAssignableTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin ListElementTypeNotAssignableTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_const_ifElement_thenElseFalse_intInt() async {
     await assertErrorsInCode(
         '''
@@ -26,7 +48,7 @@
 const dynamic b = 0;
 var v = const <int>[if (1 < 0) a else b];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 62, 19),
@@ -40,7 +62,7 @@
 const dynamic b = 'b';
 var v = const <int>[if (1 < 0) a else b];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 82,
                     1),
@@ -55,7 +77,7 @@
         '''
 var v = const <int>[if (1 < 0) 'a'];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 31,
                     3),
@@ -73,7 +95,7 @@
 const dynamic a = 'a';
 var v = const <int>[if (1 < 0) a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 43, 12),
@@ -86,7 +108,7 @@
 const dynamic a = 0;
 var v = const <int>[if (true) a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 41, 11),
@@ -99,7 +121,7 @@
 const dynamic a = 'a';
 var v = const <int>[if (true) a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 53,
                     1),
@@ -114,7 +136,7 @@
         '''
 var v = const <int>[...[0, 1]];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 20, 9),
@@ -229,13 +251,3 @@
 ''');
   }
 }
-
-@reflectiveTest
-class ListElementTypeNotAssignableWithConstantsTest
-    extends ListElementTypeNotAssignableTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
index 3281891..515fb56 100644
--- a/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(MapKeyTypeNotAssignableTest);
-    defineReflectiveTests(MapKeyTypeNotAssignableWithConstantsTest);
+    defineReflectiveTests(MapKeyTypeNotAssignableTest_language24);
   });
 }
 
 @reflectiveTest
-class MapKeyTypeNotAssignableTest extends PubPackageResolutionTest {
+class MapKeyTypeNotAssignableTest extends PubPackageResolutionTest
+    with MapKeyTypeNotAssignableTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class MapKeyTypeNotAssignableTest_language24 extends PubPackageResolutionTest
+    with MapKeyTypeNotAssignableTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin MapKeyTypeNotAssignableTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_const_ifElement_thenElseFalse_intInt_dynamic() async {
     await assertErrorsInCode(
         '''
@@ -26,7 +47,7 @@
 const dynamic b = 0;
 var v = const <int, bool>{if (1 < 0) a: true else b: false};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 68, 32),
@@ -40,7 +61,7 @@
 const dynamic b = 'b';
 var v = const <int, bool>{if (1 < 0) a: true else b: false};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 94, 1),
               ]
@@ -55,7 +76,7 @@
 const dynamic a = 'a';
 var v = const <int, bool>{if (1 < 0) a: true};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 49, 18),
@@ -67,7 +88,7 @@
         '''
 var v = const <int, bool>{if (1 < 0) 'a': true};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 37, 3),
               ]
@@ -83,7 +104,7 @@
 const dynamic a = 0;
 var v = const <int, bool>{if (true) a: true};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 47, 17),
@@ -96,7 +117,7 @@
 const dynamic a = 'a';
 var v = const <int, bool>{if (true) a: true};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 59, 1),
               ]
@@ -111,7 +132,7 @@
 final a = 0;
 var v = const <int, bool>{if (1 < 2) a: true};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 50, 1),
               ]
@@ -149,7 +170,7 @@
         '''
 var v = const <int, String>{...{1: 'a'}};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 28, 11),
@@ -162,7 +183,7 @@
 const dynamic a = 'a';
 var v = const <int, String>{...{a: 'a'}};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 55, 1),
               ]
@@ -265,13 +286,3 @@
 ''');
   }
 }
-
-@reflectiveTest
-class MapKeyTypeNotAssignableWithConstantsTest
-    extends MapKeyTypeNotAssignableTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
index 794cc75..fb15c1f 100644
--- a/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(MapValueTypeNotAssignableTest);
-    defineReflectiveTests(MapValueTypeNotAssignableWithConstantsTest);
+    defineReflectiveTests(MapValueTypeNotAssignableTest_language24);
   });
 }
 
 @reflectiveTest
-class MapValueTypeNotAssignableTest extends PubPackageResolutionTest {
+class MapValueTypeNotAssignableTest extends PubPackageResolutionTest
+    with MapValueTypeNotAssignableTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class MapValueTypeNotAssignableTest_language24 extends PubPackageResolutionTest
+    with MapValueTypeNotAssignableTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin MapValueTypeNotAssignableTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_const_ifElement_thenElseFalse_intInt_dynamic() async {
     await assertErrorsInCode(
         '''
@@ -26,7 +47,7 @@
 const dynamic b = 0;
 var v = const <bool, int>{if (1 < 0) true: a else false: b};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 68, 32),
@@ -40,7 +61,7 @@
 const dynamic b = 'b';
 var v = const <bool, int>{if (1 < 0) true: a else false: b};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 101, 1),
@@ -56,7 +77,7 @@
 const dynamic a = 'a';
 var v = const <bool, int>{if (1 < 0) true: a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 49, 18),
@@ -68,7 +89,7 @@
         '''
 var v = const <bool, int>{if (1 < 0) true: 'a'};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 43, 3),
@@ -86,7 +107,7 @@
 const dynamic a = 0;
 var v = const <bool, int>{if (true) true: a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 47, 17),
@@ -99,7 +120,7 @@
 const dynamic a = 'a';
 var v = const <bool, int>{if (true) true: a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 65, 1),
@@ -115,7 +136,7 @@
 final a = 0;
 var v = const <bool, int>{if (1 < 2) true: a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 56, 1),
               ]
@@ -153,7 +174,7 @@
         '''
 var v = const <bool, int>{...{true: 1}};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 26, 12),
@@ -166,7 +187,7 @@
 const dynamic a = 'a';
 var v = const <bool, int>{...{true: a}};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 59, 1),
@@ -265,13 +286,3 @@
 ''');
   }
 }
-
-@reflectiveTest
-class MapValueTypeNotAssignableWithConstantsTest
-    extends MapValueTypeNotAssignableTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart b/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart
index c2faa10..ef8e5e6 100644
--- a/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart
@@ -699,4 +699,87 @@
           1),
     ]);
   }
+
+  test_external_field_final_implement_getter() async {
+    await assertNoErrorsInCode('''
+class A {
+  external final int x;
+}
+class B implements A {
+  int get x => 0;
+}
+''');
+  }
+
+  test_external_field_final_implement_none() async {
+    await assertErrorsInCode('''
+class A {
+  external final int x;
+}
+class B implements A {}
+''', [
+      error(
+          CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          42,
+          1),
+    ]);
+  }
+
+  test_external_field_implement_getter() async {
+    await assertErrorsInCode('''
+class A {
+  external int x;
+}
+class B implements A {
+  int get x => 0;
+}
+''', [
+      error(
+          CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          36,
+          1),
+    ]);
+  }
+
+  test_external_field_implement_getter_and_setter() async {
+    await assertNoErrorsInCode('''
+class A {
+  external int x;
+}
+class B implements A {
+  int get x => 0;
+  void set x(int value) {}
+}
+''');
+  }
+
+  test_external_field_implement_none() async {
+    await assertErrorsInCode('''
+class A {
+  external int x;
+}
+class B implements A {}
+''', [
+      error(
+          CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
+          36,
+          1),
+    ]);
+  }
+
+  test_external_field_implement_setter() async {
+    await assertErrorsInCode('''
+class A {
+  external int x;
+}
+class B implements A {
+  void set x(int value) {}
+}
+''', [
+      error(
+          CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          36,
+          1),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart
index 6f0d2d7..28ae14c 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart
@@ -2,25 +2,40 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(NonConstantListElementFromDeferredLibraryTest);
+    defineReflectiveTests(NonConstantListValueFromDeferredLibraryTest);
     defineReflectiveTests(
-        NonConstantListValueFromDeferredLibraryWithConstantsTest);
+        NonConstantListElementFromDeferredLibraryTest_language24);
   });
 }
 
 @reflectiveTest
-class NonConstantListElementFromDeferredLibraryTest
-    extends PubPackageResolutionTest {
+class NonConstantListElementFromDeferredLibraryTest_language24
+    extends PubPackageResolutionTest
+    with NonConstantListElementFromDeferredLibraryTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin NonConstantListElementFromDeferredLibraryTestCases
+    on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   @failingTest
   test_const_ifElement_thenTrue_deferredElse() async {
     // reports wrong error code (which is not crucial to fix)
@@ -47,7 +62,7 @@
 const cond = true;
 var v = const [ if (cond) a.c ];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode
@@ -90,11 +105,9 @@
 }
 
 @reflectiveTest
-class NonConstantListValueFromDeferredLibraryWithConstantsTest
-    extends NonConstantListElementFromDeferredLibraryTest {
+class NonConstantListValueFromDeferredLibraryTest
+    extends PubPackageResolutionTest
+    with NonConstantListElementFromDeferredLibraryTestCases {
   @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
+  bool get _constant_update_2018 => true;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart
index fd0772b..f9038cd 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantListElementTest);
-    defineReflectiveTests(NonConstantListElementWithConstantsTest);
+    defineReflectiveTests(NonConstantListElementTest_language24);
   });
 }
 
 @reflectiveTest
-class NonConstantListElementTest extends PubPackageResolutionTest {
+class NonConstantListElementTest extends PubPackageResolutionTest
+    with NonConstantListElementTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantListElementTest_language24 extends PubPackageResolutionTest
+    with NonConstantListElementTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin NonConstantListElementTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_const_forElement() async {
     await assertErrorsInCode(r'''
 const Set set = {};
@@ -34,7 +55,7 @@
 final dynamic a = 0;
 var v = const [if (1 < 0) 0 else a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 54, 1),
               ]
@@ -49,7 +70,7 @@
 final dynamic a = 0;
 var v = const [if (1 < 0) a else 0];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
               ]
@@ -64,7 +85,7 @@
 final dynamic a = 0;
 var v = const [if (1 > 0) 0 else a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 54, 1),
               ]
@@ -79,7 +100,7 @@
 final dynamic a = 0;
 var v = const [if (1 > 0) a else 0];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
               ]
@@ -94,7 +115,7 @@
 const dynamic a = 0;
 var v = const [if (1 < 0) a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 36, 12),
@@ -107,7 +128,7 @@
 final dynamic a = 0;
 var v = const [if (1 < 0) a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
               ]
@@ -122,7 +143,7 @@
 const dynamic a = 0;
 var v = const [if (1 > 0) a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 36, 12),
@@ -135,7 +156,7 @@
 final dynamic a = 0;
 var v = const [if (1 > 0) a];
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
               ]
@@ -169,13 +190,3 @@
 ''');
   }
 }
-
-@reflectiveTest
-class NonConstantListElementWithConstantsTest
-    extends NonConstantListElementTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
index ec30b00..26828b8 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,14 +10,40 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantMapElementTest);
-    defineReflectiveTests(NonConstantMapElementWithConstantTest);
+    defineReflectiveTests(NonConstantMapElementTest_language24);
     defineReflectiveTests(NonConstantMapKeyTest);
+    defineReflectiveTests(NonConstantMapKeyTest_language24);
     defineReflectiveTests(NonConstantMapValueTest);
+    defineReflectiveTests(NonConstantMapValueTest_language24);
   });
 }
 
 @reflectiveTest
-class NonConstantMapElementTest extends PubPackageResolutionTest {
+class NonConstantMapElementTest extends PubPackageResolutionTest
+    with NonConstantMapElementTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantMapElementTest_language24 extends PubPackageResolutionTest
+    with NonConstantMapElementTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin NonConstantMapElementTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_forElement_cannotBeConst() async {
     await assertErrorsInCode('''
 void main() {
@@ -39,7 +62,7 @@
   const {1: null, if (true) for (final x in const []) null: null};
 }
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 42, 36),
                 error(HintCode.UNUSED_LOCAL_VARIABLE, 53, 1),
@@ -66,7 +89,7 @@
   const {1: null, if (true) null: null};
 }
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 32, 20),
@@ -80,7 +103,7 @@
   const {1: null, if (true) if (true) null: null};
 }
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 32, 30),
@@ -95,7 +118,7 @@
   const {1: null, if (notConst) null: null};
 }
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 60, 8),
               ]
@@ -112,7 +135,7 @@
   const {1: null, if (isTrue) null: null else null: null};
 }
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 55, 38),
@@ -126,7 +149,7 @@
   const {1: null, ...{null: null}};
 }
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 32, 15),
@@ -141,7 +164,7 @@
   const {1: null, ...notConst};
 }
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 56, 8),
               ]
@@ -152,23 +175,39 @@
 }
 
 @reflectiveTest
-class NonConstantMapElementWithConstantTest extends NonConstantMapElementTest {
+class NonConstantMapKeyTest extends PubPackageResolutionTest
+    with NonConstantMapKeyTestCases {
   @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
+  bool get _constant_update_2018 => true;
 }
 
 @reflectiveTest
-class NonConstantMapKeyTest extends PubPackageResolutionTest {
+class NonConstantMapKeyTest_language24 extends PubPackageResolutionTest
+    with NonConstantMapKeyTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+@reflectiveTest
+mixin NonConstantMapKeyTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_const_ifElement_thenElseFalse_finalElse() async {
     await assertErrorsInCode(
         '''
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: 0 else a: 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 67, 1),
               ]
@@ -183,7 +222,7 @@
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) a: 0 else 0: 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
               ]
@@ -198,7 +237,7 @@
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: 0 else a: 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 67, 1),
               ]
@@ -213,7 +252,7 @@
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) a: 0 else 0: 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
               ]
@@ -228,7 +267,7 @@
 const dynamic a = 0;
 var v = const <int, int>{if (1 < 0) a: 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
@@ -241,7 +280,7 @@
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) a: 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
               ]
@@ -256,7 +295,7 @@
 const dynamic a = 0;
 var v = const <int, int>{if (1 > 0) a: 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
@@ -269,7 +308,7 @@
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) a: 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
               ]
@@ -296,14 +335,38 @@
 }
 
 @reflectiveTest
-class NonConstantMapValueTest extends PubPackageResolutionTest {
+class NonConstantMapValueTest extends PubPackageResolutionTest
+    with NonConstantMapValueTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantMapValueTest_language24 extends PubPackageResolutionTest
+    with NonConstantMapValueTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin NonConstantMapValueTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_const_ifElement_thenElseFalse_finalElse() async {
     await assertErrorsInCode(
         '''
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: 0 else 0: a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 70, 1),
               ]
@@ -318,7 +381,7 @@
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: a else 0: 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
               ]
@@ -333,7 +396,7 @@
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: 0 else 0: a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 70, 1),
               ]
@@ -348,7 +411,7 @@
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: a else 0: 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
               ]
@@ -363,7 +426,7 @@
 const dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
@@ -376,7 +439,7 @@
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
               ]
@@ -391,7 +454,7 @@
 const dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
@@ -404,7 +467,7 @@
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
               ]
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart
index 25504a3..f6526ff 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,14 +10,38 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantMapKeyFromDeferredLibraryTest);
-    defineReflectiveTests(
-        NonConstantMapKeyFromDeferredLibraryWithConstantsTest);
+    defineReflectiveTests(NonConstantMapKeyFromDeferredLibraryTest_language24);
   });
 }
 
 @reflectiveTest
-class NonConstantMapKeyFromDeferredLibraryTest
-    extends PubPackageResolutionTest {
+class NonConstantMapKeyFromDeferredLibraryTest extends PubPackageResolutionTest
+    with NonConstantMapKeyFromDeferredLibraryTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantMapKeyFromDeferredLibraryTest_language24
+    extends PubPackageResolutionTest
+    with NonConstantMapKeyFromDeferredLibraryTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin NonConstantMapKeyFromDeferredLibraryTestCases
+    on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   @failingTest
   test_const_ifElement_thenTrue_deferredElse() async {
 // reports wrong error code
@@ -45,7 +66,7 @@
 const cond = true;
 var v = const { if (cond) a.c : 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode
@@ -82,13 +103,3 @@
     ]);
   }
 }
-
-@reflectiveTest
-class NonConstantMapKeyFromDeferredLibraryWithConstantsTest
-    extends NonConstantMapKeyFromDeferredLibraryTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart
index d884a44..f8b166b 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantMapKeyTest);
-    defineReflectiveTests(NonConstantMapKeyWithConstantsTest);
+    defineReflectiveTests(NonConstantMapKeyTest_language24);
   });
 }
 
 @reflectiveTest
-class NonConstantMapKeyTest extends PubPackageResolutionTest {
+class NonConstantMapKeyTest extends PubPackageResolutionTest
+    with NonConstantMapKeyTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantMapKeyTest_language24 extends PubPackageResolutionTest
+    with NonConstantMapKeyTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin NonConstantMapKeyTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_const_ifElement_thenTrue_elseFinal() async {
     await assertErrorsInCode(
         r'''
@@ -26,7 +47,7 @@
 const cond = true;
 var v = const {if (cond) 0: 1 else a : 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 75, 1),
               ]
@@ -42,7 +63,7 @@
 const cond = true;
 var v = const {if (cond) a : 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 65, 1),
               ]
@@ -60,12 +81,3 @@
     ]);
   }
 }
-
-@reflectiveTest
-class NonConstantMapKeyWithConstantsTest extends NonConstantMapKeyTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart
index 6ce36a1..ad0ec5b 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -14,13 +11,39 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantMapValueFromDeferredLibraryTest);
     defineReflectiveTests(
-        NonConstantMapValueFromDeferredLibraryWithConstantsTest);
+        NonConstantMapValueFromDeferredLibraryTest_language24);
   });
 }
 
 @reflectiveTest
 class NonConstantMapValueFromDeferredLibraryTest
-    extends PubPackageResolutionTest {
+    extends PubPackageResolutionTest
+    with NonConstantMapValueFromDeferredLibraryTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantMapValueFromDeferredLibraryTest_language24
+    extends PubPackageResolutionTest
+    with NonConstantMapValueFromDeferredLibraryTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin NonConstantMapValueFromDeferredLibraryTestCases
+    on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   @failingTest
   test_const_ifElement_thenTrue_elseDeferred() async {
     // reports wrong error code
@@ -45,7 +68,7 @@
 const cond = true;
 var v = const { if (cond) 'a' : a.c};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode
@@ -82,13 +105,3 @@
     ]);
   }
 }
-
-@reflectiveTest
-class NonConstantMapValueFromDeferredLibraryWithConstantsTest
-    extends NonConstantMapValueFromDeferredLibraryTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart
index edbe740..74c3160 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantMapValueTest);
-    defineReflectiveTests(NonConstantMapValueWithConstantsTest);
+    defineReflectiveTests(NonConstantMapValueTest_language24);
   });
 }
 
 @reflectiveTest
-class NonConstantMapValueTest extends PubPackageResolutionTest {
+class NonConstantMapValueTest extends PubPackageResolutionTest
+    with NonConstantMapValueTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantMapValueTest_language24 extends PubPackageResolutionTest
+    with NonConstantMapValueTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin NonConstantMapValueTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_const_ifTrue_elseFinal() async {
     await assertErrorsInCode(
         r'''
@@ -26,7 +47,7 @@
 const cond = true;
 var v = const {if (cond) 'a': 'b', 'c' : a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 81, 1),
               ]
@@ -43,7 +64,7 @@
 const cond = true;
 var v = const {if (cond) 'a' : a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 71, 1),
               ]
@@ -61,12 +82,3 @@
     ]);
   }
 }
-
-@reflectiveTest
-class NonConstantMapValueWithConstantsTest extends NonConstantMapValueTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart
index 1f92b3d..8adf61f 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantSetElementTest);
-    defineReflectiveTests(NonConstantSetElementWithConstantsTest);
+    defineReflectiveTests(NonConstantSetElementTest_language24);
   });
 }
 
 @reflectiveTest
-class NonConstantSetElementTest extends PubPackageResolutionTest {
+class NonConstantSetElementTest extends PubPackageResolutionTest
+    with NonConstantSetElementTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantSetElementTest_language24 extends PubPackageResolutionTest
+    with NonConstantSetElementTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin NonConstantSetElementTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_const_forElement() async {
     await assertErrorsInCode(r'''
 const Set set = {};
@@ -34,7 +55,7 @@
 final dynamic a = 0;
 var v = const <int>{if (1 < 0) 0 else a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 59, 1),
               ]
@@ -49,7 +70,7 @@
 final dynamic a = 0;
 var v = const <int>{if (1 < 0) a else 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
               ]
@@ -64,7 +85,7 @@
 final dynamic a = 0;
 var v = const <int>{if (1 > 0) 0 else a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 59, 1),
               ]
@@ -79,7 +100,7 @@
 final dynamic a = 0;
 var v = const <int>{if (1 > 0) a else 0};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
               ]
@@ -94,7 +115,7 @@
 const dynamic a = 0;
 var v = const <int>{if (1 < 0) a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 12),
@@ -107,7 +128,7 @@
 final dynamic a = 0;
 var v = const <int>{if (1 < 0) a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
               ]
@@ -122,7 +143,7 @@
 const dynamic a = 0;
 var v = const <int>{if (1 > 0) a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 12),
@@ -135,7 +156,7 @@
 final dynamic a = 0;
 var v = const <int>{if (1 > 0) a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
               ]
@@ -159,7 +180,7 @@
 final Set x = null;
 var v = const {...x};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 38, 1),
               ]
@@ -184,12 +205,3 @@
 ''');
   }
 }
-
-@reflectiveTest
-class NonConstantSetElementWithConstantsTest extends NonConstantSetElementTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/set_element_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/set_element_from_deferred_library_test.dart
index c5af2c7..1a89d0a 100644
--- a/pkg/analyzer/test/src/diagnostics/set_element_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/set_element_from_deferred_library_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,37 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetElementFromDeferredLibraryTest);
-    defineReflectiveTests(SetElementFromDeferredLibraryWithConstantsTest);
+    defineReflectiveTests(SetElementFromDeferredLibraryTest_language24);
   });
 }
 
 @reflectiveTest
-class SetElementFromDeferredLibraryTest extends PubPackageResolutionTest {
+class SetElementFromDeferredLibraryTest extends PubPackageResolutionTest
+    with SetElementFromDeferredLibraryTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class SetElementFromDeferredLibraryTest_language24
+    extends PubPackageResolutionTest
+    with SetElementFromDeferredLibraryTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin SetElementFromDeferredLibraryTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   @failingTest
   test_const_ifElement_thenTrue_elseDeferred() async {
     // reports wrong error code
@@ -42,7 +64,7 @@
 const cond = true;
 var v = const {if (cond) a.c};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.SET_ELEMENT_FROM_DEFERRED_LIBRARY,
                     78, 3),
@@ -74,13 +96,3 @@
     ]);
   }
 }
-
-@reflectiveTest
-class SetElementFromDeferredLibraryWithConstantsTest
-    extends SetElementFromDeferredLibraryTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
index 6fcc0ed..d7349b8 100644
--- a/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetElementTypeNotAssignableTest);
-    defineReflectiveTests(SetElementTypeNotAssignableWithConstantTest);
+    defineReflectiveTests(SetElementTypeNotAssignableTest_language24);
   });
 }
 
 @reflectiveTest
-class SetElementTypeNotAssignableTest extends PubPackageResolutionTest {
+class SetElementTypeNotAssignableTest extends PubPackageResolutionTest
+    with SetElementTypeNotAssignableTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class SetElementTypeNotAssignableTest_language24
+    extends PubPackageResolutionTest with SetElementTypeNotAssignableTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin SetElementTypeNotAssignableTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_const_ifElement_thenElseFalse_intInt() async {
     await assertErrorsInCode(
         '''
@@ -26,7 +47,7 @@
 const dynamic b = 0;
 var v = const <int>{if (1 < 0) a else b};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 62, 19),
@@ -40,7 +61,7 @@
 const dynamic b = 'b';
 var v = const <int>{if (1 < 0) a else b};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 82,
                     1),
@@ -55,7 +76,7 @@
         '''
 var v = const <int>{if (1 < 0) 'a'};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 31,
                     3),
@@ -73,7 +94,7 @@
 const dynamic a = 'a';
 var v = const <int>{if (1 < 0) a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 43, 12),
@@ -86,7 +107,7 @@
 const dynamic a = 0;
 var v = const <int>{if (true) a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 11),
@@ -99,7 +120,7 @@
 const dynamic a = 'a';
 var v = const <int>{if (true) a};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 53,
                     1),
@@ -114,7 +135,7 @@
         '''
 var v = const <int>{...[0, 1]};
 ''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 20, 9),
@@ -197,13 +218,3 @@
 ''');
   }
 }
-
-@reflectiveTest
-class SetElementTypeNotAssignableWithConstantTest
-    extends SetElementTypeNotAssignableTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/spread_expression_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/spread_expression_from_deferred_library_test.dart
index d62d6ba..3c9b2a3 100644
--- a/pkg/analyzer/test/src/diagnostics/spread_expression_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/spread_expression_from_deferred_library_test.dart
@@ -2,10 +2,7 @@
 // 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,37 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SpreadExpressionFromDeferredLibraryTest);
-    defineReflectiveTests(SpreadExpressionFromDeferredLibraryWithConstantsTest);
+    defineReflectiveTests(SpreadExpressionFromDeferredLibraryTest_language24);
   });
 }
 
 @reflectiveTest
-class SpreadExpressionFromDeferredLibraryTest extends PubPackageResolutionTest {
+class SpreadExpressionFromDeferredLibraryTest extends PubPackageResolutionTest
+    with SpreadExpressionFromDeferredLibraryTestCases {
+  @override
+  bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class SpreadExpressionFromDeferredLibraryTest_language24
+    extends PubPackageResolutionTest
+    with SpreadExpressionFromDeferredLibraryTestCases {
+  @override
+  bool get _constant_update_2018 => false;
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      languageVersion: '2.4',
+    );
+  }
+}
+
+mixin SpreadExpressionFromDeferredLibraryTestCases on PubPackageResolutionTest {
+  bool get _constant_update_2018;
+
   test_inList_deferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const List c = [];''');
@@ -28,7 +50,7 @@
 f() {
   return const [...a.c];
 }''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode
@@ -60,7 +82,7 @@
 f() {
   return const [...a.c];
 }''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 6),
@@ -76,7 +98,7 @@
 f() {
   return const {...a.c};
 }''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode
@@ -108,7 +130,7 @@
 f() {
   return const {...a.c};
 }''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 47, 6),
@@ -124,7 +146,7 @@
 f() {
   return const {...a.c};
 }''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? [
                 error(
                     CompileTimeErrorCode
@@ -156,20 +178,10 @@
 f() {
   return const {...a.c};
 }''',
-        analysisOptions.experimentStatus.constant_update_2018
+        _constant_update_2018
             ? []
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 47, 6),
               ]);
   }
 }
-
-@reflectiveTest
-class SpreadExpressionFromDeferredLibraryWithConstantsTest
-    extends SpreadExpressionFromDeferredLibraryTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
-    ..contextFeatures = FeatureSet.fromEnableFlags(
-      [EnableString.constant_update_2018],
-    );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
index eaa394f..0552343 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
@@ -374,6 +374,15 @@
 ''');
   }
 
+  test_get_from_external_field_final_valid() async {
+    await assertNoErrorsInCode('''
+class A {
+  external final int x;
+}
+int f(A a) => a.x;
+''');
+  }
+
   test_get_from_external_field_valid() async {
     await assertNoErrorsInCode('''
 class A {
@@ -383,6 +392,15 @@
 ''');
   }
 
+  test_get_from_external_static_field_final_valid() async {
+    await assertNoErrorsInCode('''
+class A {
+  external static final int x;
+}
+int f() => A.x;
+''');
+  }
+
   test_get_from_external_static_field_valid() async {
     await assertNoErrorsInCode('''
 class A {
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
index 4dfb712..33b8193 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
@@ -177,6 +177,13 @@
 @reflectiveTest
 class UndefinedIdentifierWithNullSafetyTest extends UndefinedIdentifierTest
     with WithNullSafetyMixin {
+  test_get_from_external_variable_final_valid() async {
+    await assertNoErrorsInCode('''
+external final int x;
+int f() => x;
+''');
+  }
+
   test_get_from_external_variable_valid() async {
     await assertNoErrorsInCode('''
 external int x;
diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index 4888037..951cccc 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -11,6 +11,7 @@
     show getSupportedLibraryNames;
 
 import '../compiler_new.dart' as api;
+import 'common/metrics.dart' show Metrics, Metric;
 import 'common/tasks.dart' show GenericTask, Measurer;
 import 'common.dart';
 import 'compiler.dart';
@@ -48,7 +49,11 @@
     ]);
   }
 
-  void log(message) {
+  void logInfo(String message) {
+    callUserHandler(null, null, null, null, message, api.Diagnostic.INFO);
+  }
+
+  void logVerbose(String message) {
     callUserHandler(
         null, null, null, null, message, api.Diagnostic.VERBOSE_INFO);
   }
@@ -91,9 +96,14 @@
         return super.run(uri);
       }).then((bool success) {
         if (options.verbose) {
-          StringBuffer timings = new StringBuffer();
+          StringBuffer timings = StringBuffer();
           computeTimings(setupDuration, timings);
-          log("$timings");
+          logVerbose('$timings');
+        }
+        if (options.reportPrimaryMetrics || options.reportSecondaryMetrics) {
+          StringBuffer metrics = StringBuffer();
+          collectMetrics(metrics);
+          logInfo('$metrics');
         }
         return success;
       });
@@ -149,6 +159,31 @@
         ' (${percent.toStringAsFixed(2)}%)');
   }
 
+  void collectMetrics(StringBuffer buffer) {
+    buffer.writeln('Metrics:');
+    for (final task in tasks) {
+      Metrics metrics = task.metrics;
+      String namespace = metrics.namespace;
+      if (namespace == '') {
+        namespace =
+            task.name.toLowerCase().replaceAll(RegExp(r'[^a-z0-9]+'), '_');
+      }
+      void report(Metric metric) {
+        buffer
+            .writeln('  ${namespace}.${metric.name}: ${metric.formatValue()}');
+      }
+
+      for (final metric in metrics.primary) {
+        report(metric);
+      }
+      if (options.reportSecondaryMetrics) {
+        for (final metric in metrics.secondary) {
+          report(metric);
+        }
+      }
+    }
+  }
+
   @override
   void reportDiagnostic(DiagnosticMessage message,
       List<DiagnosticMessage> infos, api.Diagnostic kind) {
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index aea3bac..129ecf0 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -89,6 +89,8 @@
   static const String verbose = '--verbose';
   static const String progress = '--show-internal-progress';
   static const String version = '--version';
+  static const String reportMetrics = '--report-metrics';
+  static const String reportAllMetrics = '--report-all-metrics';
 
   static const String dillDependencies = '--dill-dependencies';
   static const String readData = '--read-data';
diff --git a/pkg/compiler/lib/src/common/metrics.dart b/pkg/compiler/lib/src/common/metrics.dart
new file mode 100644
index 0000000..2afd042
--- /dev/null
+++ b/pkg/compiler/lib/src/common/metrics.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2020, 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.
+
+library dart2js.common.metrics;
+
+/// A collection of metrics that is normally associated with a task.
+abstract class Metrics {
+  /// The namespace prepended to all the metric names with a period (`.`).
+  /// An empty string means no namespace.
+  String get namespace;
+
+  /// Returns all the primary metrics. Only a few metrics that give an overall
+  /// picture of the compilation should be selected as primary metrics.
+  Iterable<Metric> get primary;
+
+  /// Returns all the secondary metrics. Typically these are displayed together
+  /// with the primary metrics to give three levels of detail: no metrics, just
+  /// the primary metrics, all metrics including primary and secondary metrics.
+  Iterable<Metric> get secondary;
+
+  factory Metrics.none() => _emptyMetrics;
+}
+
+final Metrics _emptyMetrics = MetricsBase();
+
+class MetricsBase implements Metrics {
+  @override
+  String get namespace => '';
+
+  // TODO(sra): Make these late final fields.
+  List<Metric> _primary = [];
+  List<Metric> _secondary = [];
+
+  /// Setter method that is usually called in a subclass constructor to define
+  /// the primary metrics.
+  void set primary(Iterable<Metric> metrics) {
+    assert(_primary.isEmpty);
+    _primary.addAll(metrics);
+  }
+
+  /// Setter method that is usually called in a subclass constructor to define
+  /// the secondary metrics.
+  void set secondary(Iterable<Metric> metrics) {
+    assert(_secondary.isEmpty);
+    _secondary.addAll(metrics);
+  }
+
+  @override
+  Iterable<Metric> get primary => _primary /*!*/;
+
+  @override
+  Iterable<Metric> get secondary => _secondary /*!*/;
+}
+
+abstract class Metric<T> {
+  String get name;
+  String formatValue();
+}
+
+class DurationMetric implements Metric<Duration> {
+  @override
+  final String name;
+  Duration _duration = Duration.zero;
+
+  DurationMetric(this.name);
+
+  void add(Duration value) {
+    _duration += value;
+  }
+
+  T measure<T>(T Function() action) {
+    final stopwatch = Stopwatch()..start();
+    T result = action();
+    add(stopwatch.elapsed);
+    return result;
+  }
+
+  @override
+  String formatValue() {
+    return (_duration.inMilliseconds / 1000).toStringAsFixed(3) + 's';
+  }
+
+  @override
+  String toString() => 'DurationMetric("$name", $_duration)';
+}
+
+class CountMetric implements Metric<int> {
+  @override
+  final String name;
+  int _count = 0;
+
+  CountMetric(this.name);
+
+  void add([int count = 1]) {
+    _count += count;
+  }
+
+  @override
+  String formatValue() => '$_count';
+
+  @override
+  String toString() => 'CountMetric("$name", $_count)';
+}
diff --git a/pkg/compiler/lib/src/common/tasks.dart b/pkg/compiler/lib/src/common/tasks.dart
index 077972c..6022b50 100644
--- a/pkg/compiler/lib/src/common/tasks.dart
+++ b/pkg/compiler/lib/src/common/tasks.dart
@@ -7,6 +7,8 @@
 import 'dart:async'
     show Future, Zone, ZoneDelegate, ZoneSpecification, runZoned;
 
+import 'metrics.dart';
+
 /// Used to measure where time is spent in the compiler.
 ///
 /// This exposes [measure] and [measureIo], which wrap an action and associate
@@ -16,7 +18,7 @@
 abstract class CompilerTask {
   final Measurer _measurer;
   final Stopwatch _watch;
-  final Map<String, GenericTask> _subtasks = <String, GenericTask>{};
+  final Map<String, GenericTask> _subtasks = {};
 
   int _asyncCount = 0;
 
@@ -163,7 +165,7 @@
     if (_measurer._currentAsyncTask == null) {
       _measurer._currentAsyncTask = this;
     } else if (_measurer._currentAsyncTask != this) {
-      throw "Can't track async task '$name' because"
+      throw "Cannot track async task '$name' because"
           " '${_measurer._currentAsyncTask.name}' is already being tracked.";
     }
     _asyncCount++;
@@ -207,6 +209,9 @@
   int getSubtaskTime(String subtask) => _subtasks[subtask].timing;
 
   bool getSubtaskIsRunning(String subtask) => _subtasks[subtask].isRunning;
+
+  /// Returns the metrics for this task.
+  Metrics get metrics => Metrics.none();
 }
 
 class GenericTask extends CompilerTask {
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 4022219..41b46d5 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -407,6 +407,8 @@
     new OptionHandler(Flags.noFrequencyBasedMinification, passThrough),
     new OptionHandler(Flags.verbose, setVerbose),
     new OptionHandler(Flags.progress, passThrough),
+    new OptionHandler(Flags.reportMetrics, passThrough),
+    new OptionHandler(Flags.reportAllMetrics, passThrough),
     new OptionHandler(Flags.version, (_) => wantVersion = true),
     new OptionHandler('--library-root=.+', ignoreOption),
     new OptionHandler('--libraries-spec=.+', setLibrarySpecificationUri),
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 1db440d..c09c0cc 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -8,6 +8,7 @@
 
 import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
 
+import 'common/metrics.dart' show Metric, Metrics, CountMetric, DurationMetric;
 import 'common/tasks.dart' show CompilerTask;
 import 'common.dart';
 import 'common_elements.dart'
@@ -84,6 +85,20 @@
   String toString() => "OutputUnit($name, $_imports)";
 }
 
+class _DeferredLoadTaskMetrics implements Metrics {
+  @override
+  String get namespace => 'deferred_load';
+
+  DurationMetric time = DurationMetric('time');
+  CountMetric hunkListElements = CountMetric('hunkListElements');
+
+  @override
+  Iterable<Metric> get primary => [time];
+
+  @override
+  Iterable<Metric> get secondary => [hunkListElements];
+}
+
 /// For each deferred import, find elements and constants to be loaded when that
 /// import is loaded. Elements that are used by several deferred imports are in
 /// shared OutputUnits.
@@ -134,6 +149,9 @@
 
   final Compiler compiler;
 
+  @override
+  final _DeferredLoadTaskMetrics metrics = _DeferredLoadTaskMetrics();
+
   bool get disableProgramSplit => compiler.options.disableProgramSplit;
   bool get newDeferredSplit => compiler.options.newDeferredSplit;
   bool get reportInvalidInferredDeferredTypes =>
@@ -739,6 +757,7 @@
         if (outputUnit == _mainOutputUnit) continue;
         if (outputUnit._imports.contains(import)) {
           hunksToLoad[_importDeferName[import]].add(outputUnit);
+          metrics.hunkListElements.add(1);
         }
       }
     }
@@ -835,6 +854,10 @@
   /// work item (e.g. we might converge faster if we pick first the update that
   /// contains a bigger delta.)
   OutputUnitData run(FunctionEntity main, KClosedWorld closedWorld) {
+    return metrics.time.measure(() => _run(main, closedWorld));
+  }
+
+  OutputUnitData _run(FunctionEntity main, KClosedWorld closedWorld) {
     if (!isProgramSplit || main == null || disableProgramSplit) {
       return _buildResult();
     }
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index 0820252..3042432 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -7,6 +7,7 @@
 import '../../compiler_new.dart';
 import '../closure.dart';
 import '../common.dart';
+import '../common/metrics.dart';
 import '../common/names.dart';
 import '../compiler.dart';
 import '../common_elements.dart';
@@ -67,12 +68,13 @@
 
   final FunctionEntity mainElement;
 
-  final Map<Local, TypeInformation> _defaultTypeOfParameter =
-      new Map<Local, TypeInformation>();
+  final Map<Local, TypeInformation> _defaultTypeOfParameter = {};
 
-  final WorkQueue _workQueue = new WorkQueue();
+  final WorkQueue _workQueue = WorkQueue();
 
-  final Set<MemberEntity> _analyzedElements = new Set<MemberEntity>();
+  final _InferrerEngineMetrics metrics = _InferrerEngineMetrics();
+
+  final Set<MemberEntity> _analyzedElements = {};
 
   /// The maximum number of times we allow a node in the graph to
   /// change types. If a node reaches that limit, we give up
@@ -309,13 +311,17 @@
   }
 
   void runOverAllElements() {
-    _analyzeAllElements();
+    metrics.time.measure(_runOverAllElements);
+  }
+
+  void _runOverAllElements() {
+    metrics.analyze.measure(_analyzeAllElements);
     TypeGraphDump dump =
         debug.PRINT_GRAPH ? new TypeGraphDump(_compilerOutput, this) : null;
 
     dump?.beforeAnalysis();
     _buildWorkQueue();
-    _refine();
+    metrics.refine1.measure(_refine);
 
     // Try to infer element types of lists and compute their escape information.
     types.allocatedLists.values.forEach((TypeInformation info) {
@@ -424,7 +430,7 @@
     }
 
     _workQueue.addAll(seenTypes);
-    _refine();
+    metrics.refine2.measure(_refine);
 
     if (debug.PRINT_SUMMARY) {
       types.allocatedLists.values.forEach((_info) {
@@ -483,6 +489,7 @@
     }
     dump?.afterAnalysis();
 
+    metrics.overallRefineCount.add(_overallRefineCount);
     _reporter.log('Inferred $_overallRefineCount types.');
 
     _processLoopInformation();
@@ -703,6 +710,7 @@
         _overallRefineCount++;
         info.refineCount++;
         if (info.refineCount > _MAX_CHANGE_COUNT) {
+          metrics.exceededMaxChangeCount.add();
           if (debug.ANOMALY_WARN) {
             print("ANOMALY WARNING: max refinement reached for $info");
           }
@@ -1188,6 +1196,26 @@
   }
 }
 
+class _InferrerEngineMetrics extends MetricsBase {
+  final time = DurationMetric('time');
+  final analyze = DurationMetric('time.analyze');
+  final refine1 = DurationMetric('time.refine1');
+  final refine2 = DurationMetric('time.refine2');
+  final exceededMaxChangeCount = CountMetric('count.exceededMaxChange');
+  final overallRefineCount = CountMetric('count.overallRefines');
+
+  _InferrerEngineMetrics() {
+    primary = [time];
+    secondary = [
+      analyze,
+      refine1,
+      refine2,
+      exceededMaxChangeCount,
+      overallRefineCount
+    ];
+  }
+}
+
 class KernelTypeSystemStrategy implements TypeSystemStrategy {
   final JsClosedWorld _closedWorld;
 
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
index 2de18dc..62e0b11 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
@@ -8,6 +8,7 @@
 
 import 'package:kernel/ast.dart' as ir;
 import '../closure.dart';
+import '../common/metrics.dart' show Metrics;
 import '../compiler.dart';
 import '../elements/entities.dart';
 import '../js_backend/inferred_data.dart';
@@ -53,12 +54,15 @@
 
   final Compiler _compiler;
   final InferredDataBuilder _inferredDataBuilder;
+  Metrics /*?*/ _metrics;
 
   TypeGraphInferrer(
       this._compiler, this.closedWorld, this._inferredDataBuilder);
 
   String get name => 'Graph inferrer';
 
+  Metrics get metrics => _metrics;
+
   AbstractValueDomain get abstractValueDomain =>
       closedWorld.abstractValueDomain;
 
@@ -66,6 +70,7 @@
   GlobalTypeInferenceResults analyzeMain(FunctionEntity main) {
     inferrer = createInferrerEngineFor(main);
     inferrer.runOverAllElements();
+    _metrics = inferrer.metrics;
     return buildResults();
   }
 
diff --git a/pkg/compiler/lib/src/inferrer/types.dart b/pkg/compiler/lib/src/inferrer/types.dart
index 5c5c4f1..25305e4 100644
--- a/pkg/compiler/lib/src/inferrer/types.dart
+++ b/pkg/compiler/lib/src/inferrer/types.dart
@@ -6,6 +6,7 @@
 
 import 'package:kernel/ast.dart' as ir;
 import '../common.dart' show failedAt, retainDataForTesting;
+import '../common/metrics.dart' show Metrics;
 import '../common/names.dart';
 import '../common/tasks.dart' show CompilerTask;
 import '../compiler.dart' show Compiler;
@@ -159,10 +160,15 @@
 
   GlobalTypeInferenceResults resultsForTesting;
 
+  Metrics _metrics;
+
   GlobalTypeInferenceTask(Compiler compiler)
       : compiler = compiler,
         super(compiler.measurer);
 
+  @override
+  Metrics get metrics => _metrics;
+
   /// Runs the global type-inference algorithm once.
   GlobalTypeInferenceResults runGlobalTypeInference(FunctionEntity mainElement,
       JClosedWorld closedWorld, InferredDataBuilder inferredDataBuilder) {
@@ -170,10 +176,12 @@
       GlobalTypeInferenceResults results;
       if (compiler.disableTypeInference) {
         results = new TrivialGlobalTypeInferenceResults(closedWorld);
+        _metrics = Metrics.none();
       } else {
         typesInferrerInternal ??= compiler.backendStrategy
             .createTypesInferrer(closedWorld, inferredDataBuilder);
         results = typesInferrerInternal.analyzeMain(mainElement);
+        _metrics = typesInferrerInternal.metrics;
       }
       closedWorld.noSuchMethodData.categorizeComplexImplementations(results);
       if (retainDataForTesting) {
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 3e9ab67..6cd91f3 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -340,6 +340,14 @@
   /// during each phase of compilation.
   bool showInternalProgress = false;
 
+  /// Enable printing of metrics at end of compilation.
+  // TODO(sra): Add command-line filtering of metrics.
+  bool reportPrimaryMetrics = false;
+
+  /// Enable printing of more metrics at end of compilation.
+  // TODO(sra): Add command-line filtering of metrics.
+  bool reportSecondaryMetrics = false;
+
   /// Track allocations in the JS output.
   ///
   /// This is an experimental feature.
@@ -496,6 +504,8 @@
       ..useMultiSourceInfo = _hasOption(options, Flags.useMultiSourceInfo)
       ..useNewSourceInfo = _hasOption(options, Flags.useNewSourceInfo)
       ..verbose = _hasOption(options, Flags.verbose)
+      ..reportPrimaryMetrics = _hasOption(options, Flags.reportMetrics)
+      ..reportSecondaryMetrics = _hasOption(options, Flags.reportAllMetrics)
       ..showInternalProgress = _hasOption(options, Flags.progress)
       ..dillDependencies =
           _extractUriListOption(options, '${Flags.dillDependencies}')
diff --git a/pkg/test_runner/lib/src/command.dart b/pkg/test_runner/lib/src/command.dart
index ec9eda3..ae9fb11 100644
--- a/pkg/test_runner/lib/src/command.dart
+++ b/pkg/test_runner/lib/src/command.dart
@@ -180,6 +180,9 @@
     if (displayName == 'precompiler' || displayName == 'app_jit') {
       return VMCommandOutput(
           this, exitCode, timedOut, stdout, stderr, time, pid);
+    } else if (displayName == 'dart2js') {
+      return Dart2jsCompilerCommandOutput(
+          this, exitCode, timedOut, stdout, stderr, time, compilationSkipped);
     } else if (displayName == 'dartdevc') {
       return DevCompilerCommandOutput(this, exitCode, timedOut, stdout, stderr,
           time, compilationSkipped, pid);
diff --git a/pkg/test_runner/lib/src/command_output.dart b/pkg/test_runner/lib/src/command_output.dart
index eb54807..c55896c 100644
--- a/pkg/test_runner/lib/src/command_output.dart
+++ b/pkg/test_runner/lib/src/command_output.dart
@@ -967,7 +967,56 @@
   }
 }
 
-class DevCompilerCommandOutput extends CommandOutput {
+class Dart2jsCompilerCommandOutput extends CompilationCommandOutput
+    with _StaticErrorOutput {
+  /// Matches the location and message of a dart2js error message, which looks
+  /// like:
+  ///
+  ///     tests/language_2/some_test.dart:9:3:
+  ///     Error: Some message.
+  ///       BadThing();
+  ///       ^
+  ///
+  /// The test runner only validates the main error message, and not the
+  /// suggested fixes, so we only parse the first line.
+  static final _errorRegexp =
+      RegExp(r"^([^:]+):(\d+):(\d+):\nError: (.*)$", multiLine: true);
+
+  Dart2jsCompilerCommandOutput(
+      Command command,
+      int exitCode,
+      bool timedOut,
+      List<int> stdout,
+      List<int> stderr,
+      Duration time,
+      bool compilationSkipped)
+      : super(command, exitCode, timedOut, stdout, stderr, time,
+            compilationSkipped);
+
+  @override
+  void _parseErrors() {
+    var errors = <StaticError>[];
+    _StaticErrorOutput._parseCfeErrors(
+        ErrorSource.web, _errorRegexp, decodeUtf8(stdout), errors);
+    errors.forEach(addError);
+  }
+}
+
+class DevCompilerCommandOutput extends CommandOutput with _StaticErrorOutput {
+  /// Matches the first line of a DDC error message. DDC prints errors to
+  /// stdout that look like:
+  ///
+  ///     org-dartlang-app:/tests/language_2/some_test.dart:7:21: Error: Some message.
+  ///     Try fixing the code to be less bad.
+  ///       var _ = <int>[if (1) 2];
+  ///                    ^
+  ///
+  /// The test runner only validates the main error message, and not the
+  /// suggested fixes, so we only parse the first line.
+  static final _errorRegexp = RegExp(
+      r"^org-dartlang-app:/([^:]+):(\d+):(\d+): Error: (.*)$",
+      multiLine: true);
+
   DevCompilerCommandOutput(
       Command command,
       int exitCode,
@@ -985,6 +1034,11 @@
     if (hasTimedOut) return Expectation.timeout;
     if (hasNonUtf8) return Expectation.nonUtf8Error;
 
+    // If it's a static error test, validate the exact errors.
+    if (testCase.testFile.isStaticErrorTest) {
+      return _validateExpectedErrors(testCase);
+    }
+
     // Handle errors / missing errors
     if (testCase.hasCompileError) {
       return exitCode == 0
@@ -1001,9 +1055,24 @@
     if (hasCrashed) return Expectation.crash;
     if (hasTimedOut) return Expectation.timeout;
     if (hasNonUtf8) return Expectation.nonUtf8Error;
+
+    // If it's a static error test, validate the exact errors.
+    if (testCase.testFile.isStaticErrorTest) {
+      return _validateExpectedErrors(testCase);
+    }
+
     if (exitCode != 0) return Expectation.compileTimeError;
+
     return Expectation.pass;
   }
+
+  @override
+  void _parseErrors() {
+    var errors = <StaticError>[];
+    _StaticErrorOutput._parseCfeErrors(
+        ErrorSource.web, _errorRegexp, decodeUtf8(stdout), errors);
+    errors.forEach(addError);
+  }
 }
 
 class VMKernelCompilationCommandOutput extends CompilationCommandOutput {
@@ -1178,13 +1247,8 @@
     with _StaticErrorOutput {
   static void parseErrors(String stdout, List<StaticError> errors,
       [List<StaticError> warnings]) {
-    for (var match in _errorRegexp.allMatches(stdout)) {
-      var line = int.parse(match.group(2));
-      var column = int.parse(match.group(3));
-      var message = match.group(4);
-      errors.add(
-          StaticError({ErrorSource.cfe: message}, line: line, column: column));
-    }
+    _StaticErrorOutput._parseCfeErrors(
+        ErrorSource.cfe, _errorRegexp, stdout, errors);
   }
 
   /// Matches the first line of a Fasta error message. Fasta prints errors to
@@ -1222,6 +1286,19 @@
 /// Mixin for outputs from a command that implement a Dart front end which
 /// reports static errors.
 mixin _StaticErrorOutput on CommandOutput {
+  /// Parses compile errors reported by CFE using the given [regExp] and adds
+  /// them to [errors] as coming from [errorSource].
+  static void _parseCfeErrors(ErrorSource errorSource, RegExp regExp,
+      String stdout, List<StaticError> errors) {
+    for (var match in regExp.allMatches(stdout)) {
+      var line = int.parse(match.group(2));
+      var column = int.parse(match.group(3));
+      var message = match.group(4);
+      errors
+          .add(StaticError({errorSource: message}, line: line, column: column));
+    }
+  }
+
   /// Reported static errors, parsed from [stderr].
   List<StaticError> get errors {
     if (!_parsedErrors) {
@@ -1310,9 +1387,14 @@
   Expectation _validateExpectedErrors(TestCase testCase,
       [OutputWriter writer]) {
     // Filter out errors that aren't for this configuration.
-    var errorSource = testCase.configuration.compiler == Compiler.dart2analyzer
-        ? ErrorSource.analyzer
-        : ErrorSource.cfe;
+    var errorSource = {
+      Compiler.dart2analyzer: ErrorSource.analyzer,
+      Compiler.dart2js: ErrorSource.web,
+      Compiler.dartdevc: ErrorSource.web,
+      Compiler.fasta: ErrorSource.cfe
+    }[testCase.configuration.compiler];
+    assert(errorSource != null);
+
     var expected = testCase.testFile.expectedErrors
         .where((error) => error.hasError(errorSource));
 
diff --git a/pkg/test_runner/lib/src/test_file.dart b/pkg/test_runner/lib/src/test_file.dart
index c5a0fd8..01afcd9 100644
--- a/pkg/test_runner/lib/src/test_file.dart
+++ b/pkg/test_runner/lib/src/test_file.dart
@@ -72,6 +72,14 @@
   /// is skipped on configurations that are not purely front end.
   bool get isStaticErrorTest => expectedErrors.isNotEmpty;
 
+  /// If the test contains any web-specific (`[web]`) static error expectations,
+  /// then it's a "web static error test".
+  ///
+  /// These tests exist to validate that a Dart web compiler reports the right
+  /// expected errors.
+  bool get isWebStaticErrorTest =>
+      expectedErrors.any((error) => error.hasError(ErrorSource.web));
+
   /// If the tests has no static error expectations, or all of the expectations
   /// are warnings, then the test tests runtime semantics.
   ///
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index d05d3c1..2a2bfb4 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -165,7 +165,19 @@
       }
     }
 
-    return true;
+    // Normal runtime tests are always run.
+    if (testFile.isRuntimeTest) return true;
+
+    // Tests of web-specific static errors are run on web compilers.
+    if (testFile.isWebStaticErrorTest &&
+        (configuration.compiler == Compiler.dart2js ||
+            configuration.compiler == Compiler.dartdevc)) {
+      return true;
+    }
+
+    // Other static error tests are run on front-end-only configurations.
+    return configuration.compiler == Compiler.dart2analyzer ||
+        configuration.compiler == Compiler.fasta;
   }
 
   /// Whether a test with [expectations] should be skipped under the current
@@ -557,19 +569,6 @@
   /// options.
   void _testCasesFromTestFile(
       TestFile testFile, ExpectationSet expectations, TestCaseEvent onTest) {
-    // TODO(rnystrom): Skipping this here is a little unusual because most
-    // skips are handled in _addTestCase(). However, if the configuration
-    // is running on a browser, calling _addTestCase() will try to create
-    // a set of commands which ultimately causes an exception in
-    // DummyRuntimeConfiguration. This avoids that.
-    // If the test only has static expectations, skip it on any configurations
-    // that are not purely front ends.
-    if (!testFile.isRuntimeTest &&
-        configuration.compiler != Compiler.dart2analyzer &&
-        configuration.compiler != Compiler.fasta) {
-      return;
-    }
-
     // The configuration must support everything the test needs.
     if (!configuration.supportedFeatures.containsAll(testFile.requirements)) {
       return;
@@ -690,7 +689,7 @@
       commands.addAll(compilationArtifact.commands);
     }
 
-    if (testFile.hasCompileError &&
+    if ((testFile.hasCompileError || testFile.isStaticErrorTest) &&
         compilerConfiguration.hasCompiler &&
         !compilerConfiguration.runRuntimeDespiteMissingCompileTimeError) {
       // Do not attempt to run the compiled result. A compilation
@@ -744,9 +743,9 @@
       return "/$prefixDartDir/$fileRelativeToDartDir";
     }
 
-    // Unreachable.
     print("Cannot create URL for path $file. Not in build or dart directory.");
     exit(1);
+    throw "unreachable";
   }
 
   String _uriForBrowserTest(String pathComponent) {
diff --git a/pkg/vm_snapshot_analysis/CHANGELOG.md b/pkg/vm_snapshot_analysis/CHANGELOG.md
index 36d229f..c637854 100644
--- a/pkg/vm_snapshot_analysis/CHANGELOG.md
+++ b/pkg/vm_snapshot_analysis/CHANGELOG.md
@@ -1,5 +1,8 @@
 # Changelog
 
+## 0.5.4
+- Fix bug causing name clash for Type class.
+
 ## 0.5.3
 - Add `compareProgramInfo` that takes in two program info objects and outputs
 a `Map` object containing the diff data.
diff --git a/pkg/vm_snapshot_analysis/pubspec.yaml b/pkg/vm_snapshot_analysis/pubspec.yaml
index fce4b3d..1f7fb76 100644
--- a/pkg/vm_snapshot_analysis/pubspec.yaml
+++ b/pkg/vm_snapshot_analysis/pubspec.yaml
@@ -1,6 +1,6 @@
 name: vm_snapshot_analysis
 description: Utilities for analysing AOT snapshot size.
-version: 0.5.3
+version: 0.5.4
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_snapshot_analysis
 
diff --git a/tests/lib/js/constructor_parameters_static_test.dart b/tests/lib/js/constructor_parameters_static_test.dart
index 3efa2a2..82b7b1e 100644
--- a/tests/lib/js/constructor_parameters_static_test.dart
+++ b/tests/lib/js/constructor_parameters_static_test.dart
@@ -17,10 +17,10 @@
 class Foo {
   external Foo({int? a});
   //                 ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
   external factory Foo.fooFactory({int? a});
-  //                                ^
-  // [web] TODO(srujzs): Add error once supported.
+  //                                    ^
+  // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
 }
 
 @JS()
@@ -28,21 +28,21 @@
 class Bar {
   external Bar({int? a});
   //                 ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
 
   // Factories of an anonymous class can only contain named parameters.
   external factory Bar.barFactoryPositional(int? a);
   //                                             ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Factory constructors for @anonymous JS interop classes should not contain any positional parameters.
   external factory Bar.barFactoryOptional([int? a]);
   //                                            ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Factory constructors for @anonymous JS interop classes should not contain any positional parameters.
   external factory Bar.barFactoryMixedOptional(int? a, [int? b]);
   //                                                ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Factory constructors for @anonymous JS interop classes should not contain any positional parameters.
   external factory Bar.barFactoryMixedNamed(int? a, {int? b});
   //                                             ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Factory constructors for @anonymous JS interop classes should not contain any positional parameters.
 
   // Named parameters are okay only for factories of an anonymous class.
   external factory Bar.barFactoryNamed({int? a});
@@ -52,10 +52,10 @@
 abstract class Baz {
   external Baz({int? a});
   //                 ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
   external factory Baz.bazFactory({int? a});
-  //                                ^
-  // [web] TODO(srujzs): Add error once supported.
+  //                                    ^
+  // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
 }
 
 main() {}
diff --git a/tests/lib/js/js_annotation_static_test.dart b/tests/lib/js/js_annotation_static_test.dart
index ef7dc40..a8d7cd7 100644
--- a/tests/lib/js/js_annotation_static_test.dart
+++ b/tests/lib/js/js_annotation_static_test.dart
@@ -17,27 +17,27 @@
   @JS()
   external Foo(int bar);
   //       ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Member has a JS interop annotation but the enclosing class does not.
   @JS()
   external factory Foo.fooFactory();
   //               ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Member has a JS interop annotation but the enclosing class does not.
   @JS()
   external int get bar;
   //               ^^^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Member has a JS interop annotation but the enclosing class does not.
   @JS()
   external set bar(int val);
   //           ^^^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Member has a JS interop annotation but the enclosing class does not.
   @JS()
   external int baz();
   //           ^^^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Member has a JS interop annotation but the enclosing class does not.
   @JS()
   external static int bazStatic();
   //                  ^^^^^^^^^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Member has a JS interop annotation but the enclosing class does not.
 }
 
 @JS()
diff --git a/tests/lib/js/parameters_static_test.dart b/tests/lib/js/parameters_static_test.dart
index 0928ca5..11f875a 100644
--- a/tests/lib/js/parameters_static_test.dart
+++ b/tests/lib/js/parameters_static_test.dart
@@ -16,48 +16,48 @@
 class Foo {
   external int singleNamedArg({int? a});
   //                                ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
   external int mixedNamedArgs(int a, {int? b});
   //                                       ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
 }
 
 @JS()
 class Bar {
   external static int singleNamedArg({int? a});
   //                                       ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
   external static int mixedNamedArgs(int a, {int? b});
   //                                              ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
 }
 
 external int singleNamedArg({int? a});
 //                                ^
-// [web] TODO(srujzs): Add error once supported.
+// [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
 external int mixedNamedArgs(int a, {int? b});
 //                                       ^
-// [web] TODO(srujzs): Add error once supported.
+// [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
 
 @JS()
 @anonymous
 class Baz {
   external int singleNamedArg({int? a});
   //                                ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
   external int mixedNamedArgs(int a, {int? b});
   //                                       ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
 }
 
 @JS()
 abstract class Qux {
   external int singleNamedArg({int? a});
   //                                ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
   external int mixedNamedArgs(int a, {int? b});
   //                                       ^
-  // [web] TODO(srujzs): Add error once supported.
+  // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
 }
 
 main() {}
diff --git a/tools/VERSION b/tools/VERSION
index cd9f864..cf7150f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 19
+PRERELEASE 20
 PRERELEASE_PATCH 0
\ No newline at end of file