Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 Function get _compareNodes => | 5 Function get _compareNodes => |
| 6 compareBy((n) => n.getBeginToken().charOffset); | 6 compareBy((n) => n.getBeginToken().charOffset); |
| 7 | 7 |
| 8 typedef String _Renamer(Renamable renamable); | 8 typedef String _Renamer(Renamable renamable); |
| 9 abstract class Renamable { | 9 abstract class Renamable { |
| 10 const int RENAMABLE_TYPE_ELEMENT = 1; | 10 const int RENAMABLE_TYPE_ELEMENT = 1; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 74 renames[node] = renamer(node); | 74 renames[node] = renamer(node); |
| 75 } | 75 } |
| 76 } | 76 } |
| 77 | 77 |
| 78 sortedForEach(Map<Element, Dynamic> map, f) { | 78 sortedForEach(Map<Element, Dynamic> map, f) { |
| 79 for (Element element in sortElements(map.getKeys())) { | 79 for (Element element in sortElements(map.getKeys())) { |
| 80 f(element, map[element]); | 80 f(element, map[element]); |
| 81 } | 81 } |
| 82 } | 82 } |
| 83 | 83 |
| 84 String renameType(DartType type, Function renameElement) { | |
| 85 StringBuffer result = new StringBuffer(renameElement(type.element)); | |
| 86 if (type is InterfaceType && !type.arguments.isEmpty()) { | |
| 87 result.add('<'); | |
| 88 Link<DartType> argumentsLink = type.arguments; | |
| 89 result.add(renameType(argumentsLink.head, renameElement)); | |
| 90 for (Link<DartType> link = argumentsLink.tail; !link.isEmpty(); link = lin k.tail) { | |
|
ahe
2012/10/26 14:13:49
long line.
Roman
2012/10/29 18:14:12
Done.
| |
| 91 result.add(','); | |
| 92 result.add(renameType(link.head, renameElement)); | |
| 93 } | |
| 94 result.add('>'); | |
| 95 } | |
| 96 return result.toString(); | |
| 97 } | |
| 98 | |
| 99 String renameConstructor(Element element, DartType type, Function renameString , Function renameElement) { | |
|
ahe
2012/10/26 14:13:49
Long line.
Roman
2012/10/29 18:14:12
Done.
| |
| 100 assert(element.isConstructor()); | |
| 101 // TODO: Is platform? | |
| 102 StringBuffer result = new StringBuffer(); | |
| 103 String name = element.name.slowToString(); | |
|
ahe
2012/10/26 14:13:49
This should really just be something like:
elemen
| |
| 104 if (element.name.slowToString() != element.getEnclosingClass().name.slowToSt ring()) { | |
|
ahe
2012/10/26 14:13:49
Long line.
ahe
2012/10/26 14:13:49
Why are you calling slowToString on these names? Y
Roman
2012/10/29 18:14:12
Done.
| |
| 105 // Named constructor or factory. Is there a more reliable way to check thi s case? | |
|
ahe
2012/10/26 14:13:49
Long line.
Roman
2012/10/29 18:14:12
Done.
| |
| 106 // Could also be factory for another interface. | |
|
ahe
2012/10/26 14:13:49
We plan to use the empty string as name of constru
| |
| 107 result.add(renameType(type, renameElement)); | |
| 108 result.add('.'); | |
| 109 String prefix = '${element.getEnclosingClass().name.slowToString()}\$'; | |
| 110 assert(name.startsWith(prefix)); | |
| 111 name = name.substring(prefix.length); | |
| 112 // result.add(renameString(element.getLibrary(), name)); | |
| 113 result.add(name); | |
|
ahe
2012/10/26 14:13:49
This will get cleaned up. It is a ripe mess that w
| |
| 114 } else { | |
| 115 result.add(renameType(type, renameElement)); | |
| 116 } | |
| 117 return result.toString(); | |
| 118 } | |
| 119 | |
| 84 Function makeElementRenamer(rename, generateUniqueName) => (element) { | 120 Function makeElementRenamer(rename, generateUniqueName) => (element) { |
| 85 assert(Elements.isStaticOrTopLevel(element) | 121 assert(Elements.isStaticOrTopLevel(element) |
| 86 || element is TypeVariableElement); | 122 || element is TypeVariableElement); |
| 87 // TODO(smok): We may want to reuse class static field and method names. | 123 // TODO(smok): We may want to reuse class static field and method names. |
| 88 String originalName = element.name.slowToString(); | 124 String originalName = element.name.slowToString(); |
| 89 LibraryElement library = element.getLibrary(); | 125 LibraryElement library = element.getLibrary(); |
| 126 if (identical(element.getLibrary(), compiler.coreLibrary)) return originalNa me; | |
| 90 if (library.isPlatformLibrary) { | 127 if (library.isPlatformLibrary) { |
| 91 assert(element.isTopLevel()); | 128 assert(element.isTopLevel()); |
| 92 final prefix = | 129 final prefix = |
| 93 imports.putIfAbsent(library, () => generateUniqueName('p')); | 130 imports.putIfAbsent(library, () => generateUniqueName('p')); |
| 94 return '$prefix.$originalName'; | 131 return '$prefix.$originalName'; |
| 95 } | 132 } |
| 96 | 133 |
| 97 return rename(library, originalName); | 134 return rename(library, originalName); |
| 98 }; | 135 }; |
| 99 | 136 |
| 100 Function makeRenamer(generateUniqueName) => | 137 Function makeRenamer(generateUniqueName) => |
| 101 (library, originalName) => | 138 (library, originalName) => |
| 102 renamed.putIfAbsent(library, () => <String>{}) | 139 renamed.putIfAbsent(library, () => <String>{}) |
| 103 .putIfAbsent(originalName, | 140 .putIfAbsent(originalName, |
| 104 () => generateUniqueName(originalName)); | 141 () => generateUniqueName(originalName)); |
| 105 | 142 |
| 106 // Renamer function that takes library and original name and returns a new | 143 // Renamer function that takes library and original name and returns a new |
| 107 // name for given identifier. | 144 // name for given identifier. |
| 108 Function rename; | 145 Function rename; |
| 146 Function renameElement; | |
| 109 // A function that takes original identifier name and generates a new unique | 147 // A function that takes original identifier name and generates a new unique |
| 110 // identifier. | 148 // identifier. |
| 111 Function generateUniqueName; | 149 Function generateUniqueName; |
| 112 if (compiler.enableMinification) { | 150 if (compiler.enableMinification) { |
| 113 MinifyingGenerator generator = new MinifyingGenerator(); | 151 MinifyingGenerator generator = new MinifyingGenerator(); |
| 114 Set<String> forbiddenIdentifiers = new Set<String>.from(['main']); | 152 Set<String> forbiddenIdentifiers = new Set<String>.from(['main']); |
| 115 forbiddenIdentifiers.addAll(Keyword.keywords.getKeys()); | 153 forbiddenIdentifiers.addAll(Keyword.keywords.getKeys()); |
| 116 forbiddenIdentifiers.addAll(fixedMemberNames); | 154 forbiddenIdentifiers.addAll(fixedMemberNames); |
| 117 generateUniqueName = (_) => | 155 generateUniqueName = (_) => |
| 118 generator.generate(forbiddenIdentifiers.contains); | 156 generator.generate(forbiddenIdentifiers.contains); |
| 119 rename = makeRenamer(generateUniqueName); | 157 rename = makeRenamer(generateUniqueName); |
| 120 Function renameElement = makeElementRenamer(rename, generateUniqueName); | 158 renameElement = makeElementRenamer(rename, generateUniqueName); |
| 121 | 159 |
| 122 Set<String> allParameterIdentifiers = new Set<String>(); | 160 Set<String> allParameterIdentifiers = new Set<String>(); |
| 123 for (var functionScope in placeholderCollector.functionScopes.getValues()) { | 161 for (var functionScope in placeholderCollector.functionScopes.getValues()) { |
| 124 allParameterIdentifiers.addAll(functionScope.parameterIdentifiers); | 162 allParameterIdentifiers.addAll(functionScope.parameterIdentifiers); |
| 125 } | 163 } |
| 126 // Build a sorted (by usage) list of local nodes that will be renamed to | 164 // Build a sorted (by usage) list of local nodes that will be renamed to |
| 127 // the same identifier. So the top-used local variables in all functions | 165 // the same identifier. So the top-used local variables in all functions |
| 128 // will be renamed first and will all share the same new identifier. | 166 // will be renamed first and will all share the same new identifier. |
| 129 List<Set<Node>> allSortedLocals = new List<Set<Node>>(); | 167 List<Set<Node>> allSortedLocals = new List<Set<Node>>(); |
| 130 for (var functionScope in placeholderCollector.functionScopes.getValues()) { | 168 for (var functionScope in placeholderCollector.functionScopes.getValues()) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 179 final usedTopLevelOrMemberIdentifiers = new Set<String>(); | 217 final usedTopLevelOrMemberIdentifiers = new Set<String>(); |
| 180 usedTopLevelOrMemberIdentifiers.add('main'); | 218 usedTopLevelOrMemberIdentifiers.add('main'); |
| 181 usedTopLevelOrMemberIdentifiers.addAll(fixedMemberNames); | 219 usedTopLevelOrMemberIdentifiers.addAll(fixedMemberNames); |
| 182 generateUniqueName = (originalName) { | 220 generateUniqueName = (originalName) { |
| 183 String newName = conservativeGenerator( | 221 String newName = conservativeGenerator( |
| 184 originalName, usedTopLevelOrMemberIdentifiers.contains); | 222 originalName, usedTopLevelOrMemberIdentifiers.contains); |
| 185 usedTopLevelOrMemberIdentifiers.add(newName); | 223 usedTopLevelOrMemberIdentifiers.add(newName); |
| 186 return newName; | 224 return newName; |
| 187 }; | 225 }; |
| 188 rename = makeRenamer(generateUniqueName); | 226 rename = makeRenamer(generateUniqueName); |
| 189 Function renameElement = makeElementRenamer(rename, generateUniqueName); | 227 renameElement = makeElementRenamer(rename, generateUniqueName); |
| 190 // Rename elements. | 228 // Rename elements. |
| 191 sortedForEach(placeholderCollector.elementNodes, | 229 sortedForEach(placeholderCollector.elementNodes, |
| 192 (Element element, Set<Node> nodes) { | 230 (Element element, Set<Node> nodes) { |
| 193 renameNodes(nodes, (_) => renameElement(element)); | 231 renameNodes(nodes, (_) => renameElement(element)); |
| 194 }); | 232 }); |
| 195 | 233 |
| 196 // Rename locals. | 234 // Rename locals. |
| 197 sortedForEach(placeholderCollector.functionScopes, | 235 sortedForEach(placeholderCollector.functionScopes, |
| 198 (functionElement, functionScope) { | 236 (functionElement, functionScope) { |
| 199 Set<LocalPlaceholder> placeholders = functionScope.localPlaceholders; | 237 Set<LocalPlaceholder> placeholders = functionScope.localPlaceholders; |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 221 // Do not rename members to top-levels, that allows to avoid renaming | 259 // Do not rename members to top-levels, that allows to avoid renaming |
| 222 // members to constructors. | 260 // members to constructors. |
| 223 usedMemberIdentifiers.addAll(usedTopLevelOrMemberIdentifiers); | 261 usedMemberIdentifiers.addAll(usedTopLevelOrMemberIdentifiers); |
| 224 placeholderCollector.memberPlaceholders.forEach((identifier, nodes) { | 262 placeholderCollector.memberPlaceholders.forEach((identifier, nodes) { |
| 225 String newIdentifier = conservativeGenerator( | 263 String newIdentifier = conservativeGenerator( |
| 226 identifier, usedMemberIdentifiers.contains); | 264 identifier, usedMemberIdentifiers.contains); |
| 227 renameNodes(nodes, (_) => newIdentifier); | 265 renameNodes(nodes, (_) => newIdentifier); |
| 228 }); | 266 }); |
| 229 } | 267 } |
| 230 | 268 |
| 269 // Rename constructors. | |
| 270 placeholderCollector.constructorPlaceholders.forEach( | |
| 271 (Element constructor, List<ConstructorPlaceholder> placeholders) { | |
| 272 for (ConstructorPlaceholder ph in placeholders) { | |
| 273 renames[ph.node] = renameConstructor(constructor, ph.type, rename, ren ameElement); | |
| 274 } | |
| 275 }); | |
| 231 sortedForEach(placeholderCollector.privateNodes, (library, nodes) { | 276 sortedForEach(placeholderCollector.privateNodes, (library, nodes) { |
| 232 renameNodes(nodes, (node) => rename(library, node.source.slowToString())); | 277 renameNodes(nodes, (node) => rename(library, node.source.slowToString())); |
| 233 }); | 278 }); |
| 234 renameNodes(placeholderCollector.unresolvedNodes, | 279 renameNodes(placeholderCollector.unresolvedNodes, |
| 235 (_) => generateUniqueName('Unresolved')); | 280 (_) => generateUniqueName('Unresolved')); |
| 236 renameNodes(placeholderCollector.nullNodes, (_) => ''); | 281 renameNodes(placeholderCollector.nullNodes, (_) => ''); |
| 237 if (cutDeclarationTypes) { | 282 if (cutDeclarationTypes) { |
| 238 for (DeclarationTypePlaceholder placeholder in | 283 for (DeclarationTypePlaceholder placeholder in |
| 239 placeholderCollector.declarationTypePlaceholders) { | 284 placeholderCollector.declarationTypePlaceholders) { |
| 240 renames[placeholder.typeNode] = placeholder.requiresVar ? 'var' : ''; | 285 renames[placeholder.typeNode] = placeholder.requiresVar ? 'var' : ''; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 285 index ~/= firstCharAlphabet.length; | 330 index ~/= firstCharAlphabet.length; |
| 286 int length = otherCharsAlphabet.length; | 331 int length = otherCharsAlphabet.length; |
| 287 while (index >= length) { | 332 while (index >= length) { |
| 288 resultBuilder.add(otherCharsAlphabet[index % length]); | 333 resultBuilder.add(otherCharsAlphabet[index % length]); |
| 289 index ~/= length; | 334 index ~/= length; |
| 290 } | 335 } |
| 291 resultBuilder.add(otherCharsAlphabet[index]); | 336 resultBuilder.add(otherCharsAlphabet[index]); |
| 292 return resultBuilder.toString(); | 337 return resultBuilder.toString(); |
| 293 } | 338 } |
| 294 } | 339 } |
| OLD | NEW |