From 957106e29dabf2fec2c05804c40bebe790ff30b3 Mon Sep 17 00:00:00 2001 From: Chloe Stefantsova Date: Wed, 26 Jun 2024 09:28:16 +0000 Subject: [PATCH] [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 Reviewed-by: Johnni Winther Reviewed-by: Slava Egorov Reviewed-by: Keerti Parthasarathy --- .../lib/src/experiments/flags.dart | 7 +++ pkg/analyzer/lib/dart/analysis/features.dart | 3 ++ .../lib/src/dart/analysis/driver.dart | 2 +- .../lib/src/dart/analysis/experiments.g.dart | 48 ++++++++++++++----- .../experimental_flags_generated.dart | 24 ++++++++++ .../test/coverage_suite_expected.dart | 16 +++---- tools/experimental_features.yaml | 3 ++ 7 files changed, 82 insertions(+), 21 deletions(-) diff --git a/pkg/_fe_analyzer_shared/lib/src/experiments/flags.dart b/pkg/_fe_analyzer_shared/lib/src/experiments/flags.dart index 3e195ddfa08..ca4d0faffb5 100644 --- a/pkg/_fe_analyzer_shared/lib/src/experiments/flags.dart +++ b/pkg/_fe_analyzer_shared/lib/src/experiments/flags.dart @@ -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, diff --git a/pkg/analyzer/lib/dart/analysis/features.dart b/pkg/analyzer/lib/dart/analysis/features.dart index 8a20789d776..a2c0c43e7f3 100644 --- a/pkg/analyzer/lib/dart/analysis/features.dart +++ b/pkg/analyzer/lib/dart/analysis/features.dart @@ -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; diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart index d82209b5960..c2fedeb1525 100644 --- a/pkg/analyzer/lib/src/dart/analysis/driver.dart +++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart @@ -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. diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart index ce4fd493320..6f3f5a111fc 100644 --- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart +++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart @@ -36,6 +36,7 @@ final _knownFeatures = { 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); 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 ac4856de548..353dfc7f806 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 @@ -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 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 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: diff --git a/pkg/front_end/test/coverage_suite_expected.dart b/pkg/front_end/test/coverage_suite_expected.dart index 07f29e8a8c0..3691d5f9152 100644 --- a/pkg/front_end/test/coverage_suite_expected.dart +++ b/pkg/front_end/test/coverage_suite_expected.dart @@ -18,10 +18,10 @@ const Map _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 _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 _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%. diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml index 76ad4692afd..eba8916f199 100644 --- a/tools/experimental_features.yaml +++ b/tools/experimental_features.yaml @@ -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'