Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(335)

Unified Diff: pkg/intl/lib/extract_messages.dart

Issue 771253002: Add a flag to prohibit plurals/genders that don't take up the whole string. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Review fixes Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/intl/bin/generate_from_arb.dart ('k') | pkg/intl/pubspec.yaml » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/intl/lib/extract_messages.dart
diff --git a/pkg/intl/lib/extract_messages.dart b/pkg/intl/lib/extract_messages.dart
index 1f3a39e58cdc1d0aa2d393324d26543711ff2e1d..88045be7d55b640a6702e12ca6cf538864ebf2be 100644
--- a/pkg/intl/lib/extract_messages.dart
+++ b/pkg/intl/lib/extract_messages.dart
@@ -47,6 +47,16 @@ List<String> warnings = [];
/** Were there any warnings or errors in extracting messages. */
bool get hasWarnings => warnings.isNotEmpty;
+/** Are plural and gender expressions required to be at the top level
+ * of an expression, or are they allowed to be embedded in string literals.
+ *
+ * For example, the following expression
+ * 'There are ${Intl.plural(...)} items'.
+ * is legal if [allowEmbeddedPluralsAndGenders] is true, but illegal
+ * if [allowEmbeddedPluralsAndGenders] is false.
+ */
+bool allowEmbeddedPluralsAndGenders = true;
+
/**
* Parse the source of the Dart program file [file] and return a Map from
* message names to [IntlMessage] instances.
@@ -228,7 +238,8 @@ class MessageFindingVisitor extends GeneralizingAstVisitor {
message.arguments = parameters.parameters.map(
(x) => x.identifier.name).toList();
var arguments = node.argumentList.arguments;
- extract(message, arguments);
+ var extractionResult = extract(message, arguments);
+ if (extractionResult == null) return null;
for (var namedArgument in arguments.where((x) => x is NamedExpression)) {
var name = namedArgument.name.label.name;
@@ -249,10 +260,19 @@ class MessageFindingVisitor extends GeneralizingAstVisitor {
*/
MainMessage messageFromIntlMessageCall(MethodInvocation node) {
- void extractFromIntlCall(MainMessage message, List arguments) {
+ MainMessage extractFromIntlCall(MainMessage message, List arguments) {
try {
var interpolation = new InterpolationVisitor(message);
arguments.first.accept(interpolation);
+ if (interpolation.pieces.any((x) => x is Plural || x is Gender) &&
+ !allowEmbeddedPluralsAndGenders) {
+ if (interpolation.pieces.any((x) => x is String && x.isNotEmpty)) {
+ throw new IntlMessageExtractionException(
+ "Plural and gender expressions must be at the top level, "
+ "they cannot be embedded in larger string literals.\n"
+ "Error at $node");
+ }
+ }
message.messagePieces.addAll(interpolation.pieces);
} on IntlMessageExtractionException catch (e) {
message = null;
@@ -260,8 +280,9 @@ class MessageFindingVisitor extends GeneralizingAstVisitor {
..writeAll(["Error ", e, "\nProcessing <", node, ">\n"])
..write(_reportErrorLocation(node));
print(err);
- warnings.add(err);
+ warnings.add(err.toString());
}
+ return message; // Because we may have set it to null on an error.
}
void setValue(MainMessage message, String fieldName, Object fieldValue) {
@@ -279,10 +300,11 @@ class MessageFindingVisitor extends GeneralizingAstVisitor {
MainMessage messageFromDirectPluralOrGenderCall(MethodInvocation node) {
var pluralOrGender;
- void extractFromPluralOrGender(MainMessage message, _) {
+ MainMessage extractFromPluralOrGender(MainMessage message, _) {
var visitor = new PluralAndGenderVisitor(message.messagePieces, message);
node.accept(visitor);
pluralOrGender = message.messagePieces.last;
+ return message;
}
void setAttribute(MainMessage msg, String fieldName, String fieldValue) {
@@ -424,7 +446,7 @@ class PluralAndGenderVisitor extends SimpleAstVisitor {
/**
* Create a MainMessage from [node] using the name and
- * parameters of the last function/method declaration we encountered e
+ * parameters of the last function/method declaration we encountered
* and the parameters to the Intl.message call.
*/
Message messageFromMethodInvocation(MethodInvocation node) {
@@ -450,7 +472,7 @@ class PluralAndGenderVisitor extends SimpleAstVisitor {
..writeAll(["Error ", e, "\nProcessing <", node, ">"])
..write(_reportErrorLocation(node));
print(err);
- warnings.add(err);
+ warnings.add(err.toString());
}
});
var mainArg = node.argumentList.arguments.firstWhere(
« no previous file with comments | « pkg/intl/bin/generate_from_arb.dart ('k') | pkg/intl/pubspec.yaml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698