|  | # 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 really intended for experiments.) | 
|  | # They are intended 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. | 
|  | # | 
|  | # ### Code Generation | 
|  | # | 
|  | # When you change this file, run the following to update analyzer, kernel, and | 
|  | # vm: | 
|  | # | 
|  | # analyzer: | 
|  | #   dart pkg/analyzer/tool/experiments/generate.dart | 
|  | # | 
|  | # kernel: | 
|  | #   pkg/front_end/tool/fasta 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: '2.17.0' | 
|  |  | 
|  | features: | 
|  | variance: | 
|  | help: "Sound variance" | 
|  |  | 
|  | alternative-invalidation-strategy: | 
|  | help: "Alternative invalidation strategy for incremental compilation." | 
|  | category: "CFE" | 
|  |  | 
|  | value-class: | 
|  | help: "Value class" | 
|  |  | 
|  | extension-types: | 
|  | help: "Extension Types" | 
|  |  | 
|  | const-functions: | 
|  | help: "Allow more of the Dart language to be executed in const expressions." | 
|  |  | 
|  | macros: | 
|  | help: "Static meta-programming" | 
|  |  | 
|  | inference-update-1: | 
|  | help: "Enhanced type inference" | 
|  |  | 
|  | # 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, retired, or rejected, cannot be specified | 
|  | # on the command line, and will eventually be removed. | 
|  | # | 
|  |  | 
|  | 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 | 
|  |  | 
|  | generic-metadata: | 
|  | help: >- | 
|  | Allow annotations to accept type arguments; | 
|  | also allow generic function types as type arguments. | 
|  | enabledIn: '2.14.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 | 
|  |  | 
|  | 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 | 
|  |  | 
|  | 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 | 
|  |  | 
|  | enhanced-enums: | 
|  | help: "Enhanced Enums" | 
|  | enabledIn: '2.17.0' | 
|  | validation: | | 
|  | enum T { | 
|  | t(); | 
|  | void test() { | 
|  | print('feature enabled'); | 
|  | } | 
|  | } | 
|  | void main() { | 
|  | T.t.test(); | 
|  | } | 
|  |  | 
|  | 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'); | 
|  | } | 
|  |  | 
|  | 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); | 
|  | } |