@@ -9,7 +9,11 @@ import 'package:kernel/target/targets.dart' show Target;
99import 'diagnostic_message.dart' show DiagnosticMessageHandler;
1010
1111import 'experimental_flags.dart'
12- show defaultExperimentalFlags, ExperimentalFlag, parseExperimentalFlag;
12+ show
13+ defaultExperimentalFlags,
14+ ExperimentalFlag,
15+ expiredExperimentalFlags,
16+ parseExperimentalFlag;
1317
1418import 'file_system.dart' show FileSystem;
1519
@@ -213,40 +217,89 @@ class CompilerOptions {
213217 bool writeFileOnCrashReport = true ;
214218}
215219
216- /// Parse experimental flags from a list of strings, each of which is either a
217- /// flag name or a flag name prefixed by 'no-'. Return a map of flags to their
218- /// values that can be passed to [experimentalFlags] . The returned map is
219- /// normalized to contain default values for unmentioned flags.
220+ /// Parse experimental flag arguments of the form 'flag' or 'no-flag' into a map
221+ /// from 'flag' to `true` or `false` , respectively.
222+ Map <String , bool > parseExperimentalArguments (List <String > arguments) {
223+ Map <String , bool > result = {};
224+ if (arguments != null ) {
225+ for (var argument in arguments) {
226+ for (var feature in argument.split (',' )) {
227+ if (feature.startsWith ('no-' )) {
228+ result[feature.substring (3 )] = false ;
229+ } else {
230+ result[feature] = true ;
231+ }
232+ }
233+ }
234+ }
235+ return result;
236+ }
237+
238+ /// Parse a map of experimental flags to values that can be passed to
239+ /// [CompilerOptions.experimentalFlags] .
240+ /// The returned map is normalized to contain default values for unmentioned
241+ /// flags.
220242///
221243/// If an unknown flag is mentioned, or a flag is mentioned more than once,
222244/// the supplied error handler is called with an error message.
245+ ///
246+ /// If an expired flag is set to its non-default value the supplied error
247+ /// handler is called with an error message.
248+ ///
249+ /// If an expired flag is set to its default value the supplied warning
250+ /// handler is called with a warning message.
223251Map <ExperimentalFlag , bool > parseExperimentalFlags (
224- Iterable <String > experiments, void onError (String message)) {
252+ Map <String , bool > experiments,
253+ {void onError (String message),
254+ void onWarning (String message)}) {
225255 Map <ExperimentalFlag , bool > flags = < ExperimentalFlag , bool > {};
226256 if (experiments != null ) {
227- for (String experiment in experiments) {
228- bool value = true ;
229- if (experiment.startsWith ("no-" )) {
230- value = false ;
231- experiment = experiment.substring (3 );
232- }
257+ for (String experiment in experiments.keys) {
258+ bool value = experiments[experiment];
233259 ExperimentalFlag flag = parseExperimentalFlag (experiment);
234260 if (flag == null ) {
235261 onError ("Unknown experiment: " + experiment);
236- } else if (flag == ExperimentalFlag .expiredFlag) {
237- print ("Experiment flag no longer required: " + experiment);
238262 } else if (flags.containsKey (flag)) {
239263 if (flags[flag] != value) {
240264 onError (
241265 "Experiment specified with conflicting values: " + experiment);
242266 }
243267 } else {
244- flags[flag] = value;
268+ if (expiredExperimentalFlags[flag]) {
269+ if (value != defaultExperimentalFlags[flag]) {
270+ /// Produce an error when the value is not the default value.
271+ if (value) {
272+ onError ("Enabling experiment " +
273+ experiment +
274+ " is no longer supported." );
275+ } else {
276+ onError ("Disabling experiment " +
277+ experiment +
278+ " is no longer supported." );
279+ }
280+ value = defaultExperimentalFlags[flag];
281+ } else if (onWarning != null ) {
282+ /// Produce a warning when the value is the default value.
283+ if (value) {
284+ onWarning ("Experiment " +
285+ experiment +
286+ " is enabled by default. "
287+ "The use of the flag is deprecated." );
288+ } else {
289+ onWarning ("Experiment " +
290+ experiment +
291+ " is disabled by default. "
292+ "The use of the flag is deprecated." );
293+ }
294+ }
295+ flags[flag] = value;
296+ } else {
297+ flags[flag] = value;
298+ }
245299 }
246300 }
247301 }
248302 for (ExperimentalFlag flag in ExperimentalFlag .values) {
249- if (flag == ExperimentalFlag .expiredFlag) continue ;
250303 assert (defaultExperimentalFlags.containsKey (flag),
251304 "No default value for $flag ." );
252305 flags[flag] ?? = defaultExperimentalFlags[flag];
0 commit comments