|  | // Copyright (c) 2020, 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 'dart:io' show File, Platform; | 
|  |  | 
|  | import 'package:yaml/yaml.dart' show YamlMap, loadYaml; | 
|  |  | 
|  | void main() { | 
|  | YamlMap yaml = loadYaml(File.fromUri(computeYamlFile()).readAsStringSync()); | 
|  | final currentVersion = getAsVersionNumber(yaml['current-version'])!; | 
|  | final enumNames = StringBuffer(); | 
|  | final featureValues = StringBuffer(); | 
|  | final featureNames = StringBuffer(); | 
|  |  | 
|  | YamlMap features = yaml['features']; | 
|  | for (var entry in features.entries) { | 
|  | final value = entry.value as YamlMap; | 
|  | final category = value['category']; | 
|  | if (category == null || category == "vm" || category == "language") { | 
|  | final version = getAsVersionNumber(value['enabledIn']); | 
|  | if (version != null) { | 
|  | final value = isGreaterOrEqualVersion(currentVersion, version); | 
|  | final name = (entry.key as String).replaceAll('-', '_'); | 
|  | enumNames.write('  $name,\n'); | 
|  | featureValues.write('    $value,\n'); | 
|  | featureNames.write('    "${entry.key}",\n'); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | final h = ''' | 
|  | // Copyright (c) 2020, 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 tools/generate_experimental_flags.dart' to update. | 
|  |  | 
|  | #ifndef RUNTIME_VM_EXPERIMENTAL_FEATURES_H_ | 
|  | #define RUNTIME_VM_EXPERIMENTAL_FEATURES_H_ | 
|  |  | 
|  | namespace dart { | 
|  |  | 
|  | enum class ExperimentalFeature { | 
|  | $enumNames}; | 
|  |  | 
|  | bool GetExperimentalFeatureDefault(ExperimentalFeature feature); | 
|  | const char* GetExperimentalFeatureName(ExperimentalFeature feature); | 
|  |  | 
|  | }  // namespace dart | 
|  |  | 
|  | #endif  // RUNTIME_VM_EXPERIMENTAL_FEATURES_H_ | 
|  | '''; | 
|  |  | 
|  | final cc = ''' | 
|  | // Copyright (c) 2020, 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 tools/generate_experimental_flags.dart' to update. | 
|  |  | 
|  | #include "vm/experimental_features.h" | 
|  |  | 
|  | #include <cstring> | 
|  | #include "platform/assert.h" | 
|  | #include "vm/globals.h" | 
|  |  | 
|  | namespace dart { | 
|  |  | 
|  | bool GetExperimentalFeatureDefault(ExperimentalFeature feature) { | 
|  | constexpr bool kFeatureValues[] = { | 
|  | $featureValues  }; | 
|  | ASSERT(static_cast<size_t>(feature) < ARRAY_SIZE(kFeatureValues)); | 
|  | return kFeatureValues[static_cast<int>(feature)]; | 
|  | } | 
|  |  | 
|  | const char* GetExperimentalFeatureName(ExperimentalFeature feature) { | 
|  | constexpr const char* kFeatureNames[] = { | 
|  | $featureNames  }; | 
|  | ASSERT(static_cast<size_t>(feature) < ARRAY_SIZE(kFeatureNames)); | 
|  | return kFeatureNames[static_cast<int>(feature)]; | 
|  | } | 
|  |  | 
|  | }  // namespace dart | 
|  | '''; | 
|  |  | 
|  | File.fromUri(computeHFile()).writeAsStringSync(h); | 
|  | File.fromUri(computeCcFile()).writeAsStringSync(cc); | 
|  | } | 
|  |  | 
|  | Uri computeYamlFile() { | 
|  | return Platform.script.resolve("experimental_features.yaml"); | 
|  | } | 
|  |  | 
|  | Uri computeCcFile() { | 
|  | return Platform.script.resolve("../runtime/vm/experimental_features.cc"); | 
|  | } | 
|  |  | 
|  | Uri computeHFile() { | 
|  | return Platform.script.resolve("../runtime/vm/experimental_features.h"); | 
|  | } | 
|  |  | 
|  | List<num>? getAsVersionNumber(dynamic value) { | 
|  | if (value == null) return null; | 
|  | final version = List.of("$value".split(".").map(int.parse)); | 
|  | while (version.length < 3) { | 
|  | version.add(0); | 
|  | } | 
|  | return version; | 
|  | } | 
|  |  | 
|  | bool isGreaterOrEqualVersion(List<num> left, List<num> right) { | 
|  | assert(left.length == right.length); | 
|  | for (var i = 0; i < left.length; ++i) { | 
|  | if (left[i] != right[i]) return left[i] > right[i]; | 
|  | } | 
|  | return true; | 
|  | } |