// Copyright (c) 2021, 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.

// NOTE: THIS FILE IS GENERATED. DO NOT EDIT.
//
// Instead modify 'tools/experimental_features.yaml' and run
// 'dart pkg/front_end/tool/fasta.dart generate-experimental-flags' to update.

part of 'experimental_flags.dart';

/// An experiment flag including its fixed properties.
class ExperimentalFlag {
  /// The name of this flag as used in the --enable-experiment option.
  final String name;

  /// `true` if this experimental feature is enabled by default.
  ///
  /// When `true`, the feature can still be disabled in individual libraries
  /// with a language version below the [experimentEnabledVersion], and if not
  /// [isExpired], the feature can also be disabled by using a 'no-' prefix
  /// in the --enable-experiment option.
  final bool isEnabledByDefault;

  /// `true` if this feature can no longer be changed using the
  /// --enable-experiment option.
  ///
  /// Libraries can still opt out of the feature by using a language version
  /// below the [experimentEnabledVersion].
  final bool isExpired;
  final Version enabledVersion;

  /// The minimum version that supports this feature.
  ///
  /// If the feature is not enabled by default, this is the current language
  /// version.
  final Version experimentEnabledVersion;

  /// The minimum version that supports this feature in allowed libraries.
  ///
  /// Allowed libraries are specified in
  ///
  ///    sdk/lib/_internal/allowed_experiments.json
  final Version experimentReleasedVersion;

  const ExperimentalFlag(
      {required this.name,
      required this.isEnabledByDefault,
      required this.isExpired,
      required this.enabledVersion,
      required this.experimentEnabledVersion,
      required this.experimentReleasedVersion});
  static const ExperimentalFlag alternativeInvalidationStrategy =
      const ExperimentalFlag(
          name: 'alternative-invalidation-strategy',
          isEnabledByDefault: true,
          isExpired: true,
          enabledVersion: const Version(2, 18),
          experimentEnabledVersion: const Version(2, 18),
          experimentReleasedVersion: const Version(2, 18));

  static const ExperimentalFlag classModifiers = const ExperimentalFlag(
      name: 'class-modifiers',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(3, 0),
      experimentEnabledVersion: const Version(3, 0),
      experimentReleasedVersion: const Version(3, 0));

  static const ExperimentalFlag constFunctions = const ExperimentalFlag(
      name: 'const-functions',
      isEnabledByDefault: false,
      isExpired: false,
      enabledVersion: defaultLanguageVersion,
      experimentEnabledVersion: defaultLanguageVersion,
      experimentReleasedVersion: defaultLanguageVersion);

