| // 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; | 
 | } |