[null-aware-elements] Add experiment flag 'null-aware-elements'.

Part of https://github.com/dart-lang/sdk/issues/55949
Closes https://github.com/dart-lang/sdk/issues/55926

Change-Id: Ic8c6a9226bcad54daf99e01746044045937376b1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/369960
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Slava Egorov <vegorov@google.com>
Reviewed-by: Keerti Parthasarathy <keertip@google.com>
This commit is contained in:
Chloe Stefantsova 2024-06-26 09:28:16 +00:00 committed by Commit Queue
parent 06a7c30b9d
commit 957106e29d
7 changed files with 82 additions and 21 deletions

View file

@ -129,6 +129,13 @@ enum ExperimentalFlag {
experimentEnabledVersion: const Version(2, 13),
experimentReleasedVersion: const Version(2, 13)),
nullAwareElements(
name: 'null-aware-elements',
isEnabledByDefault: false,
isExpired: false,
experimentEnabledVersion: defaultLanguageVersion,
experimentReleasedVersion: defaultLanguageVersion),
patterns(
name: 'patterns',
isEnabledByDefault: true,

View file

@ -49,6 +49,9 @@ abstract class Feature {
/// Feature information for macros.
static final macros = ExperimentalFeatures.macros;
/// Feature information for null-aware elements.
static final null_aware_elements = ExperimentalFeatures.null_aware_elements;
/// Feature information for patterns.
static final patterns = ExperimentalFeatures.patterns;

View file

@ -95,7 +95,7 @@ import 'package:meta/meta.dart';
// TODO(scheglov): Clean up the list of implicitly analyzed files.
class AnalysisDriver {
/// The version of data format, should be incremented on every format change.
static const int DATA_VERSION = 368;
static const int DATA_VERSION = 369;
/// The number of exception contexts allowed to write. Once this field is
/// zero, we stop writing any new exception contexts in this process.

View file

@ -36,6 +36,7 @@ final _knownFeatures = <String, ExperimentalFeature>{
EnableString.non_nullable: ExperimentalFeatures.non_nullable,
EnableString.nonfunction_type_aliases:
ExperimentalFeatures.nonfunction_type_aliases,
EnableString.null_aware_elements: ExperimentalFeatures.null_aware_elements,
EnableString.patterns: ExperimentalFeatures.patterns,
EnableString.records: ExperimentalFeatures.records,
EnableString.resource_identifiers: ExperimentalFeatures.resource_identifiers,
@ -104,6 +105,9 @@ class EnableString {
/// String to enable the experiment "nonfunction-type-aliases"
static const String nonfunction_type_aliases = 'nonfunction-type-aliases';
/// String to enable the experiment "null-aware-elements"
static const String null_aware_elements = 'null-aware-elements';
/// String to enable the experiment "patterns"
static const String patterns = 'patterns';
@ -317,8 +321,18 @@ class ExperimentalFeatures {
releaseVersion: Version.parse('2.13.0'),
);
static final patterns = ExperimentalFeature(
static final null_aware_elements = ExperimentalFeature(
index: 17,
enableString: EnableString.null_aware_elements,
isEnabledByDefault: IsEnabledByDefault.null_aware_elements,
isExpired: IsExpired.null_aware_elements,
documentation: 'Null-aware elements and map entries in collections.',
experimentalReleaseVersion: null,
releaseVersion: null,
);
static final patterns = ExperimentalFeature(
index: 18,
enableString: EnableString.patterns,
isEnabledByDefault: IsEnabledByDefault.patterns,
isExpired: IsExpired.patterns,
@ -328,7 +342,7 @@ class ExperimentalFeatures {
);
static final records = ExperimentalFeature(
index: 18,
index: 19,
enableString: EnableString.records,
isEnabledByDefault: IsEnabledByDefault.records,
isExpired: IsExpired.records,
@ -338,7 +352,7 @@ class ExperimentalFeatures {
);
static final resource_identifiers = ExperimentalFeature(
index: 19,
index: 20,
enableString: EnableString.resource_identifiers,
isEnabledByDefault: IsEnabledByDefault.resource_identifiers,
isExpired: IsExpired.resource_identifiers,
@ -348,7 +362,7 @@ class ExperimentalFeatures {
);
static final sealed_class = ExperimentalFeature(
index: 20,
index: 21,
enableString: EnableString.sealed_class,
isEnabledByDefault: IsEnabledByDefault.sealed_class,
isExpired: IsExpired.sealed_class,
@ -358,7 +372,7 @@ class ExperimentalFeatures {
);
static final set_literals = ExperimentalFeature(
index: 21,
index: 22,
enableString: EnableString.set_literals,
isEnabledByDefault: IsEnabledByDefault.set_literals,
isExpired: IsExpired.set_literals,
@ -368,7 +382,7 @@ class ExperimentalFeatures {
);
static final spread_collections = ExperimentalFeature(
index: 22,
index: 23,
enableString: EnableString.spread_collections,
isEnabledByDefault: IsEnabledByDefault.spread_collections,
isExpired: IsExpired.spread_collections,
@ -378,7 +392,7 @@ class ExperimentalFeatures {
);
static final super_parameters = ExperimentalFeature(
index: 23,
index: 24,
enableString: EnableString.super_parameters,
isEnabledByDefault: IsEnabledByDefault.super_parameters,
isExpired: IsExpired.super_parameters,
@ -388,7 +402,7 @@ class ExperimentalFeatures {
);
static final test_experiment = ExperimentalFeature(
index: 24,
index: 25,
enableString: EnableString.test_experiment,
isEnabledByDefault: IsEnabledByDefault.test_experiment,
isExpired: IsExpired.test_experiment,
@ -399,7 +413,7 @@ class ExperimentalFeatures {
);
static final triple_shift = ExperimentalFeature(
index: 25,
index: 26,
enableString: EnableString.triple_shift,
isEnabledByDefault: IsEnabledByDefault.triple_shift,
isExpired: IsExpired.triple_shift,
@ -409,7 +423,7 @@ class ExperimentalFeatures {
);
static final unnamed_libraries = ExperimentalFeature(
index: 26,
index: 27,
enableString: EnableString.unnamed_libraries,
isEnabledByDefault: IsEnabledByDefault.unnamed_libraries,
isExpired: IsExpired.unnamed_libraries,
@ -419,7 +433,7 @@ class ExperimentalFeatures {
);
static final variance = ExperimentalFeature(
index: 27,
index: 28,
enableString: EnableString.variance,
isEnabledByDefault: IsEnabledByDefault.variance,
isExpired: IsExpired.variance,
@ -429,7 +443,7 @@ class ExperimentalFeatures {
);
static final wildcard_variables = ExperimentalFeature(
index: 28,
index: 29,
enableString: EnableString.wildcard_variables,
isEnabledByDefault: IsEnabledByDefault.wildcard_variables,
isExpired: IsExpired.wildcard_variables,
@ -494,6 +508,9 @@ class IsEnabledByDefault {
/// Default state of the experiment "nonfunction-type-aliases"
static const bool nonfunction_type_aliases = true;
/// Default state of the experiment "null-aware-elements"
static const bool null_aware_elements = false;
/// Default state of the experiment "patterns"
static const bool patterns = true;
@ -586,6 +603,9 @@ class IsExpired {
/// Expiration status of the experiment "nonfunction-type-aliases"
static const bool nonfunction_type_aliases = true;
/// Expiration status of the experiment "null-aware-elements"
static const bool null_aware_elements = false;
/// Expiration status of the experiment "patterns"
static const bool patterns = true;
@ -684,6 +704,10 @@ mixin _CurrentState {
bool get nonfunction_type_aliases =>
isEnabled(ExperimentalFeatures.nonfunction_type_aliases);
/// Current state for the flag "null-aware-elements"
bool get null_aware_elements =>
isEnabled(ExperimentalFeatures.null_aware_elements);
/// Current state for the flag "patterns"
bool get patterns => isEnabled(ExperimentalFeatures.patterns);

View file

@ -195,6 +195,14 @@ class ExperimentalFlag {
experimentEnabledVersion: const Version(2, 13),
experimentReleasedVersion: const Version(2, 13));
static const ExperimentalFlag nullAwareElements = const ExperimentalFlag(
name: 'null-aware-elements',
isEnabledByDefault: false,
isExpired: false,
enabledVersion: defaultLanguageVersion,
experimentEnabledVersion: defaultLanguageVersion,
experimentReleasedVersion: defaultLanguageVersion);
static const ExperimentalFlag patterns = const ExperimentalFlag(
name: 'patterns',
isEnabledByDefault: true,
@ -410,6 +418,10 @@ class GlobalFeatures {
GlobalFeature get nonfunctionTypeAliases => _nonfunctionTypeAliases ??=
_computeGlobalFeature(ExperimentalFlag.nonfunctionTypeAliases);
GlobalFeature? _nullAwareElements;
GlobalFeature get nullAwareElements => _nullAwareElements ??=
_computeGlobalFeature(ExperimentalFlag.nullAwareElements);
GlobalFeature? _patterns;
GlobalFeature get patterns =>
_patterns ??= _computeGlobalFeature(ExperimentalFlag.patterns);
@ -567,6 +579,11 @@ class LibraryFeatures {
canonicalUri,
libraryVersion);
LibraryFeature? _nullAwareElements;
LibraryFeature get nullAwareElements =>
_nullAwareElements ??= globalFeatures._computeLibraryFeature(
ExperimentalFlag.nullAwareElements, canonicalUri, libraryVersion);
LibraryFeature? _patterns;
LibraryFeature get patterns =>
_patterns ??= globalFeatures._computeLibraryFeature(
@ -665,6 +682,8 @@ class LibraryFeatures {
return nonNullable;
case shared.ExperimentalFlag.nonfunctionTypeAliases:
return nonfunctionTypeAliases;
case shared.ExperimentalFlag.nullAwareElements:
return nullAwareElements;
case shared.ExperimentalFlag.patterns:
return patterns;
case shared.ExperimentalFlag.records:
@ -731,6 +750,8 @@ ExperimentalFlag? parseExperimentalFlag(String flag) {
return ExperimentalFlag.nonNullable;
case "nonfunction-type-aliases":
return ExperimentalFlag.nonfunctionTypeAliases;
case "null-aware-elements":
return ExperimentalFlag.nullAwareElements;
case "patterns":
return ExperimentalFlag.patterns;
case "records":
@ -793,6 +814,8 @@ final Map<ExperimentalFlag, bool> defaultExperimentalFlags = {
ExperimentalFlag.nonNullable: ExperimentalFlag.nonNullable.isEnabledByDefault,
ExperimentalFlag.nonfunctionTypeAliases:
ExperimentalFlag.nonfunctionTypeAliases.isEnabledByDefault,
ExperimentalFlag.nullAwareElements:
ExperimentalFlag.nullAwareElements.isEnabledByDefault,
ExperimentalFlag.patterns: ExperimentalFlag.patterns.isEnabledByDefault,
ExperimentalFlag.records: ExperimentalFlag.records.isEnabledByDefault,
ExperimentalFlag.resourceIdentifiers:
@ -844,6 +867,7 @@ const Map<shared.ExperimentalFlag, ExperimentalFlag> sharedExperimentalFlags = {
shared.ExperimentalFlag.nonNullable: ExperimentalFlag.nonNullable,
shared.ExperimentalFlag.nonfunctionTypeAliases:
ExperimentalFlag.nonfunctionTypeAliases,
shared.ExperimentalFlag.nullAwareElements: ExperimentalFlag.nullAwareElements,
shared.ExperimentalFlag.patterns: ExperimentalFlag.patterns,
shared.ExperimentalFlag.records: ExperimentalFlag.records,
shared.ExperimentalFlag.resourceIdentifiers:

View file

@ -18,10 +18,10 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
hitCount: 66,
missCount: 8,
),
// 55.28846153846154%.
// 54.07925407925408%.
"package:front_end/src/api_prototype/experimental_flags_generated.dart": (
hitCount: 230,
missCount: 186,
hitCount: 232,
missCount: 197,
),
// 33.33333333333333%.
"package:front_end/src/api_prototype/file_system.dart": (
@ -753,10 +753,10 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
hitCount: 118,
missCount: 6,
),
// 93.60488798370672%.
// 93.47120843471208%.
"package:front_end/src/source/outline_builder.dart": (
hitCount: 2298,
missCount: 157,
hitCount: 2305,
missCount: 161,
),
// 94.44444444444444%.
"package:front_end/src/source/redirecting_factory_body.dart": (
@ -809,9 +809,9 @@ const Map<String, ({int hitCount, int missCount})> _expect = {
hitCount: 295,
missCount: 35,
),
// 85.36585365853658%.
// 85.3836784409257%.
"package:front_end/src/source/source_library_builder.dart": (
hitCount: 3500,
hitCount: 3505,
missCount: 600,
),
// 81.8988464951198%.

View file

@ -358,6 +358,9 @@ features:
}
expired: true
null-aware-elements:
help: "Null-aware elements and map entries in collections."
extension-methods:
help: "Extension Methods"
enabledIn: '2.6.0'