Add experiment flag for "Private Named Parameters".

Fix #61631.

Change-Id: If797277e0ff294f11515ccfec845381b07c34a11
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/453643
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
Reviewed-by: Kallen Tu <kallentu@google.com>
Auto-Submit: Bob Nystrom <rnystrom@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Nate Bosch <nbosch@google.com>
This commit is contained in:
Robert Nystrom
2025-10-07 17:15:11 -07:00
committed by Commit Queue
parent f1aa58931d
commit 557db62620
8 changed files with 97 additions and 15 deletions
@@ -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,
+1
View File
@@ -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)
@@ -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;
@@ -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.
@@ -49,6 +49,8 @@ final _knownFeatures = <String, ExperimentalFeature>{
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);
@@ -19,5 +19,6 @@ List<String> experimentsForTests = [
Feature.declaring_constructors.enableString,
Feature.enhanced_parts.enableString,
Feature.macros.enableString,
Feature.private_named_parameters.enableString,
Feature.variance.enableString,
];
@@ -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<ExperimentalFlag, bool> 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<shared.ExperimentalFlag, ExperimentalFlag> 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,
+12
View File
@@ -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."