dart-sdk/tools/experimental_features.yaml
Kallen Tu 2cfca4e677 [wildcard-variables] Add experiment flag 'wildcards-variables'.
Getting the flag out so we can at least start writing language and co19 tests.

Adds the experiment flag so we can hide future wildcards work until we're ready to ship.

Bug: https://github.com/dart-lang/sdk/issues/55654
Change-Id: I6185360f371bc7c3c7a109b33aeb7df44e1f1a60
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/365545
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Nate Bosch <nbosch@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
2024-05-08 00:37:29 +00:00

385 lines
11 KiB
YAML

# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
# Experimental features are described in docs/process/experimental-flags.md
#
# Despite the name, they are not limited to experiments, and are often
# used to enable new features or enhancements that are being
# developed and are not yet shipped. Experimental feature flags are expected
# to be relatively short-lived. Some features behind experiment flags
# may get cancelled and never ship.
#
# ### Code Generation
#
# When you change this file, run the following to update analyzer, kernel, and
# vm:
#
# analyzer:
# dart pkg/analyzer/tool/experiments/generate.dart
#
# Also, pkg/analyzer/lib/src/dart/analysis/driver.dart will need a bump in
# DATA_VERSION if making changes that change the "index" of any previous flags,
# e.g. if adding a new flag that doesn't happen to be lexicographically last.
#
# kernel:
# dart pkg/front_end/tool/fasta.dart generate-experimental-flags
#
# vm:
# dart tools/generate_experimental_flags.dart
#
# ### Overview
#
# This document consists mostly of a map called "features".
# Each entry in this map corresponds to an experiment,
# and contains the following parts:
#
# 1. help: (required text)
# A human readable description of the experiment.
#
# 2. enabledIn: (optional #.#)
# The Dart SDK version (<major>.<minor>) in which the experiment is shipping.
#
# If this field is specified, then the experiment is enabled regardless of
# the actual version of the SDK. If this field is omitted, then the
# experiment is disabled by default, but may be enabled by specifying the
# flag on the command line. (e.g. --enable-experiment=non-nullable)
#
# A version less than this version may be specified in a .packages file
# or in a library language version override (e.g. // @dart = 2.1)
# to disable this feature. For more on library language version override, see
# https://github.com/dart-lang/language/blob/master/accepted/future-releases/language-versioning/language-versioning.md
#
# 3. expired: (optional boolean)
# If true, then the experiment can no longer be enabled by specifying the
# flag on the command line, and the corresponding entry is slated for
# eventual removal from this file. If this field is omitted, then 'expired'
# is considered to be false.
#
# 4. validation: (optional string)
# If provided this should be a program that prints "feature enabled" on
# stdout if the feature is enabled, and throws or fails to compile otherwise.
# The intended use for this is to be able to run generic tests for each
# experiment.
#
# Using the above fields, experiments pass through several states:
#
# Disabled:
# When an experiment is first added to this file, the 'enabledIn' and
# 'expired' fields are omitted and the experiment is disabled by default,
# but may be enabled by specifying the flag on the command line.
# The implementation teams begin building support for the feature,
# guarded by the flag. Users can enable the flag and begin to try out
# the feature as it is being developed.
#
# Experimental release:
# When an experiment is released, then the 'experimentalReleaseVersion' field
# is added indicating which version of the SDK contains this new language
# feature for libraries and packages in mentioned in
# `sdk/lib/_internal/allowed_experiments.json`. For other libraries and
# packages, passing the experiment flag is still required to turn on the
# experiment.
#
# Shipped:
# When an experiment is shipped, then the 'enabledIn' field is added
# indicating which version of the SDK contains this new language feature.
# At this point, specifying the flag on the command line has no effect because
# the experiment is enabled by default and cannot be disabled.
#
# Retired or Rejected:
# At some point, the 'expired' field is added to the experiment indicating
# that the flag is to be retired if the experiment has shipped or that the
# entire experiment was rejected if the experiment has not shipped. It also
# indicates that the corresponding entry is slated for eventual removal
# from this file. Users specifying this flag on the command line should receive
# a warning that the experiment has been retired or rejected, but the tool
# should continue to run.
#
# In addition, there is also a value called "current-version"
# specifying the version of Dart that is currently being developed.
# Dart source files that don't specify their own version will be
# presumed to be in this version. Experiment flags will not affect
# files that specify an earlier version.
#
# Furthermore, most of the above was designed with language features
# (spanning both CFE and Analyzer) in mind, but didn't take into account
# features in individual products (e.g. in CFE that has no influence on
# Analyzer). As a stepping-stone to allow for this usage as well, a "category"
# is also available. If no "category" is specified it's assumed to be the
# default 'language' "category" with code generated for both CFE and Analyzer,
# while other categories can be tailored more specifically.
current-version: '3.5.0'
features:
variance:
help: "Sound variance"
const-functions:
help: "Allow more of the Dart language to be executed in const expressions."
macros:
experimentalReleaseVersion: '3.3.0'
help: "Static meta-programming"
native-assets:
help: "Compile and bundle native assets."
resource-identifiers:
help: "Output arguments used by static functions."
wildcard-variables:
help: "Local declarations and parameters named `_` are non-binding."
# Experiment flag only used for testing.
test-experiment:
help: >-
Has no effect. Can be used for testing the --enable-experiment
command line functionality.
#
# Flags below this line are shipped, or scheduled to ship in the next
# stable release. They should be sorted descending by release.
#
# Shipped flags should be marked retired the following stable release.
#
inference-update-3: # See https://github.com/dart-lang/language/issues/1618
enabledIn: '3.4.0'
validation: |
class A {}
class B1 implements A {}
class B2 implements A {}
class C1 implements B1, B2 {}
class C2 implements B1, B2 {}
B1 test(bool b, C1 c1, C2 c2) => b ? c1 : c2;
main() {
print('feature enabled');
}
help: "Better handling of conditional expressions, and switch expressions."
expired: true
inline-class:
enabledIn: '3.3.0'
validation: |
extension type E(String rep) {
String f() => '$rep enabled';
}
main() {
print(('feature' as E).f());
}
help: "Extension Types"
expired: true
inference-update-2:
enabledIn: '3.2.0'
validation: |
class C {
final String? _x;
C(this._x);
}
String f(C c) => c._x == null ? 'no' : c._x;
main() {
print(f(C('feature enabled')));
}
help: "Type promotion for fields"
expired: true
sealed-class:
help: "Sealed class"
enabledIn: '3.0.0'
validation: |
sealed class A {}
void main() {
print('feature enabled');
}
expired: true
class-modifiers:
help: "Class modifiers"
enabledIn: '3.0.0'
validation: |
interface class A {}
void main() {
print('feature enabled');
}
expired: true
records:
help: "Records"
enabledIn: '3.0.0'
validation: |
final x = ('feature', a: 'enabled');
void main() {
print('${x.$1} ${x.a}');
}
expired: true
patterns:
help: "Patterns"
enabledIn: '3.0.0'
validation: |
void main() {
final [a, b] = ['feature', 'enabled'];
print('$a $b');
}
expired: true
unnamed-libraries:
help: "Unnamed libraries"
enabledIn: '2.19.0'
validation: |
library;
void main() => print('feature enabled');
expired: true
alternative-invalidation-strategy:
help: "Alternative invalidation strategy for incremental compilation."
category: "CFE"
enabledIn: '2.18.0'
expired: true
inference-update-1:
help: "Horizontal type inference for function expressions passed to generic invocations."
enabledIn: '2.18.0'
validation: |
void test(List<int> list) {
var a = list.fold(0, (x, y) => x + y);
f(a);
}
void f<T>(T t) {
if (T == int) {
print('feature enabled');
}
}
void main() {
test([1, 2, 3]);
}
expired: true
enhanced-enums:
help: "Enhanced Enums"
enabledIn: '2.17.0'
validation: |
enum T {
t();
void test() {
print('feature enabled');
}
}
void main() {
T.t.test();
}
expired: true
named-arguments-anywhere:
help: "Named Arguments Anywhere"
enabledIn: '2.17.0'
validation: |
void test(String msg, {bool enabled = false}) {
if (enabled) {
print(msg);
}
}
void main() {
test(enabled : true, 'feature enabled');
}
expired: true
super-parameters:
help: "Super-Initializer Parameters"
enabledIn: '2.17.0'
validation: |
class B {
final String foo;
B(this.foo);
}
class C extends B {
C(super.foo);
}
void main(){
print(C('feature enabled').foo);
}
expired: true
constructor-tearoffs:
help: "Allow constructor tear-offs and explicit generic instantiations."
enabledIn: '2.15.0'
validation: |
class A {
A() {
print('feature enabled');
}
}
void main() {
var c = A.new;
c();
}
expired: true
generic-metadata:
help: >-
Allow annotations to accept type arguments;
also allow generic function types as type arguments.
enabledIn: '2.14.0'
expired: true
triple-shift:
help: "Triple-shift operator"
enabledIn: '2.14.0'
validation: |
class A {
operator>>>(int k) => 42;
}
void main() {
if ((A() >>> 1) == 42) print('feature enabled');
}
expired: true
nonfunction-type-aliases:
help: "Type aliases define a <type>, not just a <functionType>"
enabledIn: '2.13.0'
validation: |
typedef S = String;
void main() {
S s = 'feature enabled';
print(s);
}
expired: true
non-nullable:
help: "Non Nullable by default"
experimentalReleaseVersion: '2.10.0'
enabledIn: '2.12.0'
validation: |
void main() {
int? a = null;
print('feature enabled');
}
expired: true
extension-methods:
help: "Extension Methods"
enabledIn: '2.6.0'
expired: true
constant-update-2018:
help: "Enhanced constant expressions"
enabledIn: '2.0.0'
expired: true
control-flow-collections:
help: "Control Flow Collections"
enabledIn: '2.0.0'
expired: true
set-literals:
help: "Set Literals"
enabledIn: '2.0.0'
expired: true
spread-collections:
help: "Spread Collections"
enabledIn: '2.0.0'
expired: true