Skip to content

Commit

Permalink
[native_assets] Disable experiment on stable and beta channel
Browse files Browse the repository at this point in the history
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 <dacoharkes@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
  • Loading branch information
dcharkes committed Feb 4, 2025
1 parent 74f2d4b commit 98e29db
Show file tree
Hide file tree
Showing 14 changed files with 155 additions and 1 deletion.
38 changes: 38 additions & 0 deletions pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ class ExperimentalFeatures {
documentation: 'Augmentations - enhancing declarations from outside',
experimentalReleaseVersion: Version.parse('3.6.0'),
releaseVersion: null,
channels: ["stable", "beta", "dev", "main"],
);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

static final variance = ExperimentalFeature(
Expand All @@ -555,6 +591,7 @@ class ExperimentalFeatures {
documentation: 'Sound variance',
experimentalReleaseVersion: null,
releaseVersion: null,
channels: ["stable", "beta", "dev", "main"],
);

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

Expand Down
7 changes: 7 additions & 0 deletions pkg/analyzer/lib/src/dart/analysis/experiments_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,12 @@ class ExperimentalFeature implements Feature {
@override
final Version? releaseVersion;

/// The channels on which this experiment is available.
///
/// Valid channels are "stable", "beta", and "main". The "dev" channel in Dart
/// is implied by main.
final List<String> channels;

ExperimentalFeature({
required this.index,
required this.enableString,
Expand All @@ -325,6 +331,7 @@ class ExperimentalFeature implements Feature {
required this.documentation,
required this.experimentalReleaseVersion,
required this.releaseVersion,
this.channels = const [],
}) : assert(isEnabledByDefault
? releaseVersion != null
: releaseVersion == null);
Expand Down
5 changes: 5 additions & 0 deletions pkg/analyzer/tool/experiments/generate.dart
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,10 @@ class ExperimentalFeatures {
var experimentalReleaseVersion =
(features[key] as YamlMap)['experimentalReleaseVersion'];
var enabledIn = (features[key] as YamlMap)['enabledIn'];
var channels =
(((features[key] as YamlMap)['channels']) as List?)?.cast<String>();
channels ??= ['stable', 'beta', 'dev', 'main'];
var channelsLiteral = '[${channels.map((e) => '"$e"').join(', ')}]';
out.write('''
static final $id = ExperimentalFeature(
Expand All @@ -180,6 +184,7 @@ class ExperimentalFeatures {
} else {
out.write("releaseVersion: null,");
}
out.write("channels: $channelsLiteral,");
out.writeln(');');
++index;
}
Expand Down
7 changes: 7 additions & 0 deletions pkg/dartdev/lib/dartdev.dart
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,13 @@ class DartdevRunner extends CommandRunner<int> {
log = Logger.verbose(ansi: ansi);
}

late final List<String> experimentErrors =
validateExperiments(vmEnabledExperiments);
if (experimentErrors.isNotEmpty) {
experimentErrors.forEach(io.stderr.writeln);
return 254;
}

var command = topLevelResults.command;
final commandNames = [];
while (command != null) {
Expand Down
26 changes: 26 additions & 0 deletions pkg/dartdev/lib/src/experiments.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'dart:io';
import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:args/args.dart';
import 'package:collection/collection.dart' show IterableExtension;
import 'package:dartdev/src/sdk.dart';

const experimentFlagName = 'enable-experiment';

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

bool recordUseEnabled(List<String> vmEnabledExperiments) =>
vmEnabledExperiments.contains(ExperimentalFeatures.record_use.enableString);

List<String> validateExperiments(List<String> vmEnabledExperiments) {
final errors = <String>[];
for (final enabledExperiment in vmEnabledExperiments) {
final experiment = experimentalFeatures.firstWhereOrNull(
(feature) => feature.enableString == enabledExperiment);
if (experiment == null) {
errors.add('Unknown experiment: $enabledExperiment');
} else if (!_availableOnCurrentChannel(experiment.channels)) {
final availableChannels = experiment.channels.join(', ');
final s = experiment.channels.length >= 2 ? 's' : '';
errors.add(
'Unavailable experiment: ${experiment.enableString} (this experiment '
'is only available on the $availableChannels channel$s, '
'this current channel is ${Runtime.runtime.channel})',
);
}
}
return errors;
}

bool _availableOnCurrentChannel(List<String> channels) {
final channel = Runtime.runtime.channel;
return channels.contains(channel);
}
Loading

0 comments on commit 98e29db

Please sign in to comment.