| // 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. |
| |
| // @dart = 2.9 |
| |
| 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. |
| // |
| // Current version: ${currentVersion.join('.')} |
| |
| #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. |
| // |
| // Current version: ${currentVersion.join('.')} |
| |
| #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; |
| } |