| 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 part of dart_backend; | 5 part of dart_backend; |
| 6 | 6 |
| 7 Function get _compareNodes => | 7 Function get _compareNodes => |
| 8 compareBy((n) => n.getBeginToken().charOffset); | 8 compareBy((n) => n.getBeginToken().charOffset); |
| 9 | 9 |
| 10 typedef String _Renamer(Renamable renamable); | 10 typedef String _Renamer(Renamable renamable); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 renames[node] = renamer(node); | 76 renames[node] = renamer(node); |
| 77 } | 77 } |
| 78 } | 78 } |
| 79 | 79 |
| 80 sortedForEach(Map<Element, Dynamic> map, f) { | 80 sortedForEach(Map<Element, Dynamic> map, f) { |
| 81 for (Element element in sortElements(map.keys)) { | 81 for (Element element in sortElements(map.keys)) { |
| 82 f(element, map[element]); | 82 f(element, map[element]); |
| 83 } | 83 } |
| 84 } | 84 } |
| 85 | 85 |
| 86 String renameType(DartType type, Function renameElement) { |
| 87 // TODO(smok): Do not rename type if it is in platform library or |
| 88 // js-helpers. |
| 89 StringBuffer result = new StringBuffer(renameElement(type.element)); |
| 90 if (type is InterfaceType && !type.arguments.isEmpty) { |
| 91 result.add('<'); |
| 92 Link<DartType> argumentsLink = type.arguments; |
| 93 result.add(renameType(argumentsLink.head, renameElement)); |
| 94 for (Link<DartType> link = argumentsLink.tail; !link.isEmpty; |
| 95 link = link.tail) { |
| 96 result.add(','); |
| 97 result.add(renameType(link.head, renameElement)); |
| 98 } |
| 99 result.add('>'); |
| 100 } |
| 101 return result.toString(); |
| 102 } |
| 103 |
| 104 String renameConstructor(Element element, DartType type, |
| 105 Function renameString, Function renameElement) { |
| 106 assert(element.isConstructor()); |
| 107 StringBuffer result = new StringBuffer(); |
| 108 String name = element.name.slowToString(); |
| 109 if (element.name != element.getEnclosingClass().name) { |
| 110 // Named constructor or factory. Is there a more reliable way to check |
| 111 // this case? |
| 112 result.add(renameType(type, renameElement)); |
| 113 result.add('.'); |
| 114 String prefix = '${element.getEnclosingClass().name.slowToString()}\$'; |
| 115 if (!name.startsWith(prefix)) { |
| 116 // Factory for another interface (that is going away soon). |
| 117 compiler.internalErrorOnElement(element, |
| 118 "Factory constructors for external interfaces are not supported."); |
| 119 } |
| 120 name = name.substring(prefix.length); |
| 121 result.add(name); |
| 122 } else { |
| 123 result.add(renameType(type, renameElement)); |
| 124 } |
| 125 return result.toString(); |
| 126 } |
| 127 |
| 86 Function makeElementRenamer(rename, generateUniqueName) => (element) { | 128 Function makeElementRenamer(rename, generateUniqueName) => (element) { |
| 87 assert(Elements.isStaticOrTopLevel(element) | 129 assert(Elements.isStaticOrTopLevel(element) |
| 88 || element is TypeVariableElement); | 130 || element is TypeVariableElement); |
| 89 // TODO(smok): We may want to reuse class static field and method names. | 131 // TODO(smok): We may want to reuse class static field and method names. |
| 90 String originalName = element.name.slowToString(); | 132 String originalName = element.name.slowToString(); |
| 91 LibraryElement library = element.getLibrary(); | 133 LibraryElement library = element.getLibrary(); |
| 134 if (identical(element.getLibrary(), compiler.coreLibrary)) { |
| 135 return originalName; |
| 136 } |
| 92 if (library.isPlatformLibrary) { | 137 if (library.isPlatformLibrary) { |
| 93 assert(element.isTopLevel()); | 138 assert(element.isTopLevel()); |
| 94 final prefix = | 139 final prefix = |
| 95 imports.putIfAbsent(library, () => generateUniqueName('p')); | 140 imports.putIfAbsent(library, () => generateUniqueName('p')); |
| 96 return '$prefix.$originalName'; | 141 return '$prefix.$originalName'; |
| 97 } | 142 } |
| 98 | 143 |
| 99 return rename(library, originalName); | 144 return rename(library, originalName); |
| 100 }; | 145 }; |
| 101 | 146 |
| 102 Function makeRenamer(generateUniqueName) => | 147 Function makeRenamer(generateUniqueName) => |
| 103 (library, originalName) => | 148 (library, originalName) => |
| 104 renamed.putIfAbsent(library, () => <String>{}) | 149 renamed.putIfAbsent(library, () => <String>{}) |
| 105 .putIfAbsent(originalName, | 150 .putIfAbsent(originalName, |
| 106 () => generateUniqueName(originalName)); | 151 () => generateUniqueName(originalName)); |
| 107 | 152 |
| 108 // Renamer function that takes library and original name and returns a new | 153 // Renamer function that takes library and original name and returns a new |
| 109 // name for given identifier. | 154 // name for given identifier. |
| 110 Function rename; | 155 Function rename; |
| 156 Function renameElement; |
| 111 // A function that takes original identifier name and generates a new unique | 157 // A function that takes original identifier name and generates a new unique |
| 112 // identifier. | 158 // identifier. |
| 113 Function generateUniqueName; | 159 Function generateUniqueName; |
| 114 if (compiler.enableMinification) { | 160 if (compiler.enableMinification) { |
| 115 MinifyingGenerator generator = new MinifyingGenerator(); | 161 MinifyingGenerator generator = new MinifyingGenerator(); |
| 116 Set<String> forbiddenIdentifiers = new Set<String>.from(['main']); | 162 Set<String> forbiddenIdentifiers = new Set<String>.from(['main']); |
| 117 forbiddenIdentifiers.addAll(Keyword.keywords.keys); | 163 forbiddenIdentifiers.addAll(Keyword.keywords.keys); |
| 118 forbiddenIdentifiers.addAll(fixedMemberNames); | 164 forbiddenIdentifiers.addAll(fixedMemberNames); |
| 119 generateUniqueName = (_) => | 165 generateUniqueName = (_) => |
| 120 generator.generate(forbiddenIdentifiers.contains); | 166 generator.generate(forbiddenIdentifiers.contains); |
| 121 rename = makeRenamer(generateUniqueName); | 167 rename = makeRenamer(generateUniqueName); |
| 122 Function renameElement = makeElementRenamer(rename, generateUniqueName); | 168 renameElement = makeElementRenamer(rename, generateUniqueName); |
| 123 | 169 |
| 124 Set<String> allParameterIdentifiers = new Set<String>(); | 170 Set<String> allParameterIdentifiers = new Set<String>(); |
| 125 for (var functionScope in placeholderCollector.functionScopes.values) { | 171 for (var functionScope in placeholderCollector.functionScopes.values) { |
| 126 allParameterIdentifiers.addAll(functionScope.parameterIdentifiers); | 172 allParameterIdentifiers.addAll(functionScope.parameterIdentifiers); |
| 127 } | 173 } |
| 128 // Build a sorted (by usage) list of local nodes that will be renamed to | 174 // Build a sorted (by usage) list of local nodes that will be renamed to |
| 129 // the same identifier. So the top-used local variables in all functions | 175 // the same identifier. So the top-used local variables in all functions |
| 130 // will be renamed first and will all share the same new identifier. | 176 // will be renamed first and will all share the same new identifier. |
| 131 List<Set<Node>> allSortedLocals = new List<Set<Node>>(); | 177 List<Set<Node>> allSortedLocals = new List<Set<Node>>(); |
| 132 for (var functionScope in placeholderCollector.functionScopes.values) { | 178 for (var functionScope in placeholderCollector.functionScopes.values) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 final usedTopLevelOrMemberIdentifiers = new Set<String>(); | 227 final usedTopLevelOrMemberIdentifiers = new Set<String>(); |
| 182 usedTopLevelOrMemberIdentifiers.add('main'); | 228 usedTopLevelOrMemberIdentifiers.add('main'); |
| 183 usedTopLevelOrMemberIdentifiers.addAll(fixedMemberNames); | 229 usedTopLevelOrMemberIdentifiers.addAll(fixedMemberNames); |
| 184 generateUniqueName = (originalName) { | 230 generateUniqueName = (originalName) { |
| 185 String newName = conservativeGenerator( | 231 String newName = conservativeGenerator( |
| 186 originalName, usedTopLevelOrMemberIdentifiers.contains); | 232 originalName, usedTopLevelOrMemberIdentifiers.contains); |
| 187 usedTopLevelOrMemberIdentifiers.add(newName); | 233 usedTopLevelOrMemberIdentifiers.add(newName); |
| 188 return newName; | 234 return newName; |
| 189 }; | 235 }; |
| 190 rename = makeRenamer(generateUniqueName); | 236 rename = makeRenamer(generateUniqueName); |
| 191 Function renameElement = makeElementRenamer(rename, generateUniqueName); | 237 renameElement = makeElementRenamer(rename, generateUniqueName); |
| 192 // Rename elements. | 238 // Rename elements. |
| 193 sortedForEach(placeholderCollector.elementNodes, | 239 sortedForEach(placeholderCollector.elementNodes, |
| 194 (Element element, Set<Node> nodes) { | 240 (Element element, Set<Node> nodes) { |
| 195 renameNodes(nodes, (_) => renameElement(element)); | 241 renameNodes(nodes, (_) => renameElement(element)); |
| 196 }); | 242 }); |
| 197 | 243 |
| 198 // Rename locals. | 244 // Rename locals. |
| 199 sortedForEach(placeholderCollector.functionScopes, | 245 sortedForEach(placeholderCollector.functionScopes, |
| 200 (functionElement, functionScope) { | 246 (functionElement, functionScope) { |
| 201 Set<LocalPlaceholder> placeholders = functionScope.localPlaceholders; | 247 Set<LocalPlaceholder> placeholders = functionScope.localPlaceholders; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 223 // Do not rename members to top-levels, that allows to avoid renaming | 269 // Do not rename members to top-levels, that allows to avoid renaming |
| 224 // members to constructors. | 270 // members to constructors. |
| 225 usedMemberIdentifiers.addAll(usedTopLevelOrMemberIdentifiers); | 271 usedMemberIdentifiers.addAll(usedTopLevelOrMemberIdentifiers); |
| 226 placeholderCollector.memberPlaceholders.forEach((identifier, nodes) { | 272 placeholderCollector.memberPlaceholders.forEach((identifier, nodes) { |
| 227 String newIdentifier = conservativeGenerator( | 273 String newIdentifier = conservativeGenerator( |
| 228 identifier, usedMemberIdentifiers.contains); | 274 identifier, usedMemberIdentifiers.contains); |
| 229 renameNodes(nodes, (_) => newIdentifier); | 275 renameNodes(nodes, (_) => newIdentifier); |
| 230 }); | 276 }); |
| 231 } | 277 } |
| 232 | 278 |
| 279 // Rename constructors. |
| 280 placeholderCollector.constructorPlaceholders.forEach( |
| 281 (Element constructor, List<ConstructorPlaceholder> placeholders) { |
| 282 for (ConstructorPlaceholder ph in placeholders) { |
| 283 renames[ph.node] = |
| 284 renameConstructor(constructor, ph.type, rename, renameElement); |
| 285 } |
| 286 }); |
| 233 sortedForEach(placeholderCollector.privateNodes, (library, nodes) { | 287 sortedForEach(placeholderCollector.privateNodes, (library, nodes) { |
| 234 renameNodes(nodes, (node) => rename(library, node.source.slowToString())); | 288 renameNodes(nodes, (node) => rename(library, node.source.slowToString())); |
| 235 }); | 289 }); |
| 236 renameNodes(placeholderCollector.unresolvedNodes, | 290 renameNodes(placeholderCollector.unresolvedNodes, |
| 237 (_) => generateUniqueName('Unresolved')); | 291 (_) => generateUniqueName('Unresolved')); |
| 238 renameNodes(placeholderCollector.nullNodes, (_) => ''); | 292 renameNodes(placeholderCollector.nullNodes, (_) => ''); |
| 239 if (cutDeclarationTypes) { | 293 if (cutDeclarationTypes) { |
| 240 for (DeclarationTypePlaceholder placeholder in | 294 for (DeclarationTypePlaceholder placeholder in |
| 241 placeholderCollector.declarationTypePlaceholders) { | 295 placeholderCollector.declarationTypePlaceholders) { |
| 242 renames[placeholder.typeNode] = placeholder.requiresVar ? 'var' : ''; | 296 renames[placeholder.typeNode] = placeholder.requiresVar ? 'var' : ''; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 index ~/= firstCharAlphabet.length; | 341 index ~/= firstCharAlphabet.length; |
| 288 int length = otherCharsAlphabet.length; | 342 int length = otherCharsAlphabet.length; |
| 289 while (index >= length) { | 343 while (index >= length) { |
| 290 resultBuilder.add(otherCharsAlphabet[index % length]); | 344 resultBuilder.add(otherCharsAlphabet[index % length]); |
| 291 index ~/= length; | 345 index ~/= length; |
| 292 } | 346 } |
| 293 resultBuilder.add(otherCharsAlphabet[index]); | 347 resultBuilder.add(otherCharsAlphabet[index]); |
| 294 return resultBuilder.toString(); | 348 return resultBuilder.toString(); |
| 295 } | 349 } |
| 296 } | 350 } |
| OLD | NEW |