Enable feature `digit-separators`

This CL  makes the `digit-separators` feature enabled by default in
Dart Language Version 3.6.

Tested: Presubmit bots
Change-Id: If0776e96066ecaad3baa7f92fce167317fb976f2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/379660
Reviewed-by: Leaf Petersen <leafp@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3373a7a..dfbadbe 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,30 @@
 
 ### Language
 
+Dart 3.6 adds [digit separators] to the language. To use them, set your
+package's [SDK constraint][language version] lower bound to 3.6 or greater
+(`sdk: '^3.6.0'`).
+
+#### Digit separators
+
+[digit separators]: https://github.com/dart-lang/language/issues/2
+
+Digits in number literals (decimal integer literals, double literals,
+scientific notation literals, and hexadecimal literals) can now include
+underscores between digits, as "digit separators." The separators do not change
+the value of a literal, but can serve to make the number more readable.
+
+```dart
+100__000_000__000_000__000_000  // one hundred million million millions!
+0x4000_0000_0000_0000
+0.000_000_000_01
+0x00_14_22_01_23_45  // MAC address
+```
+
+Separators are not allowed at the start of a number (this would be parsed as an
+identifier), at the end of a number, or adjacent to another character in a
+number, like `.`, `x`, or the `e` in scientific notation.
+
 - **Breaking Change** [#56065][]: The context used by the compiler and analyzer
   to perform type inference on the operand of a `throw` expression has been
   changed from the "unknown type" to `Object`. This makes the type system more
diff --git a/pkg/_fe_analyzer_shared/lib/src/experiments/flags.dart b/pkg/_fe_analyzer_shared/lib/src/experiments/flags.dart
index cdbdf86..2f24e7a 100644
--- a/pkg/_fe_analyzer_shared/lib/src/experiments/flags.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/experiments/flags.dart
@@ -54,10 +54,10 @@
 
   digitSeparators(
       name: 'digit-separators',
-      isEnabledByDefault: false,
+      isEnabledByDefault: true,
       isExpired: false,
-      experimentEnabledVersion: defaultLanguageVersion,
-      experimentReleasedVersion: defaultLanguageVersion),
+      experimentEnabledVersion: const Version(3, 6),
+      experimentReleasedVersion: const Version(3, 6)),
 
   enhancedEnums(
       name: 'enhanced-enums',
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index 543f267..23cb13a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -227,7 +227,7 @@
     isExpired: IsExpired.digit_separators,
     documentation: 'Number literals with digit separators.',
     experimentalReleaseVersion: null,
-    releaseVersion: null,
+    releaseVersion: Version.parse('3.6.0'),
   );
 
   static final enhanced_enums = ExperimentalFeature(
@@ -518,7 +518,7 @@
   static const bool control_flow_collections = true;
 
   /// Default state of the experiment "digit-separators"
-  static const bool digit_separators = false;
+  static const bool digit_separators = true;
 
   /// Default state of the experiment "enhanced-enums"
   static const bool enhanced_enums = true;
diff --git a/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart b/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
index 8e88ebb..4fb624c 100644
--- a/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
@@ -333,6 +333,7 @@
       constant-update-2018
       constructor-tearoffs
       control-flow-collections
+      digit-separators
       enhanced-enums
       extension-methods
       generic-metadata
diff --git a/pkg/analyzer_utilities/lib/test/experiments/experiments.dart b/pkg/analyzer_utilities/lib/test/experiments/experiments.dart
index ae5cbb9..ead8e60 100644
--- a/pkg/analyzer_utilities/lib/test/experiments/experiments.dart
+++ b/pkg/analyzer_utilities/lib/test/experiments/experiments.dart
@@ -16,7 +16,6 @@
 /// whether a given flag is already included.
 List<String> experimentsForTests = [
   Feature.augmentations.enableString,
-  Feature.digit_separators.enableString,
   Feature.enhanced_parts.enableString,
   Feature.macros.enableString,
   Feature.null_aware_elements.enableString,
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 d2a3044..d6be7cc 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
@@ -109,11 +109,11 @@
 
   static const ExperimentalFlag digitSeparators = const ExperimentalFlag(
       name: 'digit-separators',
-      isEnabledByDefault: false,
+      isEnabledByDefault: true,
       isExpired: false,
-      enabledVersion: defaultLanguageVersion,
-      experimentEnabledVersion: defaultLanguageVersion,
-      experimentReleasedVersion: defaultLanguageVersion);
+      enabledVersion: const Version(3, 6),
+      experimentEnabledVersion: const Version(3, 6),
+      experimentReleasedVersion: const Version(3, 6));
 
   static const ExperimentalFlag enhancedEnums = const ExperimentalFlag(
       name: 'enhanced-enums',
diff --git a/runtime/vm/experimental_features.cc b/runtime/vm/experimental_features.cc
index 0bd0693..3613cc3 100644
--- a/runtime/vm/experimental_features.cc
+++ b/runtime/vm/experimental_features.cc
@@ -16,7 +16,7 @@
 
 bool GetExperimentalFeatureDefault(ExperimentalFeature feature) {
   constexpr bool kFeatureValues[] = {
-      true, true, true, true, true, true, true, true, true, true, true,
+      true, true, true, true, true, true, true, true, true, true, true, true,
       true, true, true, true, true, true, true, true, true, true, true,
   };
   ASSERT(static_cast<size_t>(feature) < ARRAY_SIZE(kFeatureValues));
@@ -25,6 +25,7 @@
 
 const char* GetExperimentalFeatureName(ExperimentalFeature feature) {
   constexpr const char* kFeatureNames[] = {
+      "digit-separators",
       "inference-update-3",
       "inline-class",
       "inference-update-2",
diff --git a/runtime/vm/experimental_features.h b/runtime/vm/experimental_features.h
index 6433825..12b1227 100644
--- a/runtime/vm/experimental_features.h
+++ b/runtime/vm/experimental_features.h
@@ -12,6 +12,7 @@
 namespace dart {
 
 enum class ExperimentalFeature {
+  digit_separators,
   inference_update_3,
   inline_class,
   inference_update_2,
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index 25d699d..e2d3f95 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -131,9 +131,6 @@
   wildcard-variables:
     help: "Local declarations and parameters named `_` are non-binding."
 
-  digit-separators:
-    help: "Number literals with digit separators."
-
   null-aware-elements:
     help: "Null-aware elements and map entries in collections."
 
@@ -156,6 +153,17 @@
 # Shipped flags should be marked retired the following stable release.
 #
 
+  digit-separators:
+    enabledIn: '3.6.0'
+    validation: |
+      main() {
+        int x = 1_000_000;
+        int y = 0xff_ff_ff;
+        double z = 1__2.3__4e5__6;
+        print('feature enabled');
+      }
+    help: "Number literals with digit separators."
+
   inference-update-3: # See https://github.com/dart-lang/language/issues/1618
     enabledIn: '3.4.0'
     validation: |