4a27605fdc
Change-Id: I9430d95c012b752bc4ca0530d79252b8b032a26b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/104841 Reviewed-by: Kevin Millikin <kmillikin@google.com> Commit-Queue: Dan Rubel <danrubel@google.com> Auto-Submit: Dan Rubel <danrubel@google.com>
106 lines
2.9 KiB
Dart
106 lines
2.9 KiB
Dart
// Copyright (c) 2019, 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:async';
|
|
|
|
import 'dart:io';
|
|
|
|
import 'dart:isolate';
|
|
|
|
import 'package:yaml/yaml.dart' show YamlMap, loadYaml;
|
|
|
|
import 'package:dart_style/dart_style.dart' show DartFormatter;
|
|
|
|
import '../../lib/src/fasta/scanner/characters.dart' show $A, $MINUS, $a, $z;
|
|
|
|
main(List<String> arguments) async {
|
|
var port = new ReceivePort();
|
|
await new File.fromUri(await computeGeneratedFile())
|
|
.writeAsString(await generateMessagesFile(), flush: true);
|
|
port.close();
|
|
}
|
|
|
|
Future<Uri> computeGeneratedFile() {
|
|
return Isolate.resolvePackageUri(
|
|
Uri.parse('package:front_end/src/api_prototype/experimental_flags.dart'));
|
|
}
|
|
|
|
Future<String> generateMessagesFile() async {
|
|
Uri messagesFile =
|
|
Platform.script.resolve("../../../../tools/experimental_features.yaml");
|
|
Map<dynamic, dynamic> yaml =
|
|
loadYaml(await new File.fromUri(messagesFile).readAsStringSync());
|
|
StringBuffer sb = new StringBuffer();
|
|
|
|
sb.write('''
|
|
// Copyright (c) 2018, 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
|
|
// 'pkg/front_end/tool/fasta generate-experimental-flags' to update.
|
|
''');
|
|
|
|
List<String> keys = yaml.keys.cast<String>().toList()..sort();
|
|
|
|
sb.write('''
|
|
|
|
enum ExperimentalFlag {
|
|
''');
|
|
for (var key in keys) {
|
|
sb.writeln(' ${keyToIdentifier(key)},');
|
|
}
|
|
sb.writeln('}');
|
|
|
|
sb.write('''
|
|
|
|
ExperimentalFlag parseExperimentalFlag(String flag) {
|
|
switch (flag) {
|
|
''');
|
|
for (var key in keys) {
|
|
sb.writeln(' case "$key":');
|
|
sb.writeln(' return ExperimentalFlag.${keyToIdentifier(key)};');
|
|
}
|
|
sb.write(''' }
|
|
return null;
|
|
}
|
|
''');
|
|
|
|
sb.write('''
|
|
|
|
const Map<ExperimentalFlag, bool> defaultExperimentalFlags = {
|
|
''');
|
|
for (var key in keys) {
|
|
bool shipped = (yaml[key] as YamlMap)['enabledIn'] != null;
|
|
sb.writeln(' ExperimentalFlag.${keyToIdentifier(key)}: ${shipped},');
|
|
if (shipped) {
|
|
var expired = (yaml[key] as YamlMap)['expired'];
|
|
if (expired == false) {
|
|
throw 'Cannot mark shipped feature as "expired: false"';
|
|
}
|
|
}
|
|
}
|
|
sb.writeln('};');
|
|
|
|
return new DartFormatter().format("$sb");
|
|
}
|
|
|
|
keyToIdentifier(String key) {
|
|
var identifier = StringBuffer();
|
|
for (int index = 0; index < key.length; ++index) {
|
|
var code = key.codeUnitAt(index);
|
|
if (code == $MINUS) {
|
|
++index;
|
|
code = key.codeUnitAt(index);
|
|
if ($a <= code && code <= $z) {
|
|
code = code - $a + $A;
|
|
}
|
|
}
|
|
identifier.writeCharCode(code);
|
|
}
|
|
return identifier.toString();
|
|
}
|