Skip to content

Commit 98e29db

Browse files
committed
[native_assets] Disable experiment on stable and beta channel
We want to avoid users passing `--enable-experiment=native-assets` on stable and beta, as we'd like to move fast and break things on the experiment. This aligns the experiment with how the experiment is working in Flutter: main and dev branch only. Before this CL, dartdev did not check experiment flags. Unknown experiments would fail in the VM. After this CL, dartdev checks the experiment flags and errors out early. Change-Id: I875ea3272f4b67342da19ea2e4be329a4b380573 Cq-Include-Trybots: luci.dart.try:pkg-linux-debug-try,pkg-linux-release-arm64-try,pkg-linux-release-try,pkg-mac-release-arm64-try,pkg-mac-release-try,pkg-win-release-arm64-try,pkg-win-release-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/406660 Commit-Queue: Daco Harkes <[email protected]> Reviewed-by: Martin Kustermann <[email protected]>
1 parent 74f2d4b commit 98e29db

File tree

14 files changed

+155
-1
lines changed

14 files changed

+155
-1
lines changed

pkg/analyzer/lib/src/dart/analysis/experiments.g.dart

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ class ExperimentalFeatures {
187187
documentation: 'Augmentations - enhancing declarations from outside',
188188
experimentalReleaseVersion: Version.parse('3.6.0'),
189189
releaseVersion: null,
190+
channels: ["stable", "beta", "dev", "main"],
190191
);
191192