  static const ExperimentalFlag constantUpdate2018 = const ExperimentalFlag(
      name: 'constant-update-2018',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 0),
      experimentEnabledVersion: const Version(2, 0),
      experimentReleasedVersion: const Version(2, 0));

  static const ExperimentalFlag constructorTearoffs = const ExperimentalFlag(
      name: 'constructor-tearoffs',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 15),
      experimentEnabledVersion: const Version(2, 15),
      experimentReleasedVersion: const Version(2, 15));

  static const ExperimentalFlag controlFlowCollections = const ExperimentalFlag(
      name: 'control-flow-collections',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 0),
      experimentEnabledVersion: const Version(2, 0),
      experimentReleasedVersion: const Version(2, 0));

  static const ExperimentalFlag enhancedEnums = const ExperimentalFlag(
      name: 'enhanced-enums',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 17),
      experimentEnabledVersion: const Version(2, 17),
      experimentReleasedVersion: const Version(2, 17));

  static const ExperimentalFlag extensionMethods = const ExperimentalFlag(
      name: 'extension-methods',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 6),
      experimentEnabledVersion: const Version(2, 6),
      experimentReleasedVersion: const Version(2, 6));

  static const ExperimentalFlag genericMetadata = const ExperimentalFlag(
      name: 'generic-metadata',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 14),
      experimentEnabledVersion: const Version(2, 14),
      experimentReleasedVersion: const Version(2, 14));

  static const ExperimentalFlag inferenceUpdate1 = const ExperimentalFlag(
      name: 'inference-update-1',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 18),
      experimentEnabledVersion: const Version(2, 18),
      experimentReleasedVersion: const Version(2, 18));

  static const ExperimentalFlag inferenceUpdate2 = const ExperimentalFlag(
      name: 'inference-update-2',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(3, 2),
      experimentEnabledVersion: const Version(3, 2),
      experimentReleasedVersion: const Version(3, 2));

  static const ExperimentalFlag inferenceUpdate3 = const ExperimentalFlag(
      name: 'inference-update-3',
      isEnabledByDefault: true,
      isExpired: false,
      enabledVersion: const Version(3, 4),
      experimentEnabledVersion: const Version(3, 4),
      experimentReleasedVersion: const Version(3, 4));

  static const ExperimentalFlag inlineClass = const ExperimentalFlag(
      name: 'inline-class',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(3, 3),
      experimentEnabledVersion: const Version(3, 3),
      experimentReleasedVersion: const Version(3, 3));

  static const ExperimentalFlag macros = const ExperimentalFlag(
      name: 'macros',
      isEnabledByDefault: false,
      isExpired: false,
      enabledVersion: defaultLanguageVersion,
      experimentEnabledVersion: defaultLanguageVersion,
      experimentReleasedVersion: const Version(3, 3));

  static const ExperimentalFlag namedArgumentsAnywhere = const ExperimentalFlag(
      name: 'named-arguments-anywhere',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 17),
      experimentEnabledVersion: const Version(2, 17),
      experimentReleasedVersion: const Version(2, 17));

  static const ExperimentalFlag nativeAssets = const ExperimentalFlag(
      name: 'native-assets',
      isEnabledByDefault: false,
      isExpired: false,
      enabledVersion: defaultLanguageVersion,
      experimentEnabledVersion: defaultLanguageVersion,
      experimentReleasedVersion: defaultLanguageVersion);

  static const ExperimentalFlag nonNullable = const ExperimentalFlag(
      name: 'non-nullable',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 12),
      experimentEnabledVersion: const Version(2, 12),
      experimentReleasedVersion: const Version(2, 10));

  static const ExperimentalFlag nonfunctionTypeAliases = const ExperimentalFlag(
      name: 'nonfunction-type-aliases',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 13),
      experimentEnabledVersion: const Version(2, 13),
      experimentReleasedVersion: const Version(2, 13));

  static const ExperimentalFlag patterns = const ExperimentalFlag(
      name: 'patterns',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(3, 0),
      experimentEnabledVersion: const Version(3, 0),
      experimentReleasedVersion: const Version(3, 0));

  static const ExperimentalFlag records = const ExperimentalFlag(
      name: 'records',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(3, 0),
      experimentEnabledVersion: const Version(3, 0),
      experimentReleasedVersion: const Version(3, 0));

  static const ExperimentalFlag resourceIdentifiers = const ExperimentalFlag(
      name: 'resource-identifiers',
      isEnabledByDefault: false,
      isExpired: false,
      enabledVersion: defaultLanguageVersion,
      experimentEnabledVersion: defaultLanguageVersion,
      experimentReleasedVersion: defaultLanguageVersion);

  static const ExperimentalFlag sealedClass = const ExperimentalFlag(
      name: 'sealed-class',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(3, 0),
      experimentEnabledVersion: const Version(3, 0),
      experimentReleasedVersion: const Version(3, 0));

  static const ExperimentalFlag setLiterals = const ExperimentalFlag(
      name: 'set-literals',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 0),
      experimentEnabledVersion: const Version(2, 0),
      experimentReleasedVersion: const Version(2, 0));

  static const ExperimentalFlag spreadCollections = const ExperimentalFlag(
      name: 'spread-collections',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 0),
      experimentEnabledVersion: const Version(2, 0),
      experimentReleasedVersion: const Version(2, 0));

  static const ExperimentalFlag superParameters = const ExperimentalFlag(
      name: 'super-parameters',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 17),
      experimentEnabledVersion: const Version(2, 17),
      experimentReleasedVersion: const Version(2, 17));

  static const ExperimentalFlag testExperiment = const ExperimentalFlag(
      name: 'test-experiment',
      isEnabledByDefault: false,
      isExpired: false,
      enabledVersion: defaultLanguageVersion,
      experimentEnabledVersion: defaultLanguageVersion,
      experimentReleasedVersion: defaultLanguageVersion);

  static const ExperimentalFlag tripleShift = const ExperimentalFlag(
      name: 'triple-shift',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 14),
      experimentEnabledVersion: const Version(2, 14),
      experimentReleasedVersion: const Version(2, 14));

  static const ExperimentalFlag unnamedLibraries = const ExperimentalFlag(
      name: 'unnamed-libraries',
      isEnabledByDefault: true,
      isExpired: true,
      enabledVersion: const Version(2, 19),
      experimentEnabledVersion: const Version(2, 19),
      experimentReleasedVersion: const Version(2, 19));

  static const ExperimentalFlag variance = const ExperimentalFlag(
      name: 'variance',
      isEnabledByDefault: false,
      isExpired: false,
      enabledVersion: defaultLanguageVersion,
      experimentEnabledVersion: defaultLanguageVersion,
      experimentReleasedVersion: defaultLanguageVersion);
}

