diff --git a/pkg/_fe_analyzer_shared/lib/src/experiments/flags.dart b/pkg/_fe_analyzer_shared/lib/src/experiments/flags.dart index c9030d13260..8a486532925 100644 --- a/pkg/_fe_analyzer_shared/lib/src/experiments/flags.dart +++ b/pkg/_fe_analyzer_shared/lib/src/experiments/flags.dart @@ -234,6 +234,14 @@ enum ExperimentalFlag { experimentReleasedVersion: const Version(3, 0), ), + privateNamedParameters( + name: 'private-named-parameters', + isEnabledByDefault: false, + isExpired: false, + experimentEnabledVersion: defaultLanguageVersion, + experimentReleasedVersion: defaultLanguageVersion, + ), + recordUse( name: 'record-use', isEnabledByDefault: false, diff --git a/pkg/analyzer/api.txt b/pkg/analyzer/api.txt index ec10341bace..d11f86df1f1 100644 --- a/pkg/analyzer/api.txt +++ b/pkg/analyzer/api.txt @@ -409,6 +409,7 @@ package:analyzer/dart/analysis/features.dart: nonfunction_type_aliases (static getter: ExperimentalFeature) null_aware_elements (static getter: ExperimentalFeature) patterns (static getter: ExperimentalFeature) + private_named_parameters (static getter: ExperimentalFeature) records (static getter: ExperimentalFeature) sealed_class (static getter: ExperimentalFeature) set_literals (static getter: ExperimentalFeature) diff --git a/pkg/analyzer/lib/dart/analysis/features.dart b/pkg/analyzer/lib/dart/analysis/features.dart index a4663a1b8bc..6923559fd17 100644 --- a/pkg/analyzer/lib/dart/analysis/features.dart +++ b/pkg/analyzer/lib/dart/analysis/features.dart @@ -81,6 +81,10 @@ abstract class Feature { /// Feature information for patterns. static final patterns = ExperimentalFeatures.patterns; + /// Feature information for private named parameters. + static final private_named_parameters = + ExperimentalFeatures.private_named_parameters; + /// Feature information for records. static final records = ExperimentalFeatures.records; diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart index 0b3a236f704..35341d1b4b2 100644 --- a/pkg/analyzer/lib/src/dart/analysis/driver.dart +++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart @@ -107,7 +107,7 @@ testFineAfterLibraryAnalyzerHook; // 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 = 572; + static const int DATA_VERSION = 573; /// 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 921e8e2a569..b8b4940c072 100644 --- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart +++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart @@ -49,6 +49,8 @@ final _knownFeatures = { ExperimentalFeatures.nonfunction_type_aliases, EnableString.null_aware_elements: ExperimentalFeatures.null_aware_elements, EnableString.patterns: ExperimentalFeatures.patterns, + EnableString.private_named_parameters: + ExperimentalFeatures.private_named_parameters, EnableString.record_use: ExperimentalFeatures.record_use, EnableString.records: ExperimentalFeatures.records, EnableString.sealed_class: ExperimentalFeatures.sealed_class, @@ -152,6 +154,9 @@ class EnableString { /// String to enable the experiment "patterns" static const String patterns = 'patterns'; + /// String to enable the experiment "private-named-parameters" + static const String private_named_parameters = 'private-named-parameters'; + /// String to enable the experiment "record-use" static const String record_use = 'record-use'; @@ -511,8 +516,20 @@ class ExperimentalFeatures { channels: ["stable", "beta", "dev", "main"], ); - static final record_use = ExperimentalFeature( + static final private_named_parameters = ExperimentalFeature( index: 28, + enableString: EnableString.private_named_parameters, + isEnabledByDefault: IsEnabledByDefault.private_named_parameters, + isExpired: IsExpired.private_named_parameters, + documentation: + 'Allow named parameters with private names that refer to fields.', + experimentalReleaseVersion: null, + releaseVersion: null, + channels: ["stable", "beta", "dev", "main"], + ); + + static final record_use = ExperimentalFeature( + index: 29, enableString: EnableString.record_use, isEnabledByDefault: IsEnabledByDefault.record_use, isExpired: IsExpired.record_use, @@ -523,7 +540,7 @@ class ExperimentalFeatures { ); static final records = ExperimentalFeature( - index: 29, + index: 30, enableString: EnableString.records, isEnabledByDefault: IsEnabledByDefault.records, isExpired: IsExpired.records, @@ -534,7 +551,7 @@ class ExperimentalFeatures { ); static final sealed_class = ExperimentalFeature( - index: 30, + index: 31, enableString: EnableString.sealed_class, isEnabledByDefault: IsEnabledByDefault.sealed_class, isExpired: IsExpired.sealed_class, @@ -545,7 +562,7 @@ class ExperimentalFeatures { ); static final set_literals = ExperimentalFeature( - index: 31, + index: 32, enableString: EnableString.set_literals, isEnabledByDefault: IsEnabledByDefault.set_literals, isExpired: IsExpired.set_literals, @@ -556,7 +573,7 @@ class ExperimentalFeatures { ); static final sound_flow_analysis = ExperimentalFeature( - index: 32, + index: 33, enableString: EnableString.sound_flow_analysis, isEnabledByDefault: IsEnabledByDefault.sound_flow_analysis, isExpired: IsExpired.sound_flow_analysis, @@ -568,7 +585,7 @@ class ExperimentalFeatures { ); static final spread_collections = ExperimentalFeature( - index: 33, + index: 34, enableString: EnableString.spread_collections, isEnabledByDefault: IsEnabledByDefault.spread_collections, isExpired: IsExpired.spread_collections, @@ -579,7 +596,7 @@ class ExperimentalFeatures { ); static final static_extensions = ExperimentalFeature( - index: 34, + index: 35, enableString: EnableString.static_extensions, isEnabledByDefault: IsEnabledByDefault.static_extensions, isExpired: IsExpired.static_extensions, @@ -590,7 +607,7 @@ class ExperimentalFeatures { ); static final super_parameters = ExperimentalFeature( - index: 35, + index: 36, enableString: EnableString.super_parameters, isEnabledByDefault: IsEnabledByDefault.super_parameters, isExpired: IsExpired.super_parameters, @@ -601,7 +618,7 @@ class ExperimentalFeatures { ); static final test_experiment = ExperimentalFeature( - index: 36, + index: 37, enableString: EnableString.test_experiment, isEnabledByDefault: IsEnabledByDefault.test_experiment, isExpired: IsExpired.test_experiment, @@ -613,7 +630,7 @@ class ExperimentalFeatures { ); static final triple_shift = ExperimentalFeature( - index: 37, + index: 38, enableString: EnableString.triple_shift, isEnabledByDefault: IsEnabledByDefault.triple_shift, isExpired: IsExpired.triple_shift, @@ -624,7 +641,7 @@ class ExperimentalFeatures { ); static final unnamed_libraries = ExperimentalFeature( - index: 38, + index: 39, enableString: EnableString.unnamed_libraries, isEnabledByDefault: IsEnabledByDefault.unnamed_libraries, isExpired: IsExpired.unnamed_libraries, @@ -635,7 +652,7 @@ class ExperimentalFeatures { ); static final unquoted_imports = ExperimentalFeature( - index: 39, + index: 40, enableString: EnableString.unquoted_imports, isEnabledByDefault: IsEnabledByDefault.unquoted_imports, isExpired: IsExpired.unquoted_imports, @@ -646,7 +663,7 @@ class ExperimentalFeatures { ); static final variance = ExperimentalFeature( - index: 40, + index: 41, enableString: EnableString.variance, isEnabledByDefault: IsEnabledByDefault.variance, isExpired: IsExpired.variance, @@ -657,7 +674,7 @@ class ExperimentalFeatures { ); static final wildcard_variables = ExperimentalFeature( - index: 41, + index: 42, enableString: EnableString.wildcard_variables, isEnabledByDefault: IsEnabledByDefault.wildcard_variables, isExpired: IsExpired.wildcard_variables, @@ -756,6 +773,9 @@ class IsEnabledByDefault { /// Default state of the experiment "patterns" static const bool patterns = true; + /// Default state of the experiment "private-named-parameters" + static const bool private_named_parameters = false; + /// Default state of the experiment "record-use" static const bool record_use = false; @@ -887,6 +907,9 @@ class IsExpired { /// Expiration status of the experiment "patterns" static const bool patterns = true; + /// Expiration status of the experiment "private-named-parameters" + static const bool private_named_parameters = false; + /// Expiration status of the experiment "record-use" static const bool record_use = false; @@ -1029,6 +1052,10 @@ mixin _CurrentState { /// Current state for the flag "patterns" bool get patterns => isEnabled(ExperimentalFeatures.patterns); + /// Current state for the flag "private-named-parameters" + bool get private_named_parameters => + isEnabled(ExperimentalFeatures.private_named_parameters); + /// Current state for the flag "record-use" bool get record_use => isEnabled(ExperimentalFeatures.record_use); diff --git a/pkg/analyzer_testing/lib/experiments/experiments.dart b/pkg/analyzer_testing/lib/experiments/experiments.dart index 86d64fe7f74..3667c21d0dd 100644 --- a/pkg/analyzer_testing/lib/experiments/experiments.dart +++ b/pkg/analyzer_testing/lib/experiments/experiments.dart @@ -19,5 +19,6 @@ List experimentsForTests = [ Feature.declaring_constructors.enableString, Feature.enhanced_parts.enableString, Feature.macros.enableString, + Feature.private_named_parameters.enableString, Feature.variance.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 2efcdffbc88..b3414e89a58 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 @@ -314,6 +314,15 @@ class ExperimentalFlag { experimentReleasedVersion: const Version(3, 0), ); + static const ExperimentalFlag privateNamedParameters = const ExperimentalFlag( + name: 'private-named-parameters', + isEnabledByDefault: false, + isExpired: false, + enabledVersion: defaultLanguageVersion, + experimentEnabledVersion: defaultLanguageVersion, + experimentReleasedVersion: defaultLanguageVersion, + ); + static const ExperimentalFlag recordUse = const ExperimentalFlag( name: 'record-use', isEnabledByDefault: false, @@ -623,6 +632,10 @@ class GlobalFeatures { GlobalFeature get patterns => _patterns ??= _computeGlobalFeature(ExperimentalFlag.patterns); + GlobalFeature? _privateNamedParameters; + GlobalFeature get privateNamedParameters => _privateNamedParameters ??= + _computeGlobalFeature(ExperimentalFlag.privateNamedParameters); + GlobalFeature? _recordUse; GlobalFeature get recordUse => _recordUse ??= _computeGlobalFeature(ExperimentalFlag.recordUse); @@ -923,6 +936,14 @@ class LibraryFeatures { libraryVersion, ); + LibraryFeature? _privateNamedParameters; + LibraryFeature get privateNamedParameters => + _privateNamedParameters ??= globalFeatures._computeLibraryFeature( + ExperimentalFlag.privateNamedParameters, + canonicalUri, + libraryVersion, + ); + LibraryFeature? _recordUse; LibraryFeature get recordUse => _recordUse ??= globalFeatures._computeLibraryFeature( @@ -1096,6 +1117,8 @@ class LibraryFeatures { return nullAwareElements; case shared.ExperimentalFlag.patterns: return patterns; + case shared.ExperimentalFlag.privateNamedParameters: + return privateNamedParameters; case shared.ExperimentalFlag.recordUse: return recordUse; case shared.ExperimentalFlag.records: @@ -1188,6 +1211,8 @@ ExperimentalFlag? parseExperimentalFlag(String flag) { return ExperimentalFlag.nullAwareElements; case "patterns": return ExperimentalFlag.patterns; + case "private-named-parameters": + return ExperimentalFlag.privateNamedParameters; case "record-use": return ExperimentalFlag.recordUse; case "records": @@ -1274,6 +1299,8 @@ final Map defaultExperimentalFlags = { ExperimentalFlag.nullAwareElements: ExperimentalFlag.nullAwareElements.isEnabledByDefault, ExperimentalFlag.patterns: ExperimentalFlag.patterns.isEnabledByDefault, + ExperimentalFlag.privateNamedParameters: + ExperimentalFlag.privateNamedParameters.isEnabledByDefault, ExperimentalFlag.recordUse: ExperimentalFlag.recordUse.isEnabledByDefault, ExperimentalFlag.records: ExperimentalFlag.records.isEnabledByDefault, ExperimentalFlag.sealedClass: ExperimentalFlag.sealedClass.isEnabledByDefault, @@ -1341,6 +1368,8 @@ const Map sharedExperimentalFlags = { ExperimentalFlag.nonfunctionTypeAliases, shared.ExperimentalFlag.nullAwareElements: ExperimentalFlag.nullAwareElements, shared.ExperimentalFlag.patterns: ExperimentalFlag.patterns, + shared.ExperimentalFlag.privateNamedParameters: + ExperimentalFlag.privateNamedParameters, shared.ExperimentalFlag.recordUse: ExperimentalFlag.recordUse, shared.ExperimentalFlag.records: ExperimentalFlag.records, shared.ExperimentalFlag.sealedClass: ExperimentalFlag.sealedClass, diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml index 640dda8ad7c..b92a1f4534b 100644 --- a/tools/experimental_features.yaml +++ b/tools/experimental_features.yaml @@ -164,6 +164,18 @@ features: static-extensions: help: "Extensions with static capabilities." + private-named-parameters: + help: "Allow named parameters with private names that refer to fields." + # TODO(rnystrom): Enable this when the feature is implemented. + # validation: | + # class C { + # String _message; + # C({this._message}); + # } + # main() { + # print(C(message: 'feature enabled')._message); + # } + declaring-constructors: help: "Less verbose constructors."