Add experimental flag `inference-update-1`.

This is intended to be an umbrella for several features we plan to
implement during Q2:

- Improved type inference for methods like `Iterable.fold`
  (https://github.com/dart-lang/language/issues/731).

- Promotion of final fields
  (https://github.com/dart-lang/language/issues/2020).

- Other type inference and type promotion issues as time allows.

Change-Id: I31db3c15d3f6a2654650f056866c61f3d1023600
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/237924
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: William Hesse <whesse@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 45cd4ba..46404b1 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -83,7 +83,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 211;
+  static const int DATA_VERSION = 212;
 
   static const bool _applyFileChangesSynchronously = true;
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index ca06838..ff42940 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -21,6 +21,7 @@
   EnableString.extension_methods: ExperimentalFeatures.extension_methods,
   EnableString.extension_types: ExperimentalFeatures.extension_types,
   EnableString.generic_metadata: ExperimentalFeatures.generic_metadata,
+  EnableString.inference_update_1: ExperimentalFeatures.inference_update_1,
   EnableString.macros: ExperimentalFeatures.macros,
   EnableString.named_arguments_anywhere:
       ExperimentalFeatures.named_arguments_anywhere,
@@ -63,6 +64,9 @@
   /// String to enable the experiment "generic-metadata"
   static const String generic_metadata = 'generic-metadata';
 
+  /// String to enable the experiment "inference-update-1"
+  static const String inference_update_1 = 'inference-update-1';
+
   /// String to enable the experiment "macros"
   static const String macros = 'macros';
 
@@ -181,8 +185,18 @@
     releaseVersion: Version.parse('2.14.0'),
   );
 
-  static final macros = ExperimentalFeature(
+  static final inference_update_1 = ExperimentalFeature(
     index: 8,
+    enableString: EnableString.inference_update_1,
+    isEnabledByDefault: IsEnabledByDefault.inference_update_1,
+    isExpired: IsExpired.inference_update_1,
+    documentation: 'Enhanced type inference',
+    experimentalReleaseVersion: null,
+    releaseVersion: null,
+  );
+
+  static final macros = ExperimentalFeature(
+    index: 9,
     enableString: EnableString.macros,
     isEnabledByDefault: IsEnabledByDefault.macros,
     isExpired: IsExpired.macros,
@@ -192,7 +206,7 @@
   );
 
   static final named_arguments_anywhere = ExperimentalFeature(
-    index: 9,
+    index: 10,
     enableString: EnableString.named_arguments_anywhere,
     isEnabledByDefault: IsEnabledByDefault.named_arguments_anywhere,
     isExpired: IsExpired.named_arguments_anywhere,
@@ -202,7 +216,7 @@
   );
 
   static final non_nullable = ExperimentalFeature(
-    index: 10,
+    index: 11,
     enableString: EnableString.non_nullable,
     isEnabledByDefault: IsEnabledByDefault.non_nullable,
     isExpired: IsExpired.non_nullable,
@@ -212,7 +226,7 @@
   );
 
   static final nonfunction_type_aliases = ExperimentalFeature(
-    index: 11,
+    index: 12,
     enableString: EnableString.nonfunction_type_aliases,
     isEnabledByDefault: IsEnabledByDefault.nonfunction_type_aliases,
     isExpired: IsExpired.nonfunction_type_aliases,
@@ -222,7 +236,7 @@
   );
 
   static final set_literals = ExperimentalFeature(
-    index: 12,
+    index: 13,
     enableString: EnableString.set_literals,
     isEnabledByDefault: IsEnabledByDefault.set_literals,
     isExpired: IsExpired.set_literals,
@@ -232,7 +246,7 @@
   );
 
   static final spread_collections = ExperimentalFeature(
-    index: 13,
+    index: 14,
     enableString: EnableString.spread_collections,
     isEnabledByDefault: IsEnabledByDefault.spread_collections,
     isExpired: IsExpired.spread_collections,
@@ -242,7 +256,7 @@
   );
 
   static final super_parameters = ExperimentalFeature(
-    index: 14,
+    index: 15,
     enableString: EnableString.super_parameters,
     isEnabledByDefault: IsEnabledByDefault.super_parameters,
     isExpired: IsExpired.super_parameters,
@@ -252,7 +266,7 @@
   );
 
   static final test_experiment = ExperimentalFeature(
-    index: 15,
+    index: 16,
     enableString: EnableString.test_experiment,
     isEnabledByDefault: IsEnabledByDefault.test_experiment,
     isExpired: IsExpired.test_experiment,
@@ -263,7 +277,7 @@
   );
 
   static final triple_shift = ExperimentalFeature(
-    index: 16,
+    index: 17,
     enableString: EnableString.triple_shift,
     isEnabledByDefault: IsEnabledByDefault.triple_shift,
     isExpired: IsExpired.triple_shift,
@@ -273,7 +287,7 @@
   );
 
   static final value_class = ExperimentalFeature(
-    index: 17,
+    index: 18,
     enableString: EnableString.value_class,
     isEnabledByDefault: IsEnabledByDefault.value_class,
     isExpired: IsExpired.value_class,
@@ -283,7 +297,7 @@
   );
 
   static final variance = ExperimentalFeature(
-    index: 18,
+    index: 19,
     enableString: EnableString.variance,
     isEnabledByDefault: IsEnabledByDefault.variance,
     isExpired: IsExpired.variance,
@@ -320,6 +334,9 @@
   /// Default state of the experiment "generic-metadata"
   static const bool generic_metadata = true;
 
+  /// Default state of the experiment "inference-update-1"
+  static const bool inference_update_1 = false;
+
   /// Default state of the experiment "macros"
   static const bool macros = false;
 
@@ -382,6 +399,9 @@
   /// Expiration status of the experiment "generic-metadata"
   static const bool generic_metadata = true;
 
+  /// Expiration status of the experiment "inference-update-1"
+  static const bool inference_update_1 = false;
+
   /// Expiration status of the experiment "macros"
   static const bool macros = false;
 
@@ -445,6 +465,10 @@
   /// Current state for the flag "generic-metadata"
   bool get generic_metadata => isEnabled(ExperimentalFeatures.generic_metadata);
 
+  /// Current state for the flag "inference-update-1"
+  bool get inference_update_1 =>
+      isEnabled(ExperimentalFeatures.inference_update_1);
+
   /// Current state for the flag "macros"
   bool get macros => isEnabled(ExperimentalFeatures.macros);
 
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index 953dfa4..e6a113c 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -19,6 +19,7 @@
   extensionMethods,
   extensionTypes,
   genericMetadata,
+  inferenceUpdate1,
   macros,
   namedArgumentsAnywhere,
   nonNullable,
@@ -42,6 +43,7 @@
 const Version enableExtensionMethodsVersion = const Version(2, 6);
 const Version enableExtensionTypesVersion = const Version(2, 17);
 const Version enableGenericMetadataVersion = const Version(2, 14);
+const Version enableInferenceUpdate1Version = const Version(2, 17);
 const Version enableMacrosVersion = const Version(2, 17);
 const Version enableNamedArgumentsAnywhereVersion = const Version(2, 17);
 const Version enableNonNullableVersion = const Version(2, 12);
@@ -74,6 +76,8 @@
       return ExperimentalFlag.extensionTypes;
     case "generic-metadata":
       return ExperimentalFlag.genericMetadata;
+    case "inference-update-1":
+      return ExperimentalFlag.inferenceUpdate1;
     case "macros":
       return ExperimentalFlag.macros;
     case "named-arguments-anywhere":
@@ -110,6 +114,7 @@
   ExperimentalFlag.extensionMethods: true,
   ExperimentalFlag.extensionTypes: false,
   ExperimentalFlag.genericMetadata: true,
+  ExperimentalFlag.inferenceUpdate1: false,
   ExperimentalFlag.macros: false,
   ExperimentalFlag.namedArgumentsAnywhere: true,
   ExperimentalFlag.nonNullable: true,
@@ -133,6 +138,7 @@
   ExperimentalFlag.extensionMethods: true,
   ExperimentalFlag.extensionTypes: false,
   ExperimentalFlag.genericMetadata: true,
+  ExperimentalFlag.inferenceUpdate1: false,
   ExperimentalFlag.macros: false,
   ExperimentalFlag.namedArgumentsAnywhere: false,
   ExperimentalFlag.nonNullable: true,
@@ -156,6 +162,7 @@
   ExperimentalFlag.extensionMethods: const Version(2, 6),
   ExperimentalFlag.extensionTypes: const Version(2, 17),
   ExperimentalFlag.genericMetadata: const Version(2, 14),
+  ExperimentalFlag.inferenceUpdate1: const Version(2, 17),
   ExperimentalFlag.macros: const Version(2, 17),
   ExperimentalFlag.namedArgumentsAnywhere: const Version(2, 17),
   ExperimentalFlag.nonNullable: const Version(2, 12),
@@ -179,6 +186,7 @@
   ExperimentalFlag.extensionMethods: const Version(2, 6),
   ExperimentalFlag.extensionTypes: const Version(2, 17),
   ExperimentalFlag.genericMetadata: const Version(2, 14),
+  ExperimentalFlag.inferenceUpdate1: const Version(2, 17),
   ExperimentalFlag.macros: const Version(2, 17),
   ExperimentalFlag.namedArgumentsAnywhere: const Version(2, 17),
   ExperimentalFlag.nonNullable: const Version(2, 10),
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index 0fd686d..012b604 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -125,6 +125,9 @@
   macros:
     help: "Static meta-programming"
 
+  inference-update-1:
+    help: "Enhanced type inference"
+
 # Experiment flag only used for testing.
   test-experiment:
     help: >-