OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * This provides classes to represent the internal structure of the | 6 * This provides classes to represent the internal structure of the |
7 * arguments to `Intl.message`. It is used when parsing sources to extract | 7 * arguments to `Intl.message`. It is used when parsing sources to extract |
8 * messages or to generate code for message substitution. Normal programs | 8 * messages or to generate code for message substitution. Normal programs |
9 * using Intl would not import this library. | 9 * using Intl would not import this library. |
10 * | 10 * |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 var messageName = arguments.firstWhere((eachArg) => | 86 var messageName = arguments.firstWhere((eachArg) => |
87 eachArg is NamedExpression && eachArg.name.label.name == 'name', | 87 eachArg is NamedExpression && eachArg.name.label.name == 'name', |
88 orElse: () => null); | 88 orElse: () => null); |
89 if (messageName == null) { | 89 if (messageName == null) { |
90 return "The 'name' argument for Intl.message must be specified"; | 90 return "The 'name' argument for Intl.message must be specified"; |
91 } | 91 } |
92 if (messageName.expression is! SimpleStringLiteral) { | 92 if (messageName.expression is! SimpleStringLiteral) { |
93 return "The 'name' argument for Intl.message must be a simple string " | 93 return "The 'name' argument for Intl.message must be a simple string " |
94 "literal."; | 94 "literal."; |
95 } | 95 } |
96 if (outerName != null && outerName != messageName.expression.value) { | 96 var hasOuterName = outerName != null; |
97 return "The 'name' argument for Intl.message must match " | 97 var givenName = messageName.expression.value; |
98 "the name of the containing function (" | 98 var simpleMatch = outerName == givenName; |
99 "'${messageName.expression.value}' vs. '$outerName')"; | 99 ClassDeclaration classNode(n) { |
| 100 if (n == null) return null; |
| 101 if (n is ClassDeclaration) return n; |
| 102 return classNode(n.parent); |
| 103 } |
| 104 var classDeclaration = classNode(node); |
| 105 var classPlusMethod = classDeclaration == null |
| 106 ? null |
| 107 : "${classDeclaration.name.token.toString()}_$outerName"; |
| 108 var classMatch = classPlusMethod != null && (givenName == classPlusMethod); |
| 109 if (!(hasOuterName && (simpleMatch || classMatch))) { |
| 110 return "The 'name' argument for Intl.message must match either" |
| 111 "the name of the containing function or <className>_<methodName> (" |
| 112 "'$givenName' vs. '$outerName')"; |
100 } | 113 } |
101 var simpleArguments = arguments.where((each) => each is NamedExpression && | 114 var simpleArguments = arguments.where((each) => each is NamedExpression && |
102 ["desc", "name"].contains(each.name.label.name)); | 115 ["desc", "name"].contains(each.name.label.name)); |
103 var values = simpleArguments.map((each) => each.expression).toList(); | 116 var values = simpleArguments.map((each) => each.expression).toList(); |
104 for (var arg in values) { | 117 for (var arg in values) { |
105 if (arg is! StringLiteral) { | 118 if (arg is! StringLiteral) { |
106 return ("Intl.message arguments must be string literals: $arg"); | 119 return ("Intl.message arguments must be string literals: $arg"); |
107 } | 120 } |
108 } | 121 } |
109 return null; | 122 return null; |
(...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
745 out.write('('); | 758 out.write('('); |
746 out.write(mainArgument); | 759 out.write(mainArgument); |
747 var args = codeAttributeNames; | 760 var args = codeAttributeNames; |
748 out.write(", {"); | 761 out.write(", {"); |
749 args.fold(out, | 762 args.fold(out, |
750 (buffer, arg) => buffer..write("'$arg': '${this[arg].toCode()}', ")); | 763 (buffer, arg) => buffer..write("'$arg': '${this[arg].toCode()}', ")); |
751 out.write("})}"); | 764 out.write("})}"); |
752 return out.toString(); | 765 return out.toString(); |
753 } | 766 } |
754 } | 767 } |
OLD | NEW |