192193
static final class_modifiers = ExperimentalFeature(
@@ -197,6 +198,7 @@ class ExperimentalFeatures {
197198
documentation: 'Class modifiers',
198199
experimentalReleaseVersion: null,
199200
releaseVersion: Version.parse('3.0.0'),
201+
channels: ["stable", "beta", "dev", "main"],
200202
);
201203

202204
static final const_functions = ExperimentalFeature(
@@ -208,6 +210,7 @@ class ExperimentalFeatures {
208210
'Allow more of the Dart language to be executed in const expressions.',
209211
experimentalReleaseVersion: null,
210212
releaseVersion: null,
213+
channels: ["stable", "beta", "dev", "main"],
211214
);
212215

213216
static final constant_update_2018 = ExperimentalFeature(
@@ -218,6 +221,7 @@ class ExperimentalFeatures {
218221
documentation: 'Enhanced constant expressions',
219222
experimentalReleaseVersion: null,
220223
releaseVersion: Version.parse('2.0.0'),
224+
channels: ["stable", "beta", "dev", "main"],
221225
);
222226

223227
static final constructor_tearoffs = ExperimentalFeature(
@@ -229,6 +233,7 @@ class ExperimentalFeatures {
229233
'Allow constructor tear-offs and explicit generic instantiations.',
230234
experimentalReleaseVersion: null,
231235
releaseVersion: Version.parse('2.15.0'),
236+
channels: ["stable", "beta", "dev", "main"],
232237
);
233238

234239
static final control_flow_collections = ExperimentalFeature(
@@ -239,6 +244,7 @@ class ExperimentalFeatures {
239244
documentation: 'Control Flow Collections',
240245
experimentalReleaseVersion: null,
241246
releaseVersion: Version.parse('2.0.0'),
247+
channels: ["stable", "beta", "dev", "main"],
242248
);
243249

244250
static final digit_separators = ExperimentalFeature(
@@ -249,6 +255,7 @@ class ExperimentalFeatures {
249255
documentation: 'Number literals with digit separators.',
250256
experimentalReleaseVersion: null,
251257
releaseVersion: Version.parse('3.6.0'),
258+
channels: ["stable", "beta", "dev", "main"],
252259
);
253260

254261
static final enhanced_enums = ExperimentalFeature(
@@ -259,6 +266,7 @@ class ExperimentalFeatures {
259266
documentation: 'Enhanced Enums',
260267
experimentalReleaseVersion: null,
261268
releaseVersion: Version.parse('2.17.0'),
269+
channels: ["stable", "beta", "dev", "main"],
262270
);
263271

264272
static final enhanced_parts = ExperimentalFeature(
@@ -269,6 +277,7 @@ class ExperimentalFeatures {
269277
documentation: 'Generalize parts to be nested and have exports/imports.',
270278
experimentalReleaseVersion: Version.parse('3.6.0'),
271279
releaseVersion: null,
280+
channels: ["stable", "beta", "dev", "main"],
272281
);
273282

274283
static final enum_shorthands = ExperimentalFeature(
@@ -279,6 +288,7 @@ class ExperimentalFeatures {
279288
documentation: 'Shorter dot syntax for enum values.',
280289
experimentalReleaseVersion: null,
281290
releaseVersion: null,
291+
channels: ["stable", "beta", "dev", "main"],
282292
);
283293

284294
static final extension_methods = ExperimentalFeature(
@@ -289,6 +299,7 @@ class ExperimentalFeatures {
289299
documentation: 'Extension Methods',
290300
experimentalReleaseVersion: null,
291301
releaseVersion: Version.parse('2.6.0'),
302+
channels: ["stable", "beta", "dev", "main"],
292303
);
293304

294305
static final generic_metadata = ExperimentalFeature(
@@ -300,6 +311,7 @@ class ExperimentalFeatures {
300311
'Allow annotations to accept type arguments; also allow generic function types as type arguments.',
301312
experimentalReleaseVersion: null,
302313
releaseVersion: Version.parse('2.14.0'),
314+
channels: ["stable", "beta", "dev", "main"],
303315
);
304316

305317
static final getter_setter_error = ExperimentalFeature(
@@ -311,6 +323,7 @@ class ExperimentalFeatures {
311323
'Stop reporting errors about mismatching types in a getter/setter pair.',
312324
experimentalReleaseVersion: null,
313325
releaseVersion: null,
326+
channels: ["stable", "beta", "dev", "main"],
314327
);
315328

316329
static final inference_update_1 = ExperimentalFeature(
@@ -322,6 +335,7 @@ class ExperimentalFeatures {
322335
'Horizontal type inference for function expressions passed to generic invocations.',
323336
experimentalReleaseVersion: null,
324337
releaseVersion: Version.parse('2.18.0'),
338+
channels: ["stable", "beta", "dev", "main"],
325339
);
326340

327341
static final inference_update_2 = ExperimentalFeature(
@@ -332,6 +346,7 @@ class ExperimentalFeatures {
332346
documentation: 'Type promotion for fields',
333347
experimentalReleaseVersion: null,
334348
releaseVersion: Version.parse('3.2.0'),
349+
channels: ["stable", "beta", "dev", "main"],
335350
);
336351

337352
static final inference_update_3 = ExperimentalFeature(
@@ -343,6 +358,7 @@ class ExperimentalFeatures {
343358
'Better handling of conditional expressions, and switch expressions.',
344359
experimentalReleaseVersion: null,
345360
releaseVersion: Version.parse('3.4.0'),
361+
channels: ["stable", "beta", "dev", "main"],
346362
);
347363

348364
static final inference_update_4 = ExperimentalFeature(
@@ -353,6 +369,7 @@ class ExperimentalFeatures {
353369
documentation: 'A bundle of updates to type inference.',
354370
experimentalReleaseVersion: null,
355371
releaseVersion: null,
372+
channels: ["stable", "beta", "dev", "main"],
356373
);
357374

358375
static final inference_using_bounds = ExperimentalFeature(
@@ -364,6 +381,7 @@ class ExperimentalFeatures {
364381
'Use type parameter bounds more extensively in type inference.',
365382
experimentalReleaseVersion: null,
366383
releaseVersion: Version.parse('3.7.0'),
384+
channels: ["stable", "beta", "dev", "main"],
367385
);
368386

369387
static final inline_class = ExperimentalFeature(
@@ -374,6 +392,7 @@ class ExperimentalFeatures {
374392
documentation: 'Extension Types',
375393
experimentalReleaseVersion: null,
376394
releaseVersion: Version.parse('3.3.0'),
395+
channels: ["stable", "beta", "dev", "main"],
377396
);
378397

379398
static final macros = ExperimentalFeature(
@@ -384,6 +403,7 @@ class ExperimentalFeatures {
384403
documentation: 'Static meta-programming',
385404
experimentalReleaseVersion: Version.parse('3.3.0'),
386405
releaseVersion: null,
406+
channels: ["stable", "beta", "dev", "main"],
387407
);
388408

389409
static final named_arguments_anywhere = ExperimentalFeature(
@@ -394,6 +414,7 @@ class ExperimentalFeatures {
394414
documentation: 'Named Arguments Anywhere',
395415
experimentalReleaseVersion: null,
396416
releaseVersion: Version.parse('2.17.0'),
417+
channels: ["stable", "beta", "dev", "main"],
397418
);
398419

399420
static final native_assets = ExperimentalFeature(
@@ -404,6 +425,7 @@ class ExperimentalFeatures {
404425
documentation: 'Compile and bundle native assets.',
405426
experimentalReleaseVersion: null,
406427
releaseVersion: null,
428+
channels: ["main", "dev"],
407429
);
408430

409431
static final non_nullable = ExperimentalFeature(
@@ -414,6 +436,7 @@ class ExperimentalFeatures {
414436
documentation: 'Non Nullable by default',
415437
experimentalReleaseVersion: Version.parse('2.10.0'),
416438
releaseVersion: Version.parse('2.12.0'),
439+
channels: ["stable", "beta", "dev", "main"],
417440
);
418441

419442
static final nonfunction_type_aliases = ExperimentalFeature(
@@ -424,6 +447,7 @@ class ExperimentalFeatures {
424447
documentation: 'Type aliases define a <type>, not just a <functionType>',
425448
experimentalReleaseVersion: null,
426449
releaseVersion: Version.parse('2.13.0'),
450+
channels: ["stable", "beta", "dev", "main"],
427451
);
428452

429453
static final null_aware_elements = ExperimentalFeature(
@@ -434,6 +458,7 @@ class ExperimentalFeatures {
434458
documentation: 'Null-aware elements and map entries in collections.',
435459
experimentalReleaseVersion: null,
436460
releaseVersion: null,
461+
channels: ["stable", "beta", "dev", "main"],
437462
);
438463

439464
static final patterns = ExperimentalFeature(
@@ -444,6 +469,7 @@ class ExperimentalFeatures {
444469
documentation: 'Patterns',
445470
experimentalReleaseVersion: null,
446471
releaseVersion: Version.parse('3.0.0'),
472+
channels: ["stable", "beta", "dev", "main"],
447473
);
448474

449475
static final record_use = ExperimentalFeature(
@@ -454,6 +480,7 @@ class ExperimentalFeatures {
454480
documentation: 'Output arguments used by static functions.',
455481
experimentalReleaseVersion: null,
456482
releaseVersion: null,
483+
channels: ["main", "dev"],
457484
);
458485

459486
static final records = ExperimentalFeature(
@@ -464,6 +491,7 @@ class ExperimentalFeatures {
464491
documentation: 'Records',
465492
experimentalReleaseVersion: null,
466493
releaseVersion: Version.parse('3.0.0'),
494+
channels: ["stable", "beta", "dev", "main"],
467495
);
468496

469497
static final sealed_class = ExperimentalFeature(
@@ -474,6 +502,7 @@ class ExperimentalFeatures {
474502
documentation: 'Sealed class',
475503
experimentalReleaseVersion: null,
476504
releaseVersion: Version.parse('3.0.0'),
505+
channels: ["stable", "beta", "dev", "main"],
477506
);
478507

479508
static final set_literals = ExperimentalFeature(
@@ -484,6 +513,7 @@ class ExperimentalFeatures {
484513
documentation: 'Set Literals',
485514
experimentalReleaseVersion: null,
486515
releaseVersion: Version.parse('2.0.0'),
516+
channels: ["stable", "beta", "dev", "main"],
487517
);
488518

489519
static final spread_collections = ExperimentalFeature(
@@ -494,6 +524,7 @@ class ExperimentalFeatures {
494524
documentation: 'Spread Collections',
495525
experimentalReleaseVersion: null,
496526
releaseVersion: Version.parse('2.0.0'),
527+
channels: ["stable", "beta", "dev", "main"],
497528
);
498529

499530
static final super_parameters = ExperimentalFeature(
@@ -504,6 +535,7 @@ class ExperimentalFeatures {
504535
documentation: 'Super-Initializer Parameters',
505536
experimentalReleaseVersion: null,
506537
releaseVersion: Version.parse('2.17.0'),
538+
channels: ["stable", "beta", "dev", "main"],
507539
);
508540

509541
static final test_experiment = ExperimentalFeature(
@@ -515,6 +547,7 @@ class ExperimentalFeatures {
515547
'Has no effect. Can be used for testing the --enable-experiment command line functionality.',
516548
experimentalReleaseVersion: null,
517549
releaseVersion: null,
550+
channels: ["stable", "beta", "dev", "main"],
518551
);
519552

520553
static final triple_shift = ExperimentalFeature(
@@ -525,6 +558,7 @@ class ExperimentalFeatures {
525558
documentation: 'Triple-shift operator',
526559
experimentalReleaseVersion: null,
527560
releaseVersion: Version.parse('2.14.0'),
561+
channels: ["stable", "beta", "dev", "main"],
528562
);
529563

530564
static final unnamed_libraries = ExperimentalFeature(
@@ -535,6 +569,7 @@ class ExperimentalFeatures {
535569
documentation: 'Unnamed libraries',
536570
experimentalReleaseVersion: null,
537571
releaseVersion: Version.parse('2.19.0'),
572+
channels: ["stable", "beta", "dev", "main"],
538573
);
539574

540575
static final unquoted_imports = ExperimentalFeature(
@@ -545,6 +580,7 @@ class ExperimentalFeatures {
545580
documentation: 'Shorter import syntax.',
546581
experimentalReleaseVersion: null,
547582
releaseVersion: null,
583+
channels: ["stable", "beta", "dev", "main"],
548584
);
549585

550586
static final variance = ExperimentalFeature(
@@ -555,6 +591,7 @@ class ExperimentalFeatures {
555591
documentation: 'Sound variance',
556592
experimentalReleaseVersion: null,
557593
releaseVersion: null,
594+
channels: ["stable", "beta", "dev", "main"],
558595
);
559596

560597
static final wildcard_variables = ExperimentalFeature(
@@ -566,6 +603,7 @@ class ExperimentalFeatures {
566603
'Local declarations and parameters named `_` are non-binding.',
567604
experimentalReleaseVersion: null,
568605
releaseVersion: Version.parse('3.7.0'),
606+
channels: ["stable", "beta", "dev", "main"],
569607
);
570608
}
571609

pkg/analyzer/lib/src/dart/analysis/experiments_impl.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,12 @@ class ExperimentalFeature implements Feature {
317317
@override
318318
final Version? releaseVersion;
319319

320+
/// The channels on which this experiment is available.
321+
///
322+
/// Valid channels are "stable", "beta", and "main". The "dev" channel in Dart
323+
/// is implied by main.
324+
final List<String> channels;
325+
320326
ExperimentalFeature({
321327
required this.index,
322328
required this.enableString,
@@ -325,6 +331,7 @@ class ExperimentalFeature implements Feature {
325331
required this.documentation,
326332
required this.experimentalReleaseVersion,
327333
required this.releaseVersion,
334+
this.channels = const [],
328335
}) : assert(isEnabledByDefault
329336
? releaseVersion != null
330337
: releaseVersion == null);

pkg/analyzer/tool/experiments/generate.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ class ExperimentalFeatures {
155155
var experimentalReleaseVersion =
156156
(features[key] as YamlMap)['experimentalReleaseVersion'];
157157
var enabledIn = (features[key] as YamlMap)['enabledIn'];
158+
var channels =
159+
(((features[key] as YamlMap)['channels']) as List?)?.cast<String>();
160+
channels ??= ['stable', 'beta', 'dev', 'main'];
161+
var channelsLiteral = '[${channels.map((e) => '"$e"').join(', ')}]';
158162
out.write('''
159163
160164
static final $id = ExperimentalFeature(
@@ -180,6 +184,7 @@ class ExperimentalFeatures {
180184
} else {
181185
out.write("releaseVersion: null,");
182186
}
187+
out.write("channels: $channelsLiteral,");
183188
out.writeln(');');
184189
++index;
185190
}

pkg/dartdev/lib/dartdev.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,13 @@ class DartdevRunner extends CommandRunner<int> {
223223
log = Logger.verbose(ansi: ansi);
224224
}
225225

226+
late final List<String> experimentErrors =
227+
validateExperiments(vmEnabledExperiments);
228+
if (experimentErrors.isNotEmpty) {
229+
experimentErrors.forEach(io.stderr.writeln);
230+
return 254;
231+
}
232+
226233
var command = topLevelResults.command;
227234
final commandNames = [];
228235
while (command != null) {

pkg/dartdev/lib/src/experiments.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:io';
77
import 'package:analyzer/src/dart/analysis/experiments.dart';
88
import 'package:args/args.dart';
99
import 'package:collection/collection.dart' show IterableExtension;
10+
import 'package:dartdev/src/sdk.dart';
1011

1112
const experimentFlagName = 'enable-experiment';
1213

@@ -101,3 +102,28 @@ bool nativeAssetsEnabled(List<String> vmEnabledExperiments) =>
101102

102103
bool recordUseEnabled(List<String> vmEnabledExperiments) =>
103104
vmEnabledExperiments.contains(ExperimentalFeatures.record_use.enableString);
105+
106+
List<String> validateExperiments(List<String> vmEnabledExperiments) {
107+
final errors = <String>[];
108+
for (final enabledExperiment in vmEnabledExperiments) {
109+
final experiment = experimentalFeatures.firstWhereOrNull(
110+
(feature) => feature.enableString == enabledExperiment);
111+
if (experiment == null) {
112+
errors.add('Unknown experiment: $enabledExperiment');
113+
} else if (!_availableOnCurrentChannel(experiment.channels)) {
114+
final availableChannels = experiment.channels.join(', ');
115+
final s = experiment.channels.length >= 2 ? 's' : '';
116+
errors.add(
117+
'Unavailable experiment: ${experiment.enableString} (this experiment '
118+
'is only available on the $availableChannels channel$s, '
119+
'this current channel is ${Runtime.runtime.channel})',
120+
);
121+
}
122+
}
123+
return errors;
124+
}
125+
126+
bool _availableOnCurrentChannel(List<String> channels) {
127+
final channel = Runtime.runtime.channel;
128+
return channels.contains(channel);
129+
}

0 commit comments

Comments
 (0)