/// Interface for accessing the global state of experimental features.
class GlobalFeatures {
  final Map<ExperimentalFlag, bool> explicitExperimentalFlags;
  final AllowedExperimentalFlags? allowedExperimentalFlags;
  final Map<ExperimentalFlag, bool>? defaultExperimentFlagsForTesting;
  final Map<ExperimentalFlag, Version>? experimentEnabledVersionForTesting;
  final Map<ExperimentalFlag, Version>? experimentReleasedVersionForTesting;

  GlobalFeatures(this.explicitExperimentalFlags,
      {this.allowedExperimentalFlags,
      this.defaultExperimentFlagsForTesting,
      this.experimentEnabledVersionForTesting,
      this.experimentReleasedVersionForTesting});

  GlobalFeature _computeGlobalFeature(ExperimentalFlag flag) {
    return new GlobalFeature(
        flag,
        isExperimentEnabled(flag,
            defaultExperimentFlagsForTesting: defaultExperimentFlagsForTesting,
            explicitExperimentalFlags: explicitExperimentalFlags));
  }

  LibraryFeature _computeLibraryFeature(
      ExperimentalFlag flag, Uri canonicalUri, Version libraryVersion) {
    return new LibraryFeature(
        flag,
        isExperimentEnabledInLibrary(flag, canonicalUri,
            defaultExperimentFlagsForTesting: defaultExperimentFlagsForTesting,
            explicitExperimentalFlags: explicitExperimentalFlags,
            allowedExperimentalFlags: allowedExperimentalFlags),
        getExperimentEnabledVersionInLibrary(
            flag, canonicalUri, explicitExperimentalFlags,
            allowedExperimentalFlags: allowedExperimentalFlags,
            defaultExperimentFlagsForTesting: defaultExperimentFlagsForTesting,
            experimentEnabledVersionForTesting:
                experimentEnabledVersionForTesting,
            experimentReleasedVersionForTesting:
                experimentReleasedVersionForTesting),
        isExperimentEnabledInLibraryByVersion(
            flag, canonicalUri, libraryVersion,
            defaultExperimentFlagsForTesting: defaultExperimentFlagsForTesting,
            explicitExperimentalFlags: explicitExperimentalFlags,
            allowedExperimentalFlags: allowedExperimentalFlags));
  }

  GlobalFeature? _alternativeInvalidationStrategy;
  GlobalFeature get alternativeInvalidationStrategy =>
      _alternativeInvalidationStrategy ??= _computeGlobalFeature(
          ExperimentalFlag.alternativeInvalidationStrategy);

  GlobalFeature? _classModifiers;
  GlobalFeature get classModifiers => _classModifiers ??=
      _computeGlobalFeature(ExperimentalFlag.classModifiers);

  GlobalFeature? _constFunctions;
  GlobalFeature get constFunctions => _constFunctions ??=
      _computeGlobalFeature(ExperimentalFlag.constFunctions);

  GlobalFeature? _constantUpdate2018;
  GlobalFeature get constantUpdate2018 => _constantUpdate2018 ??=
      _computeGlobalFeature(ExperimentalFlag.constantUpdate2018);

  GlobalFeature? _constructorTearoffs;
  GlobalFeature get constructorTearoffs => _constructorTearoffs ??=
      _computeGlobalFeature(ExperimentalFlag.constructorTearoffs);

  GlobalFeature? _controlFlowCollections;
  GlobalFeature get controlFlowCollections => _controlFlowCollections ??=
      _computeGlobalFeature(ExperimentalFlag.controlFlowCollections);

  GlobalFeature? _enhancedEnums;
  GlobalFeature get enhancedEnums =>
      _enhancedEnums ??= _computeGlobalFeature(ExperimentalFlag.enhancedEnums);

