Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit b978fdd

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
Move experimental flag defaults to CFE
Change-Id: I9f1890f349fb19bbd792af071adc14ad4e50c364 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/98010 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Sigmund Cherem <sigmund@google.com> Reviewed-by: Aske Simon Christensen <askesc@google.com>
1 parent cc00203 commit b978fdd

File tree

5 files changed

+43
-33
lines changed

5 files changed

+43
-33
lines changed

pkg/compiler/lib/src/options.dart

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ class CompilerOptions implements DiagnosticOptions {
327327
{Uri librariesSpecificationUri, Uri platformBinaries}) {
328328
Map<fe.ExperimentalFlag, bool> languageExperiments =
329329
_extractExperiments(options);
330-
if (equalMaps(languageExperiments, defaultExperimentalFlags)) {
330+
if (equalMaps(languageExperiments, fe.defaultExperimentalFlags)) {
331331
platformBinaries ??= fe.computePlatformBinariesLocation();
332332
}
333333
return new CompilerOptions()
@@ -424,7 +424,7 @@ class CompilerOptions implements DiagnosticOptions {
424424
throw new ArgumentError("[packageRoot] must end with a /");
425425
}
426426
if (platformBinaries == null &&
427-
equalMaps(languageExperiments, defaultExperimentalFlags)) {
427+
equalMaps(languageExperiments, fe.defaultExperimentalFlags)) {
428428
throw new ArgumentError("Missing required ${Flags.platformBinaries}");
429429
}
430430
}
@@ -564,18 +564,8 @@ List<Uri> _extractUriListOption(List<String> options, String flag) {
564564
Map<fe.ExperimentalFlag, bool> _extractExperiments(List<String> options) {
565565
List<String> experiments =
566566
_extractOptionalCsvOption(options, Flags.enableLanguageExperiments);
567-
Map<fe.ExperimentalFlag, bool> flags = fe.parseExperimentalFlags(
567+
return fe.parseExperimentalFlags(
568568
experiments, (String error) => throw new ArgumentError(error));
569-
for (fe.ExperimentalFlag flag in defaultExperimentalFlags.keys) {
570-
flags[flag] ??= defaultExperimentalFlags[flag];
571-
}
572-
return flags;
573569
}
574570

575-
const Map<fe.ExperimentalFlag, bool> defaultExperimentalFlags = {
576-
fe.ExperimentalFlag.constantUpdate2018: false,
577-
fe.ExperimentalFlag.controlFlowCollections: false,
578-
fe.ExperimentalFlag.spreadCollections: false,
579-
};
580-
581571
const String _UNDETERMINED_BUILD_ID = "build number could not be determined";

pkg/front_end/lib/src/api_prototype/compiler_options.dart

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import 'package:kernel/target/targets.dart' show Target;
88

99
import 'diagnostic_message.dart' show DiagnosticMessageHandler;
1010

11-
import 'experimental_flags.dart' show ExperimentalFlag, parseExperimentalFlag;
11+
import 'experimental_flags.dart'
12+
show defaultExperimentalFlags, ExperimentalFlag, parseExperimentalFlag;
1213

1314
import 'file_system.dart' show FileSystem;
1415

@@ -209,30 +210,38 @@ class CompilerOptions {
209210

210211
/// Parse experimental flags from a list of strings, each of which is either a
211212
/// flag name or a flag name prefixed by 'no-'. Return a map of flags to their
212-
/// values that can be passed to [experimentalFlags].
213+
/// values that can be passed to [experimentalFlags]. The returned map is
214+
/// normalized to contain default values for unmentioned flags.
213215
///
214216
/// If an unknown flag is mentioned, or a flag is mentioned more than once,
215217
/// the supplied error handler is called with an error message.
216218
Map<ExperimentalFlag, bool> parseExperimentalFlags(
217219
Iterable<String> experiments, void onError(String message)) {
218220
Map<ExperimentalFlag, bool> flags = <ExperimentalFlag, bool>{};
219-
if (experiments == null) return flags;
220-
for (String experiment in experiments) {
221-
bool value = true;
222-
if (experiment.startsWith("no-")) {
223-
value = false;
224-
experiment = experiment.substring(3);
225-
}
226-
ExperimentalFlag flag = parseExperimentalFlag(experiment);
227-
if (flag == null) {
228-
onError("Unknown experiment: " + experiment);
229-
} else if (flags.containsKey(flag)) {
230-
if (flags[flag] != value) {
231-
onError("Experiment specified with conflicting values: " + experiment);
221+
if (experiments != null) {
222+
for (String experiment in experiments) {
223+
bool value = true;
224+
if (experiment.startsWith("no-")) {
225+
value = false;
226+
experiment = experiment.substring(3);
227+
}
228+
ExperimentalFlag flag = parseExperimentalFlag(experiment);
229+
if (flag == null) {
230+
onError("Unknown experiment: " + experiment);
231+
} else if (flags.containsKey(flag)) {
232+
if (flags[flag] != value) {
233+
onError(
234+
"Experiment specified with conflicting values: " + experiment);
235+
}
236+
} else {
237+
flags[flag] = value;
232238
}
233-
} else {
234-
flags[flag] = value;
235239
}
236240
}
241+
for (ExperimentalFlag flag in ExperimentalFlag.values) {
242+
assert(defaultExperimentalFlags.containsKey(flag),
243+
"No default value for $flag.");
244+
flags[flag] ??= defaultExperimentalFlags[flag];
245+
}
237246
return flags;
238247
}

pkg/front_end/lib/src/api_prototype/experimental_flags.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,10 @@ ExperimentalFlag parseExperimentalFlag(String flag) {
2424
}
2525
return null;
2626
}
27+
28+
const Map<ExperimentalFlag, bool> defaultExperimentalFlags = {
29+
ExperimentalFlag.constantUpdate2018: false,
30+
ExperimentalFlag.controlFlowCollections: false,
31+
ExperimentalFlag.setLiterals: true,
32+
ExperimentalFlag.spreadCollections: false,
33+
};

pkg/front_end/lib/src/api_unstable/dart2js.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ export '../api_prototype/diagnostic_message.dart'
4444
getMessageRelatedInformation,
4545
getMessageUri;
4646

47-
export '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
47+
export '../api_prototype/experimental_flags.dart'
48+
show defaultExperimentalFlags, ExperimentalFlag;
4849

4950
export '../api_prototype/file_system.dart'
5051
show FileSystem, FileSystemEntity, FileSystemException;

pkg/front_end/lib/src/base/processed_options.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ import 'package:package_config/src/packages_impl.dart' show MapPackages;
2424
import '../api_prototype/compiler_options.dart'
2525
show CompilerOptions, DiagnosticMessage;
2626

27-
import '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
27+
import '../api_prototype/experimental_flags.dart'
28+
show defaultExperimentalFlags, ExperimentalFlag;
2829

2930
import '../api_prototype/file_system.dart'
3031
show FileSystem, FileSystemEntity, FileSystemException;
@@ -310,9 +311,11 @@ class ProcessedOptions {
310311
_raw.target ?? new NoneTarget(new TargetFlags(legacyMode: legacyMode));
311312

312313
bool isExperimentEnabled(ExperimentalFlag flag) {
314+
assert(defaultExperimentalFlags.containsKey(flag),
315+
"No default value for $flag.");
313316
// TODO(askesc): Determine default flag value from specification file.
314317
if (flag == ExperimentalFlag.setLiterals) return true;
315-
return _raw.experimentalFlags[flag] ?? false;
318+
return _raw.experimentalFlags[flag] ?? defaultExperimentalFlags[flag];
316319
}
317320

318321
/// Get an outline component that summarizes the SDK, if any.

0 commit comments

Comments
 (0)