blob: 0d512bdfefe15ed9d61d24cc60a70a0b7378e3ec [file] [log] [blame]
// Copyright (c) 2016, 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.
/// Code to rewrite Intl.message calls adding the name and args parameters
/// automatically, primarily used by the transformer.
import 'package:analyzer/analyzer.dart';
import 'package:intl/extract_messages.dart';
/// Rewrite all Intl.message/plural/etc. calls in [source], adding "name"
/// and "args" parameters if they are not provided.
///
/// 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.arguments.isNotEmpty) {
newSource.write(source.substring(start, message.sourcePosition));
// TODO(alanknight): We could generate more efficient code than the
// original here, dispatching more directly to the MessageLookup.
newSource.write(message.toOriginalCode());
start = message.endPosition;
}
}
newSource.write(source.substring(start));
return newSource.toString();
}
/// Find all the messages in the [source] text.
///
/// Report errors as coming from [sourceName]
List findMessages(String source, String sourceName) {
var extraction = new MessageExtraction();
try {
extraction.root = parseCompilationUnit(source, name: sourceName);
} on AnalyzerErrorGroup catch (e) {
extraction.onMessage("Error in parsing $sourceName, no messages extracted.");
extraction.onMessage(" $e");
return [];
}
extraction.origin = sourceName;
var visitor = new MessageFindingVisitor(extraction);
visitor.generateNameAndArgs = true;
extraction.root.accept(visitor);
return visitor.messages.values.toList();
}