  GlobalFeature? _extensionMethods;
  GlobalFeature get extensionMethods => _extensionMethods ??=
      _computeGlobalFeature(ExperimentalFlag.extensionMethods);

  GlobalFeature? _genericMetadata;
  GlobalFeature get genericMetadata => _genericMetadata ??=
      _computeGlobalFeature(ExperimentalFlag.genericMetadata);

  GlobalFeature? _inferenceUpdate1;
  GlobalFeature get inferenceUpdate1 => _inferenceUpdate1 ??=
      _computeGlobalFeature(ExperimentalFlag.inferenceUpdate1);

  GlobalFeature? _inferenceUpdate2;
  GlobalFeature get inferenceUpdate2 => _inferenceUpdate2 ??=
      _computeGlobalFeature(ExperimentalFlag.inferenceUpdate2);

  GlobalFeature? _inferenceUpdate3;
  GlobalFeature get inferenceUpdate3 => _inferenceUpdate3 ??=
      _computeGlobalFeature(ExperimentalFlag.inferenceUpdate3);

  GlobalFeature? _inlineClass;
  GlobalFeature get inlineClass =>
      _inlineClass ??= _computeGlobalFeature(ExperimentalFlag.inlineClass);

  GlobalFeature? _macros;
  GlobalFeature get macros =>
      _macros ??= _computeGlobalFeature(ExperimentalFlag.macros);

  GlobalFeature? _namedArgumentsAnywhere;
  GlobalFeature get namedArgumentsAnywhere => _namedArgumentsAnywhere ??=
      _computeGlobalFeature(ExperimentalFlag.namedArgumentsAnywhere);

  GlobalFeature? _nativeAssets;
  GlobalFeature get nativeAssets =>
      _nativeAssets ??= _computeGlobalFeature(ExperimentalFlag.nativeAssets);

  GlobalFeature? _nonNullable;
  GlobalFeature get nonNullable =>
      _nonNullable ??= _computeGlobalFeature(ExperimentalFlag.nonNullable);

  GlobalFeature? _nonfunctionTypeAliases;
  GlobalFeature get nonfunctionTypeAliases => _nonfunctionTypeAliases ??=
      _computeGlobalFeature(ExperimentalFlag.nonfunctionTypeAliases);

  GlobalFeature? _patterns;
  GlobalFeature get patterns =>
      _patterns ??= _computeGlobalFeature(ExperimentalFlag.patterns);

  GlobalFeature? _records;
  GlobalFeature get records =>
      _records ??= _computeGlobalFeature(ExperimentalFlag.records);

  GlobalFeature? _resourceIdentifiers;
  GlobalFeature get resourceIdentifiers => _resourceIdentifiers ??=
      _computeGlobalFeature(ExperimentalFlag.resourceIdentifiers);

  GlobalFeature? _sealedClass;
  GlobalFeature get sealedClass =>
      _sealedClass ??= _computeGlobalFeature(ExperimentalFlag.sealedClass);

  GlobalFeature? _setLiterals;
  GlobalFeature get setLiterals =>
      _setLiterals ??= _computeGlobalFeature(ExperimentalFlag.setLiterals);

  GlobalFeature? _spreadCollections;
  GlobalFeature get spreadCollections => _spreadCollections ??=
      _computeGlobalFeature(ExperimentalFlag.spreadCollections);

  GlobalFeature? _superParameters;
  GlobalFeature get superParameters => _superParameters ??=
      _computeGlobalFeature(ExperimentalFlag.superParameters);

  GlobalFeature? _testExperiment;
  GlobalFeature get testExperiment => _testExperiment ??=
      _computeGlobalFeature(ExperimentalFlag.testExperiment);

  GlobalFeature? _tripleShift;
  GlobalFeature get tripleShift =>
      _tripleShift ??= _computeGlobalFeature(ExperimentalFlag.tripleShift);

  GlobalFeature? _unnamedLibraries;
  GlobalFeature get unnamedLibraries => _unnamedLibraries ??=
      _computeGlobalFeature(ExperimentalFlag.unnamedLibraries);

  GlobalFeature? _variance;
  GlobalFeature get variance =>
      _variance ??= _computeGlobalFeature(ExperimentalFlag.variance);
}

/// Interface for accessing the state of experimental features within a
/// specific library.
class LibraryFeatures {
  final GlobalFeatures globalFeatures;
  final Uri canonicalUri;
  final Version libraryVersion;

