| Index: pkg/front_end/tool/_fasta/generate_messages.dart
|
| diff --git a/pkg/front_end/tool/_fasta/generate_messages.dart b/pkg/front_end/tool/_fasta/generate_messages.dart
|
| index 656cc043f6a8a648f8d8af95ee4227e01b9756ad..26875902731a72871757f42752558c95768fb759 100644
|
| --- a/pkg/front_end/tool/_fasta/generate_messages.dart
|
| +++ b/pkg/front_end/tool/_fasta/generate_messages.dart
|
| @@ -8,25 +8,12 @@ import 'dart:isolate';
|
|
|
| import 'package:yaml/yaml.dart' show loadYaml;
|
|
|
| -import 'package:front_end/src/fasta/parser/error_kind.dart' show ErrorKind;
|
| -
|
| import 'package:dart_style/dart_style.dart' show DartFormatter;
|
|
|
| main(List<String> arguments) async {
|
| var port = new ReceivePort();
|
| Uri messagesFile = Platform.script.resolve("../../messages.yaml");
|
| Map yaml = loadYaml(await new File.fromUri(messagesFile).readAsStringSync());
|
| - Set<String> names =
|
| - new Set<String>.from(yaml.keys.map((String s) => "ErrorKind.$s"));
|
| - Set<String> kinds =
|
| - new Set<String>.from(ErrorKind.values.map((kind) => "$kind"));
|
| - Set<String> difference = kinds.difference(names);
|
| - if (difference.isNotEmpty) {
|
| - Uri errorKindFile = await Isolate.resolvePackageUri(
|
| - Uri.parse('package:front_end/src/fasta/parser/error_kind.dart'));
|
| - throw "Mismatch between '${errorKindFile.toFilePath()}' and"
|
| - " '${messagesFile.toFilePath()}': ${difference.join(' ')}.";
|
| - }
|
| StringBuffer sb = new StringBuffer();
|
|
|
| sb.writeln("""
|
| @@ -39,11 +26,7 @@ main(List<String> arguments) async {
|
| // Instead modify 'pkg/front_end/messages.yaml' and run
|
| // 'pkg/front_end/tool/_fasta/generate_messages.dart' to update.
|
|
|
| -library fasta.problems;
|
| -
|
| -import 'package:front_end/src/fasta/scanner/token.dart' show Token;
|
| -
|
| -import 'package:front_end/src/fasta/parser/error_kind.dart' show ErrorKind;
|
| +part of fasta.codes;
|
| """);
|
|
|
| yaml.forEach((String name, description) {
|
| @@ -51,13 +34,14 @@ import 'package:front_end/src/fasta/parser/error_kind.dart' show ErrorKind;
|
| description = yaml[description];
|
| }
|
| Map map = description;
|
| - sb.writeln(compileTemplate(name, map['template'], map['tip']));
|
| + sb.writeln(compileTemplate(name, map['template'], map['tip'],
|
| + map['analyzerCode'], map['dart2jsCode']));
|
| });
|
|
|
| String dartfmtedText = new DartFormatter().format("$sb");
|
|
|
| Uri problemsFile = await Isolate.resolvePackageUri(
|
| - Uri.parse('package:front_end/src/fasta/problems.dart'));
|
| + Uri.parse('package:front_end/src/fasta/fasta_codes_generated.dart'));
|
| await new File.fromUri(problemsFile)
|
| .writeAsString(dartfmtedText, flush: true);
|
| port.close();
|
| @@ -65,38 +49,41 @@ import 'package:front_end/src/fasta/parser/error_kind.dart' show ErrorKind;
|
|
|
| final RegExp placeholderPattern = new RegExp("#[a-zA-Z0-9_]+");
|
|
|
| -String compileTemplate(String name, String template, String tip) {
|
| +String compileTemplate(String name, String template, String tip,
|
| + String analyzerCode, String dart2jsCode) {
|
| var parameters = new Set<String>();
|
| var conversions = new Set<String>();
|
| var arguments = new Set<String>();
|
| + parameters.add("Uri uri");
|
| + parameters.add("int charOffset");
|
| for (Match match in placeholderPattern.allMatches("$template${tip ?? ''}")) {
|
| switch (match[0]) {
|
| case "#character":
|
| parameters.add("String character");
|
| - arguments.add("'character': character,");
|
| + arguments.add("'character': character");
|
| break;
|
|
|
| case "#unicode":
|
| parameters.add("int codePoint");
|
| conversions.add("String unicode = "
|
| "\"(U+\${codePoint.toRadixString(16).padLeft(4, '0')})\";");
|
| - arguments.add("'codePoint': codePoint,");
|
| + arguments.add("'codePoint': codePoint");
|
| break;
|
|
|
| case "#name":
|
| parameters.add("String name");
|
| - arguments.add("'name': name,");
|
| + arguments.add("'name': name");
|
| break;
|
|
|
| case "#lexeme":
|
| parameters.add("Token token");
|
| conversions.add("String lexeme = token.lexeme;");
|
| - arguments.add("'token': token,");
|
| + arguments.add("'token': token");
|
| break;
|
|
|
| case "#string":
|
| parameters.add("String string");
|
| - arguments.add("'string': string,");
|
| + arguments.add("'string': string");
|
| break;
|
|
|
| default:
|
| @@ -105,23 +92,48 @@ String compileTemplate(String name, String template, String tip) {
|
| }
|
|
|
| String interpolate(String name, String text) {
|
| - if (text == null) return "";
|
| - return " '$name': "
|
| - "\"${text.replaceAll(r'$', r'\$').replaceAll('#', '\$')}\",";
|
| + return "$name: "
|
| + "\"${text.replaceAll(r'$', r'\$').replaceAll('#', '\$')}\"";
|
| + }
|
| +
|
| + List<String> codeArguments = <String>[];
|
| + if (template != null) {
|
| + codeArguments.add('template: r"$template"');
|
| + }
|
| + if (tip != null) {
|
| + codeArguments.add('tip: r"$tip"');
|
| + }
|
| + if (analyzerCode != null) {
|
| + codeArguments.add('analyzerCode: "$analyzerCode"');
|
| + }
|
| + if (dart2jsCode != null) {
|
| + codeArguments.add('dart2jsCode: "$dart2jsCode"');
|
| }
|
|
|
| + codeArguments.add("format: _format$name");
|
| +
|
| + List<String> messageArguments = <String>[];
|
| + messageArguments.add(interpolate("message", template));
|
| + if (tip != null) {
|
| + messageArguments.add(interpolate("tip", tip));
|
| + }
|
| + messageArguments.add("arguments: { ${arguments.join(', ')} }");
|
| +
|
| return """
|
| -problem$name(${parameters.join(', ')}) {
|
| - // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
| +// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
| +const FastaCode<_$name> code$name =
|
| + const FastaCode<_$name>(${codeArguments.join(', ')});
|
| +
|
| +typedef FastaMessage _$name(${parameters.join(', ')});
|
| +
|
| +// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
|
| +FastaMessage _format$name(${parameters.join(', ')}) {
|
| ${conversions.join('\n ')}
|
| - return {
|
| - ${interpolate('message', template)}
|
| - ${interpolate('tip', tip)}
|
| - 'code': ErrorKind.$name,
|
| - 'arguments': {
|
| - ${arguments.join('\n ')}
|
| - },
|
| - };
|
| + return new FastaMessage(
|
| + uri,
|
| + charOffset,
|
| + code$name,
|
| + ${messageArguments.join(', ')});
|
| }
|
| """;
|
| }
|
|
|