// 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 category = (entry.value as YamlMap)['category']; if (category == null || category == "vm" || category == "language") { final version = getAsVersionNumber((entry.value as YamlMap)['enabledIn']); if (version != null) { final value = isGreaterOrEqualVersion(currentVersion, version); final name = entry.key.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 #include "platform/assert.h" #include "vm/globals.h" namespace dart { bool GetExperimentalFeatureDefault(ExperimentalFeature feature) { constexpr bool kFeatureValues[] = { $featureValues }; ASSERT(static_cast(feature) < ARRAY_SIZE(kFeatureValues)); return kFeatureValues[static_cast(feature)]; } const char* GetExperimentalFeatureName(ExperimentalFeature feature) { constexpr const char* kFeatureNames[] = { $featureNames }; ASSERT(static_cast(feature) < ARRAY_SIZE(kFeatureNames)); return kFeatureNames[static_cast(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? 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 left, List 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; }