  LibraryFeatures(this.globalFeatures, this.canonicalUri, this.libraryVersion);

  LibraryFeature? _alternativeInvalidationStrategy;
  LibraryFeature get alternativeInvalidationStrategy =>
      _alternativeInvalidationStrategy ??=
          globalFeatures._computeLibraryFeature(
              ExperimentalFlag.alternativeInvalidationStrategy,
              canonicalUri,
              libraryVersion);

  LibraryFeature? _classModifiers;
  LibraryFeature get classModifiers =>
      _classModifiers ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.classModifiers, canonicalUri, libraryVersion);

  LibraryFeature? _constFunctions;
  LibraryFeature get constFunctions =>
      _constFunctions ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.constFunctions, canonicalUri, libraryVersion);

  LibraryFeature? _constantUpdate2018;
  LibraryFeature get constantUpdate2018 =>
      _constantUpdate2018 ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.constantUpdate2018, canonicalUri, libraryVersion);

  LibraryFeature? _constructorTearoffs;
  LibraryFeature get constructorTearoffs =>
      _constructorTearoffs ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.constructorTearoffs, canonicalUri, libraryVersion);

  LibraryFeature? _controlFlowCollections;
  LibraryFeature get controlFlowCollections =>
      _controlFlowCollections ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.controlFlowCollections,
          canonicalUri,
          libraryVersion);

  LibraryFeature? _enhancedEnums;
  LibraryFeature get enhancedEnums =>
      _enhancedEnums ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.enhancedEnums, canonicalUri, libraryVersion);

  LibraryFeature? _extensionMethods;
  LibraryFeature get extensionMethods =>
      _extensionMethods ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.extensionMethods, canonicalUri, libraryVersion);

  LibraryFeature? _genericMetadata;
  LibraryFeature get genericMetadata =>
      _genericMetadata ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.genericMetadata, canonicalUri, libraryVersion);

  LibraryFeature? _inferenceUpdate1;
  LibraryFeature get inferenceUpdate1 =>
      _inferenceUpdate1 ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.inferenceUpdate1, canonicalUri, libraryVersion);

  LibraryFeature? _inferenceUpdate2;
  LibraryFeature get inferenceUpdate2 =>
      _inferenceUpdate2 ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.inferenceUpdate2, canonicalUri, libraryVersion);

  LibraryFeature? _inferenceUpdate3;
  LibraryFeature get inferenceUpdate3 =>
      _inferenceUpdate3 ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.inferenceUpdate3, canonicalUri, libraryVersion);

  LibraryFeature? _inlineClass;
  LibraryFeature get inlineClass =>
      _inlineClass ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.inlineClass, canonicalUri, libraryVersion);

  LibraryFeature? _macros;
  LibraryFeature get macros =>
      _macros ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.macros, canonicalUri, libraryVersion);

  LibraryFeature? _namedArgumentsAnywhere;
  LibraryFeature get namedArgumentsAnywhere =>
      _namedArgumentsAnywhere ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.namedArgumentsAnywhere,
          canonicalUri,
          libraryVersion);

  LibraryFeature? _nativeAssets;
  LibraryFeature get nativeAssets =>
      _nativeAssets ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.nativeAssets, canonicalUri, libraryVersion);

  LibraryFeature? _nonNullable;
  LibraryFeature get nonNullable =>
      _nonNullable ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.nonNullable, canonicalUri, libraryVersion);

  LibraryFeature? _nonfunctionTypeAliases;
  LibraryFeature get nonfunctionTypeAliases =>
      _nonfunctionTypeAliases ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.nonfunctionTypeAliases,
          canonicalUri,
          libraryVersion);

  LibraryFeature? _patterns;
  LibraryFeature get patterns =>
      _patterns ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.patterns, canonicalUri, libraryVersion);

  LibraryFeature? _records;
  LibraryFeature get records =>
      _records ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.records, canonicalUri, libraryVersion);

  LibraryFeature? _resourceIdentifiers;
  LibraryFeature get resourceIdentifiers =>
      _resourceIdentifiers ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.resourceIdentifiers, canonicalUri, libraryVersion);

  LibraryFeature? _sealedClass;
  LibraryFeature get sealedClass =>
      _sealedClass ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.sealedClass, canonicalUri, libraryVersion);

  LibraryFeature? _setLiterals;
  LibraryFeature get setLiterals =>
      _setLiterals ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.setLiterals, canonicalUri, libraryVersion);

  LibraryFeature? _spreadCollections;
  LibraryFeature get spreadCollections =>
      _spreadCollections ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.spreadCollections, canonicalUri, libraryVersion);

  LibraryFeature? _superParameters;
  LibraryFeature get superParameters =>
      _superParameters ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.superParameters, canonicalUri, libraryVersion);

  LibraryFeature? _testExperiment;
  LibraryFeature get testExperiment =>
      _testExperiment ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.testExperiment, canonicalUri, libraryVersion);

  LibraryFeature? _tripleShift;
  LibraryFeature get tripleShift =>
      _tripleShift ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.tripleShift, canonicalUri, libraryVersion);

  LibraryFeature? _unnamedLibraries;
  LibraryFeature get unnamedLibraries =>
      _unnamedLibraries ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.unnamedLibraries, canonicalUri, libraryVersion);

  LibraryFeature? _variance;
  LibraryFeature get variance =>
      _variance ??= globalFeatures._computeLibraryFeature(
          ExperimentalFlag.variance, canonicalUri, libraryVersion);

  /// Returns the [LibraryFeature] corresponding to [experimentalFlag].
  LibraryFeature fromSharedExperimentalFlags(
      shared.ExperimentalFlag experimentalFlag) {
    switch (experimentalFlag) {
      case shared.ExperimentalFlag.classModifiers:
        return classModifiers;
      case shared.ExperimentalFlag.constFunctions:
        return constFunctions;
      case shared.ExperimentalFlag.constantUpdate2018:
        return constantUpdate2018;
      case shared.ExperimentalFlag.constructorTearoffs:
        return constructorTearoffs;
      case shared.ExperimentalFlag.controlFlowCollections:
        return controlFlowCollections;
      case shared.ExperimentalFlag.enhancedEnums:
        return enhancedEnums;
      case shared.ExperimentalFlag.extensionMethods:
        return extensionMethods;
      case shared.ExperimentalFlag.genericMetadata:
        return genericMetadata;
      case shared.ExperimentalFlag.inferenceUpdate1:
        return inferenceUpdate1;
      case shared.ExperimentalFlag.inferenceUpdate2:
        return inferenceUpdate2;
      case shared.ExperimentalFlag.inferenceUpdate3:
        return inferenceUpdate3;
      case shared.ExperimentalFlag.inlineClass:
        return inlineClass;
      case shared.ExperimentalFlag.macros:
        return macros;
      case shared.ExperimentalFlag.namedArgumentsAnywhere:
        return namedArgumentsAnywhere;
      case shared.ExperimentalFlag.nativeAssets:
        return nativeAssets;
      case shared.ExperimentalFlag.nonNullable:
        return nonNullable;
      case shared.ExperimentalFlag.nonfunctionTypeAliases:
        return nonfunctionTypeAliases;
      case shared.ExperimentalFlag.patterns:
        return patterns;
      case shared.ExperimentalFlag.records:
        return records;
      case shared.ExperimentalFlag.resourceIdentifiers:
        return resourceIdentifiers;
      case shared.ExperimentalFlag.sealedClass:
        return sealedClass;
      case shared.ExperimentalFlag.setLiterals:
        return setLiterals;
      case shared.ExperimentalFlag.spreadCollections:
        return spreadCollections;
      case shared.ExperimentalFlag.superParameters:
        return superParameters;
      case shared.ExperimentalFlag.testExperiment:
        return testExperiment;
      case shared.ExperimentalFlag.tripleShift:
        return tripleShift;
      case shared.ExperimentalFlag.unnamedLibraries:
        return unnamedLibraries;
      case shared.ExperimentalFlag.variance:
        return variance;
      default:
        throw new UnsupportedError(
            'LibraryFeatures.fromSharedExperimentalFlags($experimentalFlag)');
    }
  }
}

