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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 160 .putIfAbsent(originalName, | 160 .putIfAbsent(originalName, |
| 161 () => generateUniqueName(originalName)); | 161 () => generateUniqueName(originalName)); |
| 162 | 162 |
| 163 // Renamer function that takes library and original name and returns a new | 163 // Renamer function that takes library and original name and returns a new |
| 164 // name for given identifier. | 164 // name for given identifier. |
| 165 Function rename; | 165 Function rename; |
| 166 Function renameElement; | 166 Function renameElement; |
| 167 // A function that takes original identifier name and generates a new unique | 167 // A function that takes original identifier name and generates a new unique |
| 168 // identifier. | 168 // identifier. |
| 169 Function generateUniqueName; | 169 Function generateUniqueName; |
| 170 | |
| 171 Set<String> allNamedParameterIdentifiers = new Set<String>(); | |
| 172 for (var functionScope in placeholderCollector.functionScopes.values) { | |
| 173 allNamedParameterIdentifiers.addAll(functionScope.parameterIdentifiers); | |
| 174 } | |
| 175 | |
| 170 if (compiler.enableMinification) { | 176 if (compiler.enableMinification) { |
| 171 MinifyingGenerator generator = new MinifyingGenerator(); | 177 MinifyingGenerator generator = new MinifyingGenerator(); |
| 172 Set<String> forbiddenIdentifiers = new Set<String>.from(['main']); | 178 Set<String> forbiddenIdentifiers = new Set<String>.from(['main']); |
| 173 forbiddenIdentifiers.addAll(Keyword.keywords.keys); | 179 forbiddenIdentifiers.addAll(Keyword.keywords.keys); |
| 174 forbiddenIdentifiers.addAll(fixedMemberNames); | 180 forbiddenIdentifiers.addAll(fixedMemberNames); |
| 175 generateUniqueName = (_) => | 181 generateUniqueName = (_) => |
| 176 generator.generate(forbiddenIdentifiers.contains); | 182 generator.generate((name) => |
| 183 forbiddenIdentifiers.contains(name) | |
| 184 || allNamedParameterIdentifiers.contains(name)); | |
| 177 rename = makeRenamer(generateUniqueName); | 185 rename = makeRenamer(generateUniqueName); |
| 178 renameElement = makeElementRenamer(rename, generateUniqueName); | 186 renameElement = makeElementRenamer(rename, generateUniqueName); |
| 179 | 187 |
| 180 Set<String> allParameterIdentifiers = new Set<String>(); | |
| 181 for (var functionScope in placeholderCollector.functionScopes.values) { | |
| 182 allParameterIdentifiers.addAll(functionScope.parameterIdentifiers); | |
| 183 } | |
| 184 // Build a sorted (by usage) list of local nodes that will be renamed to | 188 // Build a sorted (by usage) list of local nodes that will be renamed to |
| 185 // the same identifier. So the top-used local variables in all functions | 189 // the same identifier. So the top-used local variables in all functions |
| 186 // will be renamed first and will all share the same new identifier. | 190 // will be renamed first and will all share the same new identifier. |
| 187 List<Set<Node>> allSortedLocals = new List<Set<Node>>(); | 191 List<Set<Node>> allSortedLocals = new List<Set<Node>>(); |
| 188 for (var functionScope in placeholderCollector.functionScopes.values) { | 192 for (var functionScope in placeholderCollector.functionScopes.values) { |
| 189 // Add current sorted local identifiers to the whole sorted list | 193 // Add current sorted local identifiers to the whole sorted list |
| 190 // of all local identifiers for all functions. | 194 // of all local identifiers for all functions. |
| 191 List<LocalPlaceholder> currentSortedPlaceholders = | 195 List<LocalPlaceholder> currentSortedPlaceholders = |
| 192 sorted(functionScope.localPlaceholders, | 196 sorted(functionScope.localPlaceholders, |
| 193 compareBy((LocalPlaceholder ph) => -ph.nodes.length)); | 197 compareBy((LocalPlaceholder ph) => -ph.nodes.length)); |
| 194 List<Set<Node>> currentSortedNodes = | 198 List<Set<Node>> currentSortedNodes = |
| 195 currentSortedPlaceholders.map((ph) => ph.nodes).toList(); | 199 currentSortedPlaceholders.map((ph) => ph.nodes).toList(); |
| 196 // Make room in all sorted locals list for new stuff. | 200 // Make room in all sorted locals list for new stuff. |
| 197 while (currentSortedNodes.length > allSortedLocals.length) { | 201 while (currentSortedNodes.length > allSortedLocals.length) { |
| 198 allSortedLocals.add(new Set<Node>()); | 202 allSortedLocals.add(new Set<Node>()); |
| 199 } | 203 } |
| 200 for (int i = 0; i < currentSortedNodes.length; i++) { | 204 for (int i = 0; i < currentSortedNodes.length; i++) { |
| 201 allSortedLocals[i].addAll(currentSortedNodes[i]); | 205 allSortedLocals[i].addAll(currentSortedNodes[i]); |
| 202 } | 206 } |
| 203 } | 207 } |
| 204 | 208 |
| 205 // Rename elements, members and locals together based on their usage count, | 209 // Rename elements, members and locals together based on their usage count, |
| 206 // otherwise when we rename elements first there will be no good identifiers | 210 // otherwise when we rename elements first there will be no good identifiers |
| 207 // left for members even if they are used often. | 211 // left for members even if they are used often. |
| 208 String elementRenamer(ElementRenamable elementRenamable) => | 212 String elementRenamer(ElementRenamable elementRenamable) => |
| 209 renameElement(elementRenamable.element); | 213 renameElement(elementRenamable.element); |
| 210 String memberRenamer(MemberRenamable memberRenamable) => | 214 String memberRenamer(MemberRenamable memberRenamable) => |
| 211 generator.generate(forbiddenIdentifiers.contains); | 215 generator.generate(forbiddenIdentifiers.contains); |
| 212 String localRenamer(LocalRenamable localRenamable) => | 216 Function localRenamer = generateUniqueName; |
|
Anton Muhin
2013/05/31 08:50:23
maybe drop this local altogether?
kasperl
2013/05/31 08:51:57
I think I'll keep it for consistency with the othe
| |
| 213 generator.generate((name) => | |
| 214 allParameterIdentifiers.contains(name) | |
| 215 || forbiddenIdentifiers.contains(name)); | |
| 216 List<Renamable> renamables = []; | 217 List<Renamable> renamables = []; |
| 217 placeholderCollector.elementNodes.forEach( | 218 placeholderCollector.elementNodes.forEach( |
| 218 (Element element, Set<Node> nodes) { | 219 (Element element, Set<Node> nodes) { |
| 219 renamables.add(new ElementRenamable(element, nodes, elementRenamer)); | 220 renamables.add(new ElementRenamable(element, nodes, elementRenamer)); |
| 220 }); | 221 }); |
| 221 placeholderCollector.memberPlaceholders.forEach( | 222 placeholderCollector.memberPlaceholders.forEach( |
| 222 (String memberName, Set<Identifier> identifiers) { | 223 (String memberName, Set<Identifier> identifiers) { |
| 223 renamables.add( | 224 renamables.add( |
| 224 new MemberRenamable(memberName, identifiers, memberRenamer)); | 225 new MemberRenamable(memberName, identifiers, memberRenamer)); |
| 225 }); | 226 }); |
| 226 for (Set<Node> localIdentifiers in allSortedLocals) { | 227 for (Set<Node> localIdentifiers in allSortedLocals) { |
| 227 renamables.add(new LocalRenamable(localIdentifiers, localRenamer)); | 228 renamables.add(new LocalRenamable(localIdentifiers, localRenamer)); |
| 228 } | 229 } |
| 229 renamables.sort((Renamable renamable1, Renamable renamable2) => | 230 renamables.sort((Renamable renamable1, Renamable renamable2) => |
| 230 renamable1.compareTo(renamable2)); | 231 renamable1.compareTo(renamable2)); |
| 231 for (Renamable renamable in renamables) { | 232 for (Renamable renamable in renamables) { |
| 232 String newName = renamable.rename(); | 233 String newName = renamable.rename(); |
| 233 renameNodes(renamable.nodes, (_) => newName); | 234 renameNodes(renamable.nodes, (_) => newName); |
| 234 } | 235 } |
| 235 } else { | 236 } else { |
| 236 // Never rename anything to 'main'. | 237 // Never rename anything to 'main'. |
| 237 final usedTopLevelOrMemberIdentifiers = new Set<String>(); | 238 final usedTopLevelOrMemberIdentifiers = new Set<String>(); |
| 238 usedTopLevelOrMemberIdentifiers.add('main'); | 239 usedTopLevelOrMemberIdentifiers.add('main'); |
| 239 usedTopLevelOrMemberIdentifiers.addAll(fixedMemberNames); | 240 usedTopLevelOrMemberIdentifiers.addAll(fixedMemberNames); |
| 240 generateUniqueName = (originalName) { | 241 generateUniqueName = (originalName) { |
| 241 String newName = conservativeGenerator( | 242 String newName = conservativeGenerator( |
| 242 originalName, usedTopLevelOrMemberIdentifiers.contains); | 243 originalName, (name) => |
| 244 usedTopLevelOrMemberIdentifiers.contains(name) | |
|
Anton Muhin
2013/05/31 08:50:23
why this change, only stylistic or am i missing so
kasperl
2013/05/31 08:51:57
I'm adding the allNamedParameterIdentifiers check
| |
| 245 || allNamedParameterIdentifiers.contains(name)); | |
| 243 usedTopLevelOrMemberIdentifiers.add(newName); | 246 usedTopLevelOrMemberIdentifiers.add(newName); |
| 244 return newName; | 247 return newName; |
| 245 }; | 248 }; |
| 246 rename = makeRenamer(generateUniqueName); | 249 rename = makeRenamer(generateUniqueName); |
| 247 renameElement = makeElementRenamer(rename, generateUniqueName); | 250 renameElement = makeElementRenamer(rename, generateUniqueName); |
| 248 // Rename elements. | 251 // Rename elements. |
| 249 sortedForEach(placeholderCollector.elementNodes, | 252 sortedForEach(placeholderCollector.elementNodes, |
| 250 (Element element, Set<Node> nodes) { | 253 (Element element, Set<Node> nodes) { |
| 251 renameNodes(nodes, (_) => renameElement(element)); | 254 renameNodes(nodes, (_) => renameElement(element)); |
| 252 }); | 255 }); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 351 index ~/= firstCharAlphabet.length; | 354 index ~/= firstCharAlphabet.length; |
| 352 int length = otherCharsAlphabet.length; | 355 int length = otherCharsAlphabet.length; |
| 353 while (index >= length) { | 356 while (index >= length) { |
| 354 resultBuilder.write(otherCharsAlphabet[index % length]); | 357 resultBuilder.write(otherCharsAlphabet[index % length]); |
| 355 index ~/= length; | 358 index ~/= length; |
| 356 } | 359 } |
| 357 resultBuilder.write(otherCharsAlphabet[index]); | 360 resultBuilder.write(otherCharsAlphabet[index]); |
| 358 return resultBuilder.toString(); | 361 return resultBuilder.toString(); |
| 359 } | 362 } |
| 360 } | 363 } |
| OLD | NEW |