| 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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 | 60 |
| 61 /** | 61 /** |
| 62 * Renames only top-level elements that would let to ambiguity if not renamed. | 62 * Renames only top-level elements that would let to ambiguity if not renamed. |
| 63 */ | 63 */ |
| 64 void renamePlaceholders( | 64 void renamePlaceholders( |
| 65 Compiler compiler, | 65 Compiler compiler, |
| 66 PlaceholderCollector placeholderCollector, | 66 PlaceholderCollector placeholderCollector, |
| 67 Map<Node, String> renames, | 67 Map<Node, String> renames, |
| 68 Map<LibraryElement, String> imports, | 68 Map<LibraryElement, String> imports, |
| 69 Set<String> fixedMemberNames, | 69 Set<String> fixedMemberNames, |
| 70 bool cutDeclarationTypes) { | 70 bool cutDeclarationTypes, |
| 71 {uniqueGlobalNaming: false}) { |
| 71 final Map<LibraryElement, Map<String, String>> renamed | 72 final Map<LibraryElement, Map<String, String>> renamed |
| 72 = new Map<LibraryElement, Map<String, String>>(); | 73 = new Map<LibraryElement, Map<String, String>>(); |
| 73 | 74 |
| 74 renameNodes(Iterable<Node> nodes, renamer) { | 75 renameNodes(Iterable<Node> nodes, renamer) { |
| 75 for (Node node in sorted(nodes, _compareNodes)) { | 76 for (Node node in sorted(nodes, _compareNodes)) { |
| 76 renames[node] = renamer(node); | 77 renames[node] = renamer(node); |
| 77 } | 78 } |
| 78 } | 79 } |
| 79 | 80 |
| 80 sortedForEach(Map<Element, dynamic> map, f) { | 81 sortedForEach(Map<Element, dynamic> map, f) { |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 Set<String> forbiddenIdentifiers = new Set<String>.from(['main']); | 172 Set<String> forbiddenIdentifiers = new Set<String>.from(['main']); |
| 172 forbiddenIdentifiers.addAll(Keyword.keywords.keys); | 173 forbiddenIdentifiers.addAll(Keyword.keywords.keys); |
| 173 forbiddenIdentifiers.addAll(fixedMemberNames); | 174 forbiddenIdentifiers.addAll(fixedMemberNames); |
| 174 generateUniqueName = (_) => | 175 generateUniqueName = (_) => |
| 175 generator.generate((name) => | 176 generator.generate((name) => |
| 176 forbiddenIdentifiers.contains(name) | 177 forbiddenIdentifiers.contains(name) |
| 177 || allNamedParameterIdentifiers.contains(name)); | 178 || allNamedParameterIdentifiers.contains(name)); |
| 178 rename = makeRenamer(generateUniqueName); | 179 rename = makeRenamer(generateUniqueName); |
| 179 renameElement = makeElementRenamer(rename, generateUniqueName); | 180 renameElement = makeElementRenamer(rename, generateUniqueName); |
| 180 | 181 |
| 181 // Build a sorted (by usage) list of local nodes that will be renamed to | 182 List<Set<Node>> allLocals = new List<Set<Node>>(); |
| 182 // the same identifier. So the top-used local variables in all functions | 183 // If we are using the mirror_helper library we need all names to be |
| 183 // will be renamed first and will all share the same new identifier. | 184 // globally unique. |
| 184 List<Set<Node>> allSortedLocals = new List<Set<Node>>(); | 185 if (uniqueGlobalNaming) { |
| 185 for (var functionScope in placeholderCollector.functionScopes.values) { | 186 //TODO(zarah): Change this so that local variables don't get unique names. |
| 186 // Add current sorted local identifiers to the whole sorted list | 187 for (var functionScope in placeholderCollector.functionScopes.values) { |
| 187 // of all local identifiers for all functions. | 188 functionScope.localPlaceholders.forEach( |
| 188 List<LocalPlaceholder> currentSortedPlaceholders = | 189 (ph) => allLocals.add(ph.nodes.toSet())); |
| 189 sorted(functionScope.localPlaceholders, | |
| 190 compareBy((LocalPlaceholder ph) => -ph.nodes.length)); | |
| 191 List<Set<Node>> currentSortedNodes = | |
| 192 currentSortedPlaceholders.map((ph) => ph.nodes).toList(); | |
| 193 // Make room in all sorted locals list for new stuff. | |
| 194 while (currentSortedNodes.length > allSortedLocals.length) { | |
| 195 allSortedLocals.add(new Set<Node>()); | |
| 196 } | 190 } |
| 197 for (int i = 0; i < currentSortedNodes.length; i++) { | 191 } else { |
| 198 allSortedLocals[i].addAll(currentSortedNodes[i]); | 192 // Build a sorted (by usage) list of local nodes that will be renamed to |
| 193 // the same identifier. So the top-used local variables in all functions |
| 194 // will be renamed first and will all share the same new identifier. |
| 195 for (var functionScope in placeholderCollector.functionScopes.values) { |
| 196 // Add current sorted local identifiers to the whole sorted list |
| 197 // of all local identifiers for all functions. |
| 198 List<LocalPlaceholder> currentSortedPlaceholders = |
| 199 sorted(functionScope.localPlaceholders, |
| 200 compareBy((LocalPlaceholder ph) => -ph.nodes.length)); |
| 201 List<Set<Node>> currentSortedNodes = |
| 202 currentSortedPlaceholders.map((ph) => ph.nodes).toList(); |
| 203 // Make room in all sorted locals list for new stuff. |
| 204 while (currentSortedNodes.length > allLocals.length) { |
| 205 allLocals.add(new Set<Node>()); |
| 206 } |
| 207 for (int i = 0; i < currentSortedNodes.length; i++) { |
| 208 allLocals[i].addAll(currentSortedNodes[i]); |
| 209 } |
| 199 } | 210 } |
| 200 } | 211 } |
| 201 | 212 |
| 202 // Rename elements, members and locals together based on their usage count, | 213 // Rename elements, members and locals together based on their usage count, |
| 203 // otherwise when we rename elements first there will be no good identifiers | 214 // otherwise when we rename elements first there will be no good identifiers |
| 204 // left for members even if they are used often. | 215 // left for members even if they are used often. |
| 205 String elementRenamer(ElementRenamable elementRenamable) => | 216 String elementRenamer(ElementRenamable elementRenamable) => |
| 206 renameElement(elementRenamable.element); | 217 renameElement(elementRenamable.element); |
| 207 String memberRenamer(MemberRenamable memberRenamable) => | 218 String memberRenamer(MemberRenamable memberRenamable) => |
| 208 generator.generate(forbiddenIdentifiers.contains); | 219 generator.generate(forbiddenIdentifiers.contains); |
| 209 Function localRenamer = generateUniqueName; | 220 Function localRenamer = generateUniqueName; |
| 210 List<Renamable> renamables = []; | 221 List<Renamable> renamables = []; |
| 211 placeholderCollector.elementNodes.forEach( | 222 placeholderCollector.elementNodes.forEach( |
| 212 (Element element, Set<Node> nodes) { | 223 (Element element, Set<Node> nodes) { |
| 213 renamables.add(new ElementRenamable(element, nodes, elementRenamer)); | 224 renamables.add(new ElementRenamable(element, nodes, elementRenamer)); |
| 214 }); | 225 }); |
| 215 placeholderCollector.memberPlaceholders.forEach( | 226 placeholderCollector.memberPlaceholders.forEach( |
| 216 (String memberName, Set<Identifier> identifiers) { | 227 (String memberName, Set<Identifier> identifiers) { |
| 217 renamables.add( | 228 renamables.add( |
| 218 new MemberRenamable(memberName, identifiers, memberRenamer)); | 229 new MemberRenamable(memberName, identifiers, memberRenamer)); |
| 219 }); | 230 }); |
| 220 for (Set<Node> localIdentifiers in allSortedLocals) { | 231 for (Set<Node> localIdentifiers in allLocals) { |
| 221 renamables.add(new LocalRenamable(localIdentifiers, localRenamer)); | 232 renamables.add(new LocalRenamable(localIdentifiers, localRenamer)); |
| 222 } | 233 } |
| 223 renamables.sort((Renamable renamable1, Renamable renamable2) => | 234 renamables.sort((Renamable renamable1, Renamable renamable2) => |
| 224 renamable1.compareTo(renamable2)); | 235 renamable1.compareTo(renamable2)); |
| 225 for (Renamable renamable in renamables) { | 236 for (Renamable renamable in renamables) { |
| 226 String newName = renamable.rename(); | 237 String newName = renamable.rename(); |
| 227 renameNodes(renamable.nodes, (_) => newName); | 238 renameNodes(renamable.nodes, (_) => newName); |
| 228 } | 239 } |
| 229 } else { | 240 } else { |
| 230 // Never rename anything to 'main'. | 241 // Never rename anything to 'main'. |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 index ~/= firstCharAlphabet.length; | 358 index ~/= firstCharAlphabet.length; |
| 348 int length = otherCharsAlphabet.length; | 359 int length = otherCharsAlphabet.length; |
| 349 while (index >= length) { | 360 while (index >= length) { |
| 350 resultBuilder.write(otherCharsAlphabet[index % length]); | 361 resultBuilder.write(otherCharsAlphabet[index % length]); |
| 351 index ~/= length; | 362 index ~/= length; |
| 352 } | 363 } |
| 353 resultBuilder.write(otherCharsAlphabet[index]); | 364 resultBuilder.write(otherCharsAlphabet[index]); |
| 354 return resultBuilder.toString(); | 365 return resultBuilder.toString(); |
| 355 } | 366 } |
| 356 } | 367 } |
| OLD | NEW |