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

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 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
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
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
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
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 }
OLDNEW
« no previous file with comments | « lib/compiler/implementation/dart_backend/placeholder_collector.dart ('k') | lib/compiler/implementation/tree/unparser.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698