Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

Side by Side Diff: lib/compiler/implementation/dart_backend/renamer.dart

Issue 11267046: [dart2dart] fix after https://codereview.chromium.org/11227007 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698