diff --git a/pkg/analyzer/lib/dart/analysis/features.dart b/pkg/analyzer/lib/dart/analysis/features.dart index 390c5327e39..3fea176f8da 100644 --- a/pkg/analyzer/lib/dart/analysis/features.dart +++ b/pkg/analyzer/lib/dart/analysis/features.dart @@ -40,6 +40,9 @@ abstract class Feature { /// Feature information for macros. static final macros = ExperimentalFeatures.macros; + /// Feature information for patterns. + static final patterns = ExperimentalFeatures.patterns; + /// Feature information for records. static final records = ExperimentalFeatures.records; diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart index 9d73f8003c7..48e6a50ae17 100644 --- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart +++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart @@ -33,6 +33,7 @@ final _knownFeatures = { EnableString.non_nullable: ExperimentalFeatures.non_nullable, EnableString.nonfunction_type_aliases: ExperimentalFeatures.nonfunction_type_aliases, + EnableString.patterns: ExperimentalFeatures.patterns, EnableString.records: ExperimentalFeatures.records, EnableString.set_literals: ExperimentalFeatures.set_literals, EnableString.spread_collections: ExperimentalFeatures.spread_collections, @@ -88,6 +89,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 "patterns" + static const String patterns = 'patterns'; + /// String to enable the experiment "records" static const String records = 'records'; @@ -258,8 +262,18 @@ class ExperimentalFeatures { releaseVersion: Version.parse('2.13.0'), ); - static final records = ExperimentalFeature( + static final patterns = ExperimentalFeature( index: 14, + enableString: EnableString.patterns, + isEnabledByDefault: IsEnabledByDefault.patterns, + isExpired: IsExpired.patterns, + documentation: 'Patterns', + experimentalReleaseVersion: null, + releaseVersion: null, + ); + + static final records = ExperimentalFeature( + index: 15, enableString: EnableString.records, isEnabledByDefault: IsEnabledByDefault.records, isExpired: IsExpired.records, @@ -269,7 +283,7 @@ class ExperimentalFeatures { ); static final set_literals = ExperimentalFeature( - index: 15, + index: 16, enableString: EnableString.set_literals, isEnabledByDefault: IsEnabledByDefault.set_literals, isExpired: IsExpired.set_literals, @@ -279,7 +293,7 @@ class ExperimentalFeatures { ); static final spread_collections = ExperimentalFeature( - index: 16, + index: 17, enableString: EnableString.spread_collections, isEnabledByDefault: IsEnabledByDefault.spread_collections, isExpired: IsExpired.spread_collections, @@ -289,7 +303,7 @@ class ExperimentalFeatures { ); static final super_parameters = ExperimentalFeature( - index: 17, + index: 18, enableString: EnableString.super_parameters, isEnabledByDefault: IsEnabledByDefault.super_parameters, isExpired: IsExpired.super_parameters, @@ -299,7 +313,7 @@ class ExperimentalFeatures { ); static final test_experiment = ExperimentalFeature( - index: 18, + index: 19, enableString: EnableString.test_experiment, isEnabledByDefault: IsEnabledByDefault.test_experiment, isExpired: IsExpired.test_experiment, @@ -310,7 +324,7 @@ class ExperimentalFeatures { ); static final triple_shift = ExperimentalFeature( - index: 19, + index: 20, enableString: EnableString.triple_shift, isEnabledByDefault: IsEnabledByDefault.triple_shift, isExpired: IsExpired.triple_shift, @@ -320,7 +334,7 @@ class ExperimentalFeatures { ); static final value_class = ExperimentalFeature( - index: 20, + index: 21, enableString: EnableString.value_class, isEnabledByDefault: IsEnabledByDefault.value_class, isExpired: IsExpired.value_class, @@ -330,7 +344,7 @@ class ExperimentalFeatures { ); static final variance = ExperimentalFeature( - index: 21, + index: 22, enableString: EnableString.variance, isEnabledByDefault: IsEnabledByDefault.variance, isExpired: IsExpired.variance, @@ -385,6 +399,9 @@ class IsEnabledByDefault { /// Default state of the experiment "nonfunction-type-aliases" static const bool nonfunction_type_aliases = true; + /// Default state of the experiment "patterns" + static const bool patterns = false; + /// Default state of the experiment "records" static const bool records = false; @@ -456,6 +473,9 @@ class IsExpired { /// Expiration status of the experiment "nonfunction-type-aliases" static const bool nonfunction_type_aliases = true; + /// Expiration status of the experiment "patterns" + static const bool patterns = false; + /// Expiration status of the experiment "records" static const bool records = false; @@ -532,6 +552,9 @@ mixin _CurrentState { bool get nonfunction_type_aliases => isEnabled(ExperimentalFeatures.nonfunction_type_aliases); + /// Current state for the flag "patterns" + bool get patterns => isEnabled(ExperimentalFeatures.patterns); + /// Current state for the flag "records" bool get records => isEnabled(ExperimentalFeatures.records); diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart index bff234d3a2f..3a8cc21096d 100644 --- a/pkg/analyzer/lib/src/generated/resolver.dart +++ b/pkg/analyzer/lib/src/generated/resolver.dart @@ -347,9 +347,8 @@ class ResolverVisitor extends ThrowingAstVisitor definingLibrary.featureSet.isEnabled(Feature.generic_metadata), options = TypeAnalyzerOptions( nullSafetyEnabled: definingLibrary.isNonNullableByDefault, - // TODO(paulberry): set `patternsEnabled` correctly once we have an - // experiment flag for patterns. - patternsEnabled: false) { + patternsEnabled: + definingLibrary.featureSet.isEnabled(Feature.patterns)) { var analysisOptions = definingLibrary.context.analysisOptions as AnalysisOptionsImpl; 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 bac8946b7d1..8624c8bb22e 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 @@ -171,6 +171,14 @@ class ExperimentalFlag { experimentEnabledVersion: const Version(2, 13), experimentReleasedVersion: const Version(2, 13)); + static const ExperimentalFlag patterns = const ExperimentalFlag( + name: 'patterns', + isEnabledByDefault: false, + isExpired: false, + enabledVersion: const Version(2, 19), + experimentEnabledVersion: const Version(2, 19), + experimentReleasedVersion: const Version(2, 19)); + static const ExperimentalFlag records = const ExperimentalFlag( name: 'records', isEnabledByDefault: false, @@ -342,6 +350,10 @@ class GlobalFeatures { GlobalFeature get nonfunctionTypeAliases => _nonfunctionTypeAliases ??= _computeGlobalFeature(ExperimentalFlag.nonfunctionTypeAliases); + GlobalFeature? _patterns; + GlobalFeature get patterns => + _patterns ??= _computeGlobalFeature(ExperimentalFlag.patterns); + GlobalFeature? _records; GlobalFeature get records => _records ??= _computeGlobalFeature(ExperimentalFlag.records); @@ -468,6 +480,11 @@ class LibraryFeatures { canonicalUri, libraryVersion); + LibraryFeature? _patterns; + LibraryFeature get patterns => + _patterns ??= globalFeatures._computeLibraryFeature( + ExperimentalFlag.patterns, canonicalUri, libraryVersion); + LibraryFeature? _records; LibraryFeature get records => _records ??= globalFeatures._computeLibraryFeature( @@ -541,6 +558,8 @@ ExperimentalFlag? parseExperimentalFlag(String flag) { return ExperimentalFlag.nonNullable; case "nonfunction-type-aliases": return ExperimentalFlag.nonfunctionTypeAliases; + case "patterns": + return ExperimentalFlag.patterns; case "records": return ExperimentalFlag.records; case "set-literals": @@ -590,6 +609,7 @@ final Map defaultExperimentalFlags = { ExperimentalFlag.nonNullable: ExperimentalFlag.nonNullable.isEnabledByDefault, ExperimentalFlag.nonfunctionTypeAliases: ExperimentalFlag.nonfunctionTypeAliases.isEnabledByDefault, + ExperimentalFlag.patterns: ExperimentalFlag.patterns.isEnabledByDefault, ExperimentalFlag.records: ExperimentalFlag.records.isEnabledByDefault, ExperimentalFlag.setLiterals: ExperimentalFlag.setLiterals.isEnabledByDefault, ExperimentalFlag.spreadCollections: diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml index 1055aa870ee..c624c60e6c0 100644 --- a/tools/experimental_features.yaml +++ b/tools/experimental_features.yaml @@ -131,6 +131,9 @@ features: records: help: "Records" + patterns: + help: "Patterns" + # Experiment flag only used for testing. test-experiment: help: >-