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: |