Version 2.10.0-28.0.dev

Merge commit 'e597681d2286d1aa3777fdc2e318c3c5df22e6df' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 78aa0a4..3136266 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2020-08-12T09:00:03.727658",
+  "generated": "2020-08-13T10:20:32.864803",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -269,38 +269,8 @@
       "languageVersion": "2.2"
     },
     {
-      "name": "front_end_agnostic",
-      "rootUri": "../pkg/front_end/testcases/agnostic",
-      "packageUri": ".nonexisting/"
-    },
-    {
-      "name": "front_end_general_nnbd_opt_out",
-      "rootUri": "../pkg/front_end/testcases/general_nnbd_opt_out",
-      "packageUri": ".nonexisting/"
-    },
-    {
-      "name": "front_end_late_lowering",
-      "rootUri": "../pkg/front_end/testcases/late_lowering",
-      "packageUri": ".nonexisting/"
-    },
-    {
-      "name": "front_end_nnbd",
-      "rootUri": "../pkg/front_end/testcases/nnbd",
-      "packageUri": ".nonexisting/"
-    },
-    {
-      "name": "front_end_nnbd_mixed",
-      "rootUri": "../pkg/front_end/testcases/nnbd_mixed",
-      "packageUri": ".nonexisting/"
-    },
-    {
-      "name": "front_end_nonfunction_type_aliases",
-      "rootUri": "../pkg/front_end/testcases/nonfunction_type_aliases",
-      "packageUri": ".nonexisting/"
-    },
-    {
-      "name": "front_end_value_class",
-      "rootUri": "../pkg/front_end/testcases/value_class",
+      "name": "front_end_testcases",
+      "rootUri": "../pkg/front_end/testcases",
       "packageUri": ".nonexisting/"
     },
     {
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 87a3edf..374efdd 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -2916,6 +2916,49 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeExperimentNotEnabledNoFlag =
+    messageExperimentNotEnabledNoFlag;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageExperimentNotEnabledNoFlag = const MessageCode(
+    "ExperimentNotEnabledNoFlag",
+    analyzerCodes: <String>["ParserErrorCode.EXPERIMENT_NOT_ENABLED"],
+    message:
+        r"""This requires the null safety language feature, which is experimental.""",
+    tip:
+        r"""You can enable the experiment using the '--enable-experiment=non-nullable' command line option.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String string2)>
+    templateExperimentNotEnabledNoFlagInvalidLanguageVersion =
+    const Template<Message Function(String string2)>(
+        messageTemplate:
+            r"""This requires the null safety language feature, which is experimental and requires language version of #string2 or higher.""",
+        tipTemplate:
+            r"""You can enable the experiment using the '--enable-experiment=non-nullable' command line option.""",
+        withArguments:
+            _withArgumentsExperimentNotEnabledNoFlagInvalidLanguageVersion);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string2)>
+    codeExperimentNotEnabledNoFlagInvalidLanguageVersion =
+    const Code<Message Function(String string2)>(
+        "ExperimentNotEnabledNoFlagInvalidLanguageVersion",
+        templateExperimentNotEnabledNoFlagInvalidLanguageVersion,
+        analyzerCodes: <String>["ParserErrorCode.EXPERIMENT_NOT_ENABLED"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsExperimentNotEnabledNoFlagInvalidLanguageVersion(
+    String string2) {
+  if (string2.isEmpty) throw 'No string provided';
+  return new Message(codeExperimentNotEnabledNoFlagInvalidLanguageVersion,
+      message:
+          """This requires the null safety language feature, which is experimental and requires language version of ${string2} or higher.""",
+      tip: """You can enable the experiment using the '--enable-experiment=non-nullable' command line option.""",
+      arguments: {'string2': string2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExplicitExtensionArgumentMismatch =
     messageExplicitExtensionArgumentMismatch;
 
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart b/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart
index 2d4577b..8c048e0 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener_impl.dart
@@ -11,6 +11,7 @@
 import 'package:_fe_analyzer_shared/src/parser/stack_listener.dart';
 
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
+import 'package:front_end/src/api_prototype/experimental_flags.dart';
 
 import 'package:kernel/ast.dart'
     show AsyncMarker, Expression, FunctionNode, TreeNode;
@@ -101,9 +102,21 @@
       } else {
         addProblem(messageNonNullableOptOut, token.charOffset, token.charCount);
       }
+    } else if (!libraryBuilder.loader.target
+        .isExperimentEnabledGlobally(ExperimentalFlag.nonNullable)) {
+      if (libraryBuilder.languageVersion.version < enableNonNullableVersion) {
+        addProblem(
+            templateExperimentNotEnabledNoFlagInvalidLanguageVersion
+                .withArguments(enableNonNullableVersion.toText()),
+            token.offset,
+            noLength);
+      } else {
+        addProblem(messageExperimentNotEnabledNoFlag, token.offset, noLength);
+      }
     } else {
       addProblem(
-          templateExperimentNotEnabled.withArguments('non-nullable', '2.9'),
+          templateExperimentNotEnabled.withArguments(
+              'non-nullable', enableNonNullableVersion.toText()),
           token.offset,
           noLength);
     }
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 24385c0..258110e 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -220,6 +220,8 @@
 ExpectedUri/analyzerCode: Fail
 ExpectedUri/example: Fail
 ExperimentNotEnabled/example: Fail
+ExperimentNotEnabledNoFlag/example: Fail
+ExperimentNotEnabledNoFlagInvalidLanguageVersion/example: Fail
 ExplicitExtensionArgumentMismatch/analyzerCode: Fail
 ExplicitExtensionArgumentMismatch/example: Fail
 ExplicitExtensionAsExpression/analyzerCode: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 9da1481..83a6000 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -243,6 +243,16 @@
   tip: "Try updating your pubspec.yaml to set the minimum SDK constraint to #string2 or higher, and running 'pub get'."
   analyzerCode: ParserErrorCode.EXPERIMENT_NOT_ENABLED
 
+ExperimentNotEnabledNoFlag:
+  template: "This requires the null safety language feature, which is experimental."
+  tip: "You can enable the experiment using the '--enable-experiment=non-nullable' command line option."
+  analyzerCode: ParserErrorCode.EXPERIMENT_NOT_ENABLED
+
+ExperimentNotEnabledNoFlagInvalidLanguageVersion:
+  template: "This requires the null safety language feature, which is experimental and requires language version of #string2 or higher."
+  tip: "You can enable the experiment using the '--enable-experiment=non-nullable' command line option."
+  analyzerCode: ParserErrorCode.EXPERIMENT_NOT_ENABLED
+
 EmptyNamedParameterList:
   template: "Named parameter lists cannot be empty."
   tip: "Try adding a named parameter to the list."
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart
new file mode 100644
index 0000000..e4d78ca
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart
@@ -0,0 +1,7 @@
+// 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.
+
+int? i;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.outline.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.outline.expect
new file mode 100644
index 0000000..65bed41
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.outline.expect
@@ -0,0 +1,15 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/null_safety_invalid_experiment.dart:5:4: Error: This requires the null safety language feature, which is experimental.
+// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// int? i;
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int? i;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.strong.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.strong.expect
new file mode 100644
index 0000000..a2fd43e
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/null_safety_invalid_experiment.dart:5:4: Error: This requires the null safety language feature, which is experimental.
+// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// int? i;
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int? i;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.strong.transformed.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.strong.transformed.expect
new file mode 100644
index 0000000..a2fd43e
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.strong.transformed.expect
@@ -0,0 +1,14 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/null_safety_invalid_experiment.dart:5:4: Error: This requires the null safety language feature, which is experimental.
+// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// int? i;
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int? i;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.textual_outline.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.textual_outline.expect
new file mode 100644
index 0000000..fbf863a
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+int? i;
+main() {}
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..fbf863a
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.textual_outline_modelled.expect
@@ -0,0 +1,2 @@
+int? i;
+main() {}
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart
new file mode 100644
index 0000000..2f40bd5
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart
@@ -0,0 +1,9 @@
+// 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.
+
+// @dart=2.7
+
+int? i;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.outline.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.outline.expect
new file mode 100644
index 0000000..e55d2e4
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.outline.expect
@@ -0,0 +1,15 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart:7:4: Error: This requires the null safety language feature, which is experimental and requires language version of 2.10 or higher.
+// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// int? i;
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int? i;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.strong.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.strong.expect
new file mode 100644
index 0000000..9a19627
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart:7:4: Error: This requires the null safety language feature, which is experimental and requires language version of 2.10 or higher.
+// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// int? i;
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int? i;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.strong.transformed.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.strong.transformed.expect
new file mode 100644
index 0000000..9a19627
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.strong.transformed.expect
@@ -0,0 +1,14 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart:7:4: Error: This requires the null safety language feature, which is experimental and requires language version of 2.10 or higher.
+// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
+// int? i;
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int? i;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.textual_outline.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.textual_outline.expect
new file mode 100644
index 0000000..3d2a7f5
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+// @dart = 2.7
+int? i;
+main() { }
diff --git a/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.outline.expect b/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.outline.expect
index 7c1741c..5565e30 100644
--- a/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.outline.expect
+++ b/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.outline.expect
@@ -6,7 +6,7 @@
 static method main() → dynamic
   ;
 
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -42,18 +42,8 @@
 
 @_in::patch
 class Class extends core::Object {
-  synthetic constructor •() → self2::Class*
+  synthetic constructor •() → self2::Class
     ;
-  abstract member-signature get _identityHashCode() → core::int*;
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
-  abstract member-signature operator ==(dynamic other) → core::bool*;
-  abstract member-signature get hashCode() → core::int*;
-  abstract member-signature method toString() → core::String*;
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
-  abstract member-signature get runtimeType() → core::Type*;
 }
 
 library;
diff --git a/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.strong.expect b/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.strong.expect
index d2a861e..02eadb5 100644
--- a/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.strong.expect
+++ b/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.strong.expect
@@ -8,7 +8,7 @@
   new test::Class::•();
 }
 
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -44,19 +44,9 @@
 
 @#C1
 class Class extends core::Object {
-  synthetic constructor •() → test::Class*
+  synthetic constructor •() → test::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*;
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
-  abstract member-signature operator ==(dynamic other) → core::bool*;
-  abstract member-signature get hashCode() → core::int*;
-  abstract member-signature method toString() → core::String*;
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
-  abstract member-signature get runtimeType() → core::Type*;
 }
 
 library;
diff --git a/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.strong.transformed.expect b/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.strong.transformed.expect
index d2a861e..02eadb5 100644
--- a/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
   new test::Class::•();
 }
 
-library;
+library /*isNonNullableByDefault*/;
 //
 // Problems in library:
 //
@@ -44,19 +44,9 @@
 
 @#C1
 class Class extends core::Object {
-  synthetic constructor •() → test::Class*
+  synthetic constructor •() → test::Class
     : super core::Object::•()
     ;
-  abstract member-signature get _identityHashCode() → core::int*;
-  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
-  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
-  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
-  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
-  abstract member-signature operator ==(dynamic other) → core::bool*;
-  abstract member-signature get hashCode() → core::int*;
-  abstract member-signature method toString() → core::String*;
-  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
-  abstract member-signature get runtimeType() → core::Type*;
 }
 
 library;
diff --git a/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart b/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart
new file mode 100644
index 0000000..2f40bd5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart
@@ -0,0 +1,9 @@
+// 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.
+
+// @dart=2.7
+
+int? i;
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart.textual_outline.expect
new file mode 100644
index 0000000..3d2a7f5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+// @dart = 2.7
+int? i;
+main() { }
diff --git a/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart.weak.expect
new file mode 100644
index 0000000..bdccfd5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart.weak.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version higher.
+// int? i;
+//    ^
+// pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.7
+// ^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int? i;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart.weak.transformed.expect
new file mode 100644
index 0000000..bdccfd5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart.weak.transformed.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version higher.
+// int? i;
+//    ^
+// pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.7
+// ^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int? i;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect
index 9187650..213fb86 100644
--- a/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31180.dart.strong.expect
@@ -2,8 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/regress/issue_31180.dart:6:15: Error: This requires the 'non-nullable' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.9 or higher, and running 'pub get'.
+// pkg/front_end/testcases/regress/issue_31180.dart:6:15: Error: This requires the null safety language feature, which is experimental.
+// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
 //   return null?[1];
 //               ^
 //
diff --git a/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect
index 20ed682..261ed57 100644
--- a/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31180.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/regress/issue_31180.dart:6:15: Error: This requires the 'non-nullable' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.9 or higher, and running 'pub get'.
+// pkg/front_end/testcases/regress/issue_31180.dart:6:15: Error: This requires the null safety language feature, which is experimental.
+// You can enable the experiment using the '--enable-experiment=non-nullable' command line option.
 //   return null?[1];
 //               ^
 //
diff --git a/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.expect b/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.expect
index 03dca82..66cffa4 100644
--- a/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.expect
+++ b/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.expect
Binary files differ
diff --git a/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.transformed.expect b/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.transformed.expect
index 03dca82..66cffa4 100644
--- a/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.strong.transformed.expect
Binary files differ
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index b34f51f..6a70b35 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -10079,6 +10079,9 @@
     return false;
   }
 
