b4611b9357
Change-Id: Iad76a6d0b91ff83fce3dbd963d0c341b3b62eeb9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/102880 Reviewed-by: Paul Berry <paulberry@google.com> Commit-Queue: Dan Rubel <danrubel@google.com>
93 lines
3.6 KiB
Dart
93 lines
3.6 KiB
Dart
// 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.
|
|
|
|
import 'package:analyzer/src/dart/analysis/experiments.dart';
|
|
import 'package:meta/meta.dart';
|
|
import 'package:pub_semver/pub_semver.dart';
|
|
|
|
/// Information about a single language feature whose presence or absence
|
|
/// depends on the supported Dart SDK version, and possibly on the presence of
|
|
/// experimental flags.
|
|
abstract class Feature {
|
|
/// Feature information for the 2018 constant update.
|
|
static const constant_update_2018 = ExperimentalFeatures.constant_update_2018;
|
|
|
|
/// Feature information for non-nullability by default.
|
|
static const non_nullable = ExperimentalFeatures.non_nullable;
|
|
|
|
/// Feature information for control flow collections.
|
|
static const control_flow_collections =
|
|
ExperimentalFeatures.control_flow_collections;
|
|
|
|
/// Feature information for extension methods.
|
|
static const extension_methods = ExperimentalFeatures.extension_methods;
|
|
|
|
/// Feature information for spread collections.
|
|
static const spread_collections = ExperimentalFeatures.spread_collections;
|
|
|
|
/// Feature information for set literals.
|
|
static const set_literals = ExperimentalFeatures.set_literals;
|
|
|
|
/// Feature information for the triple-shift operator.
|
|
static const triple_shift = ExperimentalFeatures.triple_shift;
|
|
|
|
/// If the feature may be enabled or disabled on the command line, the
|
|
/// experimental flag that may be used to enable it. Otherwise `null`.
|
|
///
|
|
/// Should be `null` if [status] is `current` or `abandoned`.
|
|
String get experimentalFlag;
|
|
|
|
/// If [status] is not `future`, the first version of the Dart SDK in which
|
|
/// the given feature was supported. Otherwise `null`.
|
|
Version get firstSupportedVersion;
|
|
|
|
/// The status of the feature.
|
|
FeatureStatus get status;
|
|
}
|
|
|
|
/// An unordered collection of [Feature] objects.
|
|
abstract class FeatureSet {
|
|
/// Computes a set of features for use in a unit test. Computes the set of
|
|
/// features enabled in [sdkVersion], plus any specified [additionalFeatures].
|
|
///
|
|
/// If [sdkVersion] is not supplied (or is `null`), then the current set of
|
|
/// enabled features is used as the starting point.
|
|
@visibleForTesting
|
|
factory FeatureSet.forTesting(
|
|
{String sdkVersion, List<Feature> additionalFeatures}) =
|
|
// ignore: invalid_use_of_visible_for_testing_member
|
|
ExperimentStatus.forTesting;
|
|
|
|
/// Computes the set of features implied by the given set of experimental
|
|
/// enable flags.
|
|
factory FeatureSet.fromEnableFlags(List<String> flags) =
|
|
ExperimentStatus.fromStrings;
|
|
|
|
/// Queries whether the given [feature] is contained in this feature set.
|
|
bool isEnabled(Feature feature);
|
|
|
|
/// Computes a subset of this FeatureSet by removing any features that weren't
|
|
/// available in the given Dart SDK version.
|
|
FeatureSet restrictToVersion(Version version);
|
|
}
|
|
|
|
/// Information about the status of a language feature.
|
|
enum FeatureStatus {
|
|
/// The language feature has not yet shipped. It may not be used unless an
|
|
/// experimental flag is used to enable it.
|
|
future,
|
|
|
|
/// The language feature has not yet shipped, but we are testing the effect of
|
|
/// enabling it by default. It may be used in any library with an appopriate
|
|
/// version constraint, unless an experimental flag is used to disable it.
|
|
provisional,
|
|
|
|
/// The language feature has been shipped. It may be used in any library with
|
|
/// an appropriate version constraint.
|
|
current,
|
|
|
|
/// The language feature is no longer planned. It may not be used.
|
|
abandoned,
|
|
}
|