From ab217c355f5f2ef9f6340170c0fbd94de0fa1923 Mon Sep 17 00:00:00 2001 From: Kallen Tu Date: Sat, 5 Nov 2022 00:20:50 +0000 Subject: [PATCH] [analyzer/cfe] Add an experiment flag for sealed class. Have a separate flag from patterns, even though sealed families are to be shipped with patterns -- keep the work separate for now. Change-Id: Ic3996b81d9a61f2a3b1e5137e7cc32ecc8bdec9e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/267289 Reviewed-by: Paul Berry Commit-Queue: Kallen Tu Reviewed-by: Konstantin Shcheglov Reviewed-by: Johnni Winther Reviewed-by: Leaf Petersen Reviewed-by: Kevin Moore --- pkg/analyzer/lib/dart/analysis/features.dart | 3 ++ .../lib/src/dart/analysis/driver.dart | 2 +- .../lib/src/dart/analysis/experiments.g.dart | 41 +++++++++++++++---- .../experimental_flags_generated.dart | 20 +++++++++ tools/experimental_features.yaml | 3 ++ 5 files changed, 59 insertions(+), 10 deletions(-) diff --git a/pkg/analyzer/lib/dart/analysis/features.dart b/pkg/analyzer/lib/dart/analysis/features.dart index a73a8fbb34d..310a84e04b4 100644 --- a/pkg/analyzer/lib/dart/analysis/features.dart +++ b/pkg/analyzer/lib/dart/analysis/features.dart @@ -52,6 +52,9 @@ abstract class Feature { /// Feature information for spread collections. static final spread_collections = ExperimentalFeatures.spread_collections; + // Feature information for sealed classes. + static final sealed_class = ExperimentalFeatures.sealed_class; + /// Feature information for set literals. static final set_literals = ExperimentalFeatures.set_literals; diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart index 4c75ccbe3e4..3ea63b09770 100644 --- a/pkg/analyzer/lib/src/dart/analysis/driver.dart +++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart @@ -85,7 +85,7 @@ import 'package:analyzer/src/util/performance/operation_performance.dart'; /// 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 = 247; + static const int DATA_VERSION = 248; /// 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 7dcbc276bb5..2b1bade649e 100644 --- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart +++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart @@ -35,6 +35,7 @@ final _knownFeatures = { ExperimentalFeatures.nonfunction_type_aliases, EnableString.patterns: ExperimentalFeatures.patterns, EnableString.records: ExperimentalFeatures.records, + EnableString.sealed_class: ExperimentalFeatures.sealed_class, EnableString.set_literals: ExperimentalFeatures.set_literals, EnableString.spread_collections: ExperimentalFeatures.spread_collections, EnableString.super_parameters: ExperimentalFeatures.super_parameters, @@ -97,6 +98,9 @@ class EnableString { /// String to enable the experiment "records" static const String records = 'records'; + /// String to enable the experiment "sealed-class" + static const String sealed_class = 'sealed-class'; + /// String to enable the experiment "set-literals" static const String set_literals = 'set-literals'; @@ -290,8 +294,18 @@ class ExperimentalFeatures { releaseVersion: null, ); - static final set_literals = ExperimentalFeature( + static final sealed_class = ExperimentalFeature( index: 16, + enableString: EnableString.sealed_class, + isEnabledByDefault: IsEnabledByDefault.sealed_class, + isExpired: IsExpired.sealed_class, + documentation: 'Sealed class', + experimentalReleaseVersion: null, + releaseVersion: null, + ); + + static final set_literals = ExperimentalFeature( + index: 17, enableString: EnableString.set_literals, isEnabledByDefault: IsEnabledByDefault.set_literals, isExpired: IsExpired.set_literals, @@ -301,7 +315,7 @@ class ExperimentalFeatures { ); static final spread_collections = ExperimentalFeature( - index: 17, + index: 18, enableString: EnableString.spread_collections, isEnabledByDefault: IsEnabledByDefault.spread_collections, isExpired: IsExpired.spread_collections, @@ -311,7 +325,7 @@ class ExperimentalFeatures { ); static final super_parameters = ExperimentalFeature( - index: 18, + index: 19, enableString: EnableString.super_parameters, isEnabledByDefault: IsEnabledByDefault.super_parameters, isExpired: IsExpired.super_parameters, @@ -321,7 +335,7 @@ class ExperimentalFeatures { ); static final test_experiment = ExperimentalFeature( - index: 19, + index: 20, enableString: EnableString.test_experiment, isEnabledByDefault: IsEnabledByDefault.test_experiment, isExpired: IsExpired.test_experiment, @@ -332,7 +346,7 @@ class ExperimentalFeatures { ); static final triple_shift = ExperimentalFeature( - index: 20, + index: 21, enableString: EnableString.triple_shift, isEnabledByDefault: IsEnabledByDefault.triple_shift, isExpired: IsExpired.triple_shift, @@ -342,7 +356,7 @@ class ExperimentalFeatures { ); static final unnamed_libraries = ExperimentalFeature( - index: 21, + index: 22, enableString: EnableString.unnamed_libraries, isEnabledByDefault: IsEnabledByDefault.unnamed_libraries, isExpired: IsExpired.unnamed_libraries, @@ -352,7 +366,7 @@ class ExperimentalFeatures { ); static final value_class = ExperimentalFeature( - index: 22, + index: 23, enableString: EnableString.value_class, isEnabledByDefault: IsEnabledByDefault.value_class, isExpired: IsExpired.value_class, @@ -362,7 +376,7 @@ class ExperimentalFeatures { ); static final variance = ExperimentalFeature( - index: 23, + index: 24, enableString: EnableString.variance, isEnabledByDefault: IsEnabledByDefault.variance, isExpired: IsExpired.variance, @@ -372,7 +386,7 @@ class ExperimentalFeatures { ); static final views = ExperimentalFeature( - index: 24, + index: 25, enableString: EnableString.views, isEnabledByDefault: IsEnabledByDefault.views, isExpired: IsExpired.views, @@ -433,6 +447,9 @@ class IsEnabledByDefault { /// Default state of the experiment "records" static const bool records = false; + /// Default state of the experiment "sealed-class" + static const bool sealed_class = false; + /// Default state of the experiment "set-literals" static const bool set_literals = true; @@ -513,6 +530,9 @@ class IsExpired { /// Expiration status of the experiment "records" static const bool records = false; + /// Expiration status of the experiment "sealed-class" + static const bool sealed_class = false; + /// Expiration status of the experiment "set-literals" static const bool set_literals = true; @@ -598,6 +618,9 @@ mixin _CurrentState { /// Current state for the flag "records" bool get records => isEnabled(ExperimentalFeatures.records); + /// Current state for the flag "sealed-class" + bool get sealed_class => isEnabled(ExperimentalFeatures.sealed_class); + /// Current state for the flag "set-literals" bool get set_literals => isEnabled(ExperimentalFeatures.set_literals); 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 1a8690c1afa..57c1792fb48 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 @@ -187,6 +187,14 @@ class ExperimentalFlag { experimentEnabledVersion: const Version(2, 19), experimentReleasedVersion: const Version(2, 19)); + static const ExperimentalFlag sealedClass = const ExperimentalFlag( + name: 'sealed-class', + isEnabledByDefault: false, + isExpired: false, + enabledVersion: const Version(2, 19), + experimentEnabledVersion: const Version(2, 19), + experimentReleasedVersion: const Version(2, 19)); + static const ExperimentalFlag setLiterals = const ExperimentalFlag( name: 'set-literals', isEnabledByDefault: true, @@ -374,6 +382,10 @@ class GlobalFeatures { GlobalFeature get records => _records ??= _computeGlobalFeature(ExperimentalFlag.records); + GlobalFeature? _sealedClass; + GlobalFeature get sealedClass => + _sealedClass ??= _computeGlobalFeature(ExperimentalFlag.sealedClass); + GlobalFeature? _setLiterals; GlobalFeature get setLiterals => _setLiterals ??= _computeGlobalFeature(ExperimentalFlag.setLiterals); @@ -514,6 +526,11 @@ class LibraryFeatures { _records ??= globalFeatures._computeLibraryFeature( ExperimentalFlag.records, canonicalUri, libraryVersion); + LibraryFeature? _sealedClass; + LibraryFeature get sealedClass => + _sealedClass ??= globalFeatures._computeLibraryFeature( + ExperimentalFlag.sealedClass, canonicalUri, libraryVersion); + LibraryFeature? _setLiterals; LibraryFeature get setLiterals => _setLiterals ??= globalFeatures._computeLibraryFeature( @@ -595,6 +612,8 @@ ExperimentalFlag? parseExperimentalFlag(String flag) { return ExperimentalFlag.patterns; case "records": return ExperimentalFlag.records; + case "sealed-class": + return ExperimentalFlag.sealedClass; case "set-literals": return ExperimentalFlag.setLiterals; case "spread-collections": @@ -648,6 +667,7 @@ final Map defaultExperimentalFlags = { ExperimentalFlag.nonfunctionTypeAliases.isEnabledByDefault, ExperimentalFlag.patterns: ExperimentalFlag.patterns.isEnabledByDefault, ExperimentalFlag.records: ExperimentalFlag.records.isEnabledByDefault, + ExperimentalFlag.sealedClass: ExperimentalFlag.sealedClass.isEnabledByDefault, ExperimentalFlag.setLiterals: ExperimentalFlag.setLiterals.isEnabledByDefault, ExperimentalFlag.spreadCollections: ExperimentalFlag.spreadCollections.isEnabledByDefault, diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml index b4f2525d074..84837ad7d99 100644 --- a/tools/experimental_features.yaml +++ b/tools/experimental_features.yaml @@ -138,6 +138,9 @@ features: views: help: "Views" + sealed-class: + help: "Sealed class" + # Experiment flag only used for testing. test-experiment: help: >-