OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 * Assigns JavaScript identifiers to Dart variables, class-names and members. | 6 * Assigns JavaScript identifiers to Dart variables, class-names and members. |
7 */ | 7 */ |
8 class Namer { | 8 class Namer { |
9 final Compiler compiler; | 9 final Compiler compiler; |
10 | 10 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 // TODO(floitsch): mangle, while preserving uniqueness. | 73 // TODO(floitsch): mangle, while preserving uniqueness. |
74 StringBuffer buffer = new StringBuffer(); | 74 StringBuffer buffer = new StringBuffer(); |
75 List<SourceString> names = selector.getOrderedNamedArguments(); | 75 List<SourceString> names = selector.getOrderedNamedArguments(); |
76 for (SourceString argumentName in names) { | 76 for (SourceString argumentName in names) { |
77 buffer.add(@'$'); | 77 buffer.add(@'$'); |
78 argumentName.printOn(buffer); | 78 argumentName.printOn(buffer); |
79 } | 79 } |
80 return '${privateName(lib, name)}\$${selector.argumentCount}$buffer'; | 80 return '${privateName(lib, name)}\$${selector.argumentCount}$buffer'; |
81 } | 81 } |
82 | 82 |
83 String instanceFieldName(LibraryElement lib, SourceString name) { | 83 String instanceFieldName(ClassElement cls, SourceString name) { |
84 String proposedName = privateName(lib, name); | 84 String proposedName = privateName(cls.getLibrary(), name); |
| 85 if (cls.lookupSuperMember(name) !== null) { |
| 86 String libName = getName(cls.getLibrary()); |
| 87 String clsName = getName(cls); |
| 88 proposedName = '$libName\$$clsName\$$proposedName'; |
| 89 } |
85 return safeName(proposedName); | 90 return safeName(proposedName); |
86 } | 91 } |
87 | 92 |
88 String setterName(LibraryElement lib, SourceString name) { | 93 String setterName(LibraryElement lib, SourceString name) { |
89 // We dynamically create setters from the field-name. The setter name must | 94 // We dynamically create setters from the field-name. The setter name must |
90 // therefore be derived from the instance field-name. | 95 // therefore be derived from the instance field-name. |
91 return 'set\$${instanceFieldName(lib, name)}'; | 96 String safeName = safeName(privateName(lib, name)); |
| 97 return 'set\$$safeName'; |
92 } | 98 } |
93 | 99 |
94 String getterName(LibraryElement lib, SourceString name) { | 100 String getterName(LibraryElement lib, SourceString name) { |
95 // We dynamically create getters from the field-name. The getter name must | 101 // We dynamically create getters from the field-name. The getter name must |
96 // therefore be derived from the instance field-name. | 102 // therefore be derived from the instance field-name. |
97 return 'get\$${instanceFieldName(lib, name)}'; | 103 String safeName = safeName(privateName(lib, name)); |
| 104 return 'get\$$safeName'; |
98 } | 105 } |
99 | 106 |
100 String getFreshGlobalName(String proposedName) { | 107 String getFreshGlobalName(String proposedName) { |
101 int usedCount = usedGlobals[proposedName]; | 108 int usedCount = usedGlobals[proposedName]; |
102 if (usedCount === null) { | 109 if (usedCount === null) { |
103 // No element with this name has been used before. | 110 // No element with this name has been used before. |
104 usedGlobals[proposedName] = 1; | 111 usedGlobals[proposedName] = 1; |
105 return proposedName; | 112 return proposedName; |
106 } else { | 113 } else { |
107 // Not the first time we see this name. Append a number to make it unique. | 114 // Not the first time we see this name. Append a number to make it unique. |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 } else if (element.kind == ElementKind.FUNCTION) { | 180 } else if (element.kind == ElementKind.FUNCTION) { |
174 FunctionElement functionElement = element; | 181 FunctionElement functionElement = element; |
175 return instanceMethodName(element.getLibrary(), | 182 return instanceMethodName(element.getLibrary(), |
176 element.name, | 183 element.name, |
177 functionElement.parameterCount(compiler)); | 184 functionElement.parameterCount(compiler)); |
178 } else if (element.kind == ElementKind.GETTER) { | 185 } else if (element.kind == ElementKind.GETTER) { |
179 return getterName(element.getLibrary(), element.name); | 186 return getterName(element.getLibrary(), element.name); |
180 } else if (element.kind == ElementKind.SETTER) { | 187 } else if (element.kind == ElementKind.SETTER) { |
181 return setterName(element.getLibrary(), element.name); | 188 return setterName(element.getLibrary(), element.name); |
182 } else { | 189 } else { |
183 return instanceFieldName(element.getLibrary(), element.name); | 190 return instanceFieldName(element.getEnclosingClass(), element.name); |
184 } | 191 } |
185 } else { | 192 } else { |
186 // Dealing with a top-level or static element. | 193 // Dealing with a top-level or static element. |
187 String cached = globals[element]; | 194 String cached = globals[element]; |
188 if (cached !== null) return cached; | 195 if (cached !== null) return cached; |
189 | 196 |
190 String guess = _computeGuess(element); | 197 String guess = _computeGuess(element); |
191 switch (element.kind) { | 198 switch (element.kind) { |
192 case ElementKind.VARIABLE: | 199 case ElementKind.VARIABLE: |
193 case ElementKind.PARAMETER: | 200 case ElementKind.PARAMETER: |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 } | 241 } |
235 | 242 |
236 String safeName(String name) { | 243 String safeName(String name) { |
237 if (jsReserved.contains(name) || name.startsWith('\$')) { | 244 if (jsReserved.contains(name) || name.startsWith('\$')) { |
238 name = "\$$name"; | 245 name = "\$$name"; |
239 assert(!jsReserved.contains(name)); | 246 assert(!jsReserved.contains(name)); |
240 } | 247 } |
241 return name; | 248 return name; |
242 } | 249 } |
243 } | 250 } |
OLD | NEW |