+  /// Returns this language version as a 'major.minor' text.
+  String toText() => '${major}.${minor}';
+
   @override
   int get hashCode {
     return major.hashCode * 13 + minor.hashCode * 17;
diff --git a/runtime/vm/compiler/ffi/call.cc b/runtime/vm/compiler/ffi/call.cc
index 5cb1598..93d4484 100644
--- a/runtime/vm/compiler/ffi/call.cc
+++ b/runtime/vm/compiler/ffi/call.cc
@@ -4,6 +4,7 @@
 
 #include "vm/compiler/ffi/call.h"
 
+#include "vm/class_finalizer.h"
 #include "vm/symbols.h"
 
 namespace dart {
@@ -50,6 +51,13 @@
   function.set_parameter_names(parameter_names);
   function.SetFfiCSignature(c_signature);
 
+  Type& type = Type::Handle(zone);
+  type ^= function.SignatureType(Nullability::kLegacy);
+  type ^= ClassFinalizer::FinalizeType(owner_class, type);
+  function.SetSignatureType(type);
+  ASSERT(
+      Type::Handle(function.SignatureType(Nullability::kLegacy)).IsFinalized());
+
   return function.raw();
 }
 
diff --git a/tools/VERSION b/tools/VERSION
index eafca47..956d8fc 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 27
+PRERELEASE 28
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/generate_package_config.dart b/tools/generate_package_config.dart
old mode 100755
new mode 100644
index c24a655..7c5daf2
--- a/tools/generate_package_config.dart
+++ b/tools/generate_package_config.dart
@@ -26,13 +26,7 @@
   ];
 
   var cfePackageDirs = [
-    packageDirectory('pkg/front_end/testcases/agnostic/'),
-    packageDirectory('pkg/front_end/testcases/general_nnbd_opt_out/'),
-    packageDirectory('pkg/front_end/testcases/late_lowering/'),
-    packageDirectory('pkg/front_end/testcases/nnbd/'),
-    packageDirectory('pkg/front_end/testcases/nnbd_mixed/'),
-    packageDirectory('pkg/front_end/testcases/nonfunction_type_aliases/'),
-    packageDirectory('pkg/front_end/testcases/value_class/'),
+    packageDirectory('pkg/front_end/testcases/'),
   ];
 
   var feAnalyzerSharedPackageDirs = [