ExperimentalFlag? parseExperimentalFlag(String flag) {
  switch (flag) {
    case "alternative-invalidation-strategy":
      return ExperimentalFlag.alternativeInvalidationStrategy;
    case "class-modifiers":
      return ExperimentalFlag.classModifiers;
    case "const-functions":
      return ExperimentalFlag.constFunctions;
    case "constant-update-2018":
      return ExperimentalFlag.constantUpdate2018;
    case "constructor-tearoffs":
      return ExperimentalFlag.constructorTearoffs;
    case "control-flow-collections":
      return ExperimentalFlag.controlFlowCollections;
    case "enhanced-enums":
      return ExperimentalFlag.enhancedEnums;
    case "extension-methods":
      return ExperimentalFlag.extensionMethods;
    case "generic-metadata":
      return ExperimentalFlag.genericMetadata;
    case "inference-update-1":
      return ExperimentalFlag.inferenceUpdate1;
    case "inference-update-2":
      return ExperimentalFlag.inferenceUpdate2;
    case "inference-update-3":
      return ExperimentalFlag.inferenceUpdate3;
    case "inline-class":
      return ExperimentalFlag.inlineClass;
    case "macros":
      return ExperimentalFlag.macros;
    case "named-arguments-anywhere":
      return ExperimentalFlag.namedArgumentsAnywhere;
    case "native-assets":
      return ExperimentalFlag.nativeAssets;
    case "non-nullable":
      return ExperimentalFlag.nonNullable;
    case "nonfunction-type-aliases":
      return ExperimentalFlag.nonfunctionTypeAliases;
    case "patterns":
      return ExperimentalFlag.patterns;
    case "records":
      return ExperimentalFlag.records;
    case "resource-identifiers":
      return ExperimentalFlag.resourceIdentifiers;
    case "sealed-class":
      return ExperimentalFlag.sealedClass;
    case "set-literals":
      return ExperimentalFlag.setLiterals;
    case "spread-collections":
      return ExperimentalFlag.spreadCollections;
    case "super-parameters":
      return ExperimentalFlag.superParameters;
    case "test-experiment":
      return ExperimentalFlag.testExperiment;
    case "triple-shift":
      return ExperimentalFlag.tripleShift;
    case "unnamed-libraries":
      return ExperimentalFlag.unnamedLibraries;
    case "variance":
      return ExperimentalFlag.variance;
  }
  return null;
}

