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 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) { |
|
ahe
2013/08/16 18:39:26
Missing space after if.
zarah
2013/08/28 10:19:29
Done.
| |
| 185 for (var functionScope in placeholderCollector.functionScopes.values) { | 186 for (var functionScope in placeholderCollector.functionScopes.values) { |
| 186 // Add current sorted local identifiers to the whole sorted list | 187 functionScope.localPlaceholders.forEach( |
| 187 // of all local identifiers for all functions. | 188 (ph) => allLocals.add(new Set<Node>()..addAll(ph.nodes))); |
|
ahe
2013/08/16 18:39:26
ph.nodes.toSet()?
zarah
2013/08/28 10:19:29
Done.
| |
| 188 List<LocalPlaceholder> currentSortedPlaceholders = | |
| 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 } | 189 } |
| 197 for (int i = 0; i < currentSortedNodes.length; i++) { | 190 } else { |
| 198 allSortedLocals[i].addAll(currentSortedNodes[i]); | 191 // Build a sorted (by usage) list of local nodes that will be renamed to |
| 192 // the same identifier. So the top-used local variables in all functions | |
| 193 // will be renamed first and will all share the same new identifier. | |
| 194 for (var functionScope in placeholderCollector.functionScopes.values) { | |
| 195 // Add current sorted local identifiers to the whole sorted list | |
| 196 // of all local identifiers for all functions. | |
| 197 List<LocalPlaceholder> currentSortedPlaceholders = | |
| 198 sorted(functionScope.localPlaceholders, | |
| 199 compareBy((LocalPlaceholder ph) => -ph.nodes.length)); | |
| 200 List<Set<Node>> currentSortedNodes = | |
| 201 currentSortedPlaceholders.map((ph) => ph.nodes).toList(); | |
| 202 // Make room in all sorted locals list for new stuff. | |
| 203 while (currentSortedNodes.length > allLocals.length) { | |
| 204 allLocals.add(new Set<Node>()); | |
| 205 } | |
| 206 for (int i = 0; i < currentSortedNodes.length; i++) { | |
| 207 allLocals[i].addAll(currentSortedNodes[i]); | |
| 208 } | |
| 199 } | 209 } |
| 200 } | 210 } |
| 201 | 211 |
| 202 // Rename elements, members and locals together based on their usage count, | 212 // Rename elements, members and locals together based on their usage count, |
| 203 // otherwise when we rename elements first there will be no good identifiers | 213 // otherwise when we rename elements first there will be no good identifiers |
| 204 // left for members even if they are used often. | 214 // left for members even if they are used often. |
| 205 String elementRenamer(ElementRenamable elementRenamable) => | 215 String elementRenamer(ElementRenamable elementRenamable) => |
| 206 renameElement(elementRenamable.element); | 216 renameElement(elementRenamable.element); |
| 207 String memberRenamer(MemberRenamable memberRenamable) => | 217 String memberRenamer(MemberRenamable memberRenamable) => |
| 208 generator.generate(forbiddenIdentifiers.contains); | 218 generator.generate(forbiddenIdentifiers.contains); |
| 209 Function localRenamer = generateUniqueName; | 219 Function localRenamer = generateUniqueName; |
| 210 List<Renamable> renamables = []; | 220 List<Renamable> renamables = []; |
| 211 placeholderCollector.elementNodes.forEach( | 221 placeholderCollector.elementNodes.forEach( |
| 212 (Element element, Set<Node> nodes) { | 222 (Element element, Set<Node> nodes) { |
| 213 renamables.add(new ElementRenamable(element, nodes, elementRenamer)); | 223 renamables.add(new ElementRenamable(element, nodes, elementRenamer)); |
| 214 }); | 224 }); |
| 215 placeholderCollector.memberPlaceholders.forEach( | 225 placeholderCollector.memberPlaceholders.forEach( |
| 216 (String memberName, Set<Identifier> identifiers) { | 226 (String memberName, Set<Identifier> identifiers) { |
| 217 renamables.add( | 227 renamables.add( |
| 218 new MemberRenamable(memberName, identifiers, memberRenamer)); | 228 new MemberRenamable(memberName, identifiers, memberRenamer)); |
| 219 }); | 229 }); |
| 220 for (Set<Node> localIdentifiers in allSortedLocals) { | 230 for (Set<Node> localIdentifiers in allLocals) { |
| 221 renamables.add(new LocalRenamable(localIdentifiers, localRenamer)); | 231 renamables.add(new LocalRenamable(localIdentifiers, localRenamer)); |
| 222 } | 232 } |
| 223 renamables.sort((Renamable renamable1, Renamable renamable2) => | 233 renamables.sort((Renamable renamable1, Renamable renamable2) => |
| 224 renamable1.compareTo(renamable2)); | 234 renamable1.compareTo(renamable2)); |
| 225 for (Renamable renamable in renamables) { | 235 for (Renamable renamable in renamables) { |
| 226 String newName = renamable.rename(); | 236 String newName = renamable.rename(); |
| 227 renameNodes(renamable.nodes, (_) => newName); | 237 renameNodes(renamable.nodes, (_) => newName); |
| 228 } | 238 } |
| 229 } else { | 239 } else { |
| 230 // Never rename anything to 'main'. | 240 // Never rename anything to 'main'. |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 347 index ~/= firstCharAlphabet.length; | 357 index ~/= firstCharAlphabet.length; |
| 348 int length = otherCharsAlphabet.length; | 358 int length = otherCharsAlphabet.length; |
| 349 while (index >= length) { | 359 while (index >= length) { |
| 350 resultBuilder.write(otherCharsAlphabet[index % length]); | 360 resultBuilder.write(otherCharsAlphabet[index % length]); |
| 351 index ~/= length; | 361 index ~/= length; |
| 352 } | 362 } |
| 353 resultBuilder.write(otherCharsAlphabet[index]); | 363 resultBuilder.write(otherCharsAlphabet[index]); |
| 354 return resultBuilder.toString(); | 364 return resultBuilder.toString(); |
| 355 } | 365 } |
| 356 } | 366 } |
| OLD | NEW |