| # Dart SDK process for changes behind experimental flags | |
| ## Problem statement | |
| The Dart SDK ships via a number of channels: | |
| - Via the [Dart SDK](https://dart.dev/get-dart#install) | |
| - Via the [Flutter SDK](https://flutter.dev/) | |
| - Internally at Google via an internal channel | |
| Each of these channels use varying release calendars, and keeping these entirely | |
| aligned is not practical. Further, a number of developers interested in staying | |
| current with Dart changes, consume the Dart SDK via our [dev | |
| channel](../Branches-and-releases.md). As a | |
| result, we should anticipate that any dev channel build has the potential to end | |
| up as a shipped SDK though some channel. And as a consequence of that, it is | |
| critical that we keep the quality of our dev channel high AND that we keep it | |
| consistent wrt. which features are complete and supported. At the same time, we | |
| need the ability to land incomplete features to facilitate a number of tasks: | |
| - Compose a feature that spans multiple components/areas | |
| - Automated testing prior to the full completion of the feature | |
| - Allow partner teams to get a preview of a future feature | |
| - Allow customers to get a preview of a future feature | |
| - Etc. | |
| ## Solution | |
| To ensure completed & supported features can be differentiated from incomplete | |
| features in-progress, we will put all in-progress features behind a single set | |
| of flags. Changes to features behind these flags are not considered breaking | |
| (even if the feature behind the flag was in a stable SDK), and they are subject | |
| to removal at any time. For details about breaking changes, see the breaking | |
| change process. | |
| All new features that meet one of the following criteria must be developed | |
| behind a flag (when possible): | |
| - All breaking changes | |
| - All language changes | |
| Further, it is recommended to consider developing behind a flag when: | |
| - Landing larger, user-visible changes which will be in an intermediate state | |
| over several weeks and perhaps even releases | |
| - Making changes with the potential to have significant negative performance | |
| impact for several weeks and perhaps even across releases | |
| ## Details | |
| ### Flag format for CLI-based tools | |
| Flags consist of one or more words, combined using dashes, using all lower-case. | |
| The single source of truth of these flags shall be a single shared .dart file. | |
| The tools are expected to offer a framework for querying these flags so that the | |
| implementation of the tools can easily access new flags. | |
| The flags are passed to CLI-based tools using the `--enable-experiment` flag | |
| Multiple flags can be passed by using multiple flags, or by passing several | |
| comma-separated flags. Examples: | |
| ``` | |
| dart --enable-experiment=super-mixins | |
| dart --enable-experiment=super-mixins,no-slow-checks,preview-dart3 | |
| dart --enable-experiment=super-mixins --enable-experiment no-slow-checks --enable-experiment preview-dart3 | |
| ``` | |
| If the user passes a flag that is not recognized (for example, when the flag is | |
| no longer supported), the tool is required to inform about this by printing to | |
| stderr, and not fail. | |
| ``` | |
| dart --enable-experiment better-mixins | |
| Unknown experiment flag 'better-mixins'. | |
| ``` | |
| ### Flag format for UI-based tools (IDEs/editors/etc.) | |
| IDEs and editors which offer the ability to invoke Dart tools, must support | |
| passing these flags. The support should be generic and flexible so that no UI | |
| change is required when we add or remove a flag. This is expected to take one of | |
| two forms: | |
| - Experiments affecting analysis can be enabled in `analysis_options.yaml` under | |
| a single `enable-experiment:` key, e.g. to enable the flags `super-mixins` & | |
| `no-slow-checks`: | |
| ``` | |
| analyzer: | |
| enable-experiment: | |
| - super-mixins | |
| - no-slow-checks | |
| ``` | |
| - Experiments affecting launch/run behavior, can be enabled in the IDE specific | |
| run Configuration, by passing the same `--enable-experiment` flag as listed in | |
| the CLI section. | |
| The current set of experiment flags is defined in a YAML file which the various | |
| tools access: | |
| [experimental_features.yaml](../../tools/experimental_features.yaml). |