final Map<ExperimentalFlag, bool> defaultExperimentalFlags = {
  ExperimentalFlag.alternativeInvalidationStrategy:
      ExperimentalFlag.alternativeInvalidationStrategy.isEnabledByDefault,
  ExperimentalFlag.classModifiers:
      ExperimentalFlag.classModifiers.isEnabledByDefault,
  ExperimentalFlag.constFunctions:
      ExperimentalFlag.constFunctions.isEnabledByDefault,
  ExperimentalFlag.constantUpdate2018:
      ExperimentalFlag.constantUpdate2018.isEnabledByDefault,
  ExperimentalFlag.constructorTearoffs:
      ExperimentalFlag.constructorTearoffs.isEnabledByDefault,
  ExperimentalFlag.controlFlowCollections:
      ExperimentalFlag.controlFlowCollections.isEnabledByDefault,
  ExperimentalFlag.enhancedEnums:
      ExperimentalFlag.enhancedEnums.isEnabledByDefault,
  ExperimentalFlag.extensionMethods:
      ExperimentalFlag.extensionMethods.isEnabledByDefault,
  ExperimentalFlag.genericMetadata:
      ExperimentalFlag.genericMetadata.isEnabledByDefault,
  ExperimentalFlag.inferenceUpdate1:
      ExperimentalFlag.inferenceUpdate1.isEnabledByDefault,
  ExperimentalFlag.inferenceUpdate2:
      ExperimentalFlag.inferenceUpdate2.isEnabledByDefault,
  ExperimentalFlag.inferenceUpdate3:
      ExperimentalFlag.inferenceUpdate3.isEnabledByDefault,
  ExperimentalFlag.inlineClass: ExperimentalFlag.inlineClass.isEnabledByDefault,
  ExperimentalFlag.macros: ExperimentalFlag.macros.isEnabledByDefault,
  ExperimentalFlag.namedArgumentsAnywhere:
      ExperimentalFlag.namedArgumentsAnywhere.isEnabledByDefault,
  ExperimentalFlag.nativeAssets:
      ExperimentalFlag.nativeAssets.isEnabledByDefault,
  ExperimentalFlag.nonNullable: ExperimentalFlag.nonNullable.isEnabledByDefault,
  ExperimentalFlag.nonfunctionTypeAliases:
      ExperimentalFlag.nonfunctionTypeAliases.isEnabledByDefault,
  ExperimentalFlag.patterns: ExperimentalFlag.patterns.isEnabledByDefault,
  ExperimentalFlag.records: ExperimentalFlag.records.isEnabledByDefault,
  ExperimentalFlag.resourceIdentifiers:
      ExperimentalFlag.resourceIdentifiers.isEnabledByDefault,
  ExperimentalFlag.sealedClass: ExperimentalFlag.sealedClass.isEnabledByDefault,
  ExperimentalFlag.setLiterals: ExperimentalFlag.setLiterals.isEnabledByDefault,
  ExperimentalFlag.spreadCollections:
      ExperimentalFlag.spreadCollections.isEnabledByDefault,
  ExperimentalFlag.superParameters:
      ExperimentalFlag.superParameters.isEnabledByDefault,
  ExperimentalFlag.testExperiment:
      ExperimentalFlag.testExperiment.isEnabledByDefault,
  ExperimentalFlag.tripleShift: ExperimentalFlag.tripleShift.isEnabledByDefault,
  ExperimentalFlag.unnamedLibraries:
      ExperimentalFlag.unnamedLibraries.isEnabledByDefault,
  ExperimentalFlag.variance: ExperimentalFlag.variance.isEnabledByDefault,
};
const AllowedExperimentalFlags defaultAllowedExperimentalFlags =
    const AllowedExperimentalFlags(
        sdkDefaultExperiments: {},
        sdkLibraryExperiments: {},
        packageExperiments: {});
const Map<shared.ExperimentalFlag, ExperimentalFlag> sharedExperimentalFlags = {
  shared.ExperimentalFlag.classModifiers: ExperimentalFlag.classModifiers,
  shared.ExperimentalFlag.constFunctions: ExperimentalFlag.constFunctions,
  shared.ExperimentalFlag.constantUpdate2018:
      ExperimentalFlag.constantUpdate2018,
  shared.ExperimentalFlag.constructorTearoffs:
      ExperimentalFlag.constructorTearoffs,
  shared.ExperimentalFlag.controlFlowCollections:
      ExperimentalFlag.controlFlowCollections,
  shared.ExperimentalFlag.enhancedEnums: ExperimentalFlag.enhancedEnums,
  shared.ExperimentalFlag.extensionMethods: ExperimentalFlag.extensionMethods,
  shared.ExperimentalFlag.genericMetadata: ExperimentalFlag.genericMetadata,
  shared.ExperimentalFlag.inferenceUpdate1: ExperimentalFlag.inferenceUpdate1,
  shared.ExperimentalFlag.inferenceUpdate2: ExperimentalFlag.inferenceUpdate2,
  shared.ExperimentalFlag.inferenceUpdate3: ExperimentalFlag.inferenceUpdate3,
  shared.ExperimentalFlag.inlineClass: ExperimentalFlag.inlineClass,
  shared.ExperimentalFlag.macros: ExperimentalFlag.macros,
  shared.ExperimentalFlag.namedArgumentsAnywhere:
      ExperimentalFlag.namedArgumentsAnywhere,
  shared.ExperimentalFlag.nativeAssets: ExperimentalFlag.nativeAssets,
  shared.ExperimentalFlag.nonNullable: ExperimentalFlag.nonNullable,
  shared.ExperimentalFlag.nonfunctionTypeAliases:
      ExperimentalFlag.nonfunctionTypeAliases,
  shared.ExperimentalFlag.patterns: ExperimentalFlag.patterns,
  shared.ExperimentalFlag.records: ExperimentalFlag.records,
  shared.ExperimentalFlag.resourceIdentifiers:
      ExperimentalFlag.resourceIdentifiers,
  shared.ExperimentalFlag.sealedClass: ExperimentalFlag.sealedClass,
  shared.ExperimentalFlag.setLiterals: ExperimentalFlag.setLiterals,
  shared.ExperimentalFlag.spreadCollections: ExperimentalFlag.spreadCollections,
  shared.ExperimentalFlag.superParameters: ExperimentalFlag.superParameters,
  shared.ExperimentalFlag.testExperiment: ExperimentalFlag.testExperiment,
  shared.ExperimentalFlag.tripleShift: ExperimentalFlag.tripleShift,
  shared.ExperimentalFlag.unnamedLibraries: ExperimentalFlag.unnamedLibraries,
  shared.ExperimentalFlag.variance: ExperimentalFlag.variance,
};
