blob: 12df6f134e8041ea8b2c8196ffaf0ba6e3d015c4 [file] [log] [blame]
#!/usr/bin/env dart
// Copyright (c) 2017, 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.
/// Converts the examples parameter for Intl messages to be const.
import 'dart:io';
import 'package:args/args.dart';
import 'package:dart_style/dart_style.dart';
import 'package:intl_translation/src/message_rewriter.dart';
main(List<String> args) {
var parser = new ArgParser();
var rest = parser.parse(args).rest;
if (rest.length == 0) {
print('Accepts Dart file paths and rewrites the examples to be const '
'in Intl.message calls.');
print('Usage: make_examples_const [options] [file.dart]...');
print(parser.usage);
exit(0);
}
var formatter = new DartFormatter();
for (var inputFile in rest) {
var outputFile = inputFile;
var file = new File(inputFile);
var content = file.readAsStringSync();
var newSource = rewriteMessages(content, '$file');
if (content == newSource) {
print('No changes to $outputFile');
} else {
print('Writing new source to $outputFile');
var out = new File(outputFile);
out.writeAsStringSync(formatter.format(newSource));
}
}
}
/// Rewrite all Intl.message/plural/etc. calls in [source] which have
/// examples, making them be const.
///
/// Return the modified source code. If there are errors parsing, list
/// [sourceName] in the error message.
String rewriteMessages(String source, String sourceName) {
var messages = findMessages(source, sourceName);
messages.sort((a, b) => a.sourcePosition.compareTo(b.sourcePosition));
var start = 0;
var newSource = new StringBuffer();
for (var message in messages) {
if (message.examples != null) {
newSource.write(source.substring(start, message.sourcePosition));
rewrite(newSource, source, start, message);
start = message.endPosition;
}
}
newSource.write(source.substring(start));
return newSource.toString();
}
void rewrite(StringBuffer newSource, String source, int start, message) {
var originalSource =
source.substring(message.sourcePosition, message.endPosition);
var examples = nonConstExamples.firstMatch(originalSource);
if (examples == null) {
newSource.write(originalSource);
} else {
var modifiedSource = originalSource.replaceFirst(
examples.group(1), examples.group(1) + 'const');
newSource.write(modifiedSource);
}
}
final RegExp nonConstExamples = new RegExp('([\\n,]\\s+examples\: ){');