Chromium Code Reviews| Index: lib/compiler/implementation/dart_backend/renamer.dart |
| diff --git a/lib/compiler/implementation/dart_backend/renamer.dart b/lib/compiler/implementation/dart_backend/renamer.dart |
| index 47bdbee52bb044974c9c3df49c5bbab42e0a1d7c..dfcecd2aa2ad1861885635bcdde436350742b198 100644 |
| --- a/lib/compiler/implementation/dart_backend/renamer.dart |
| +++ b/lib/compiler/implementation/dart_backend/renamer.dart |
| @@ -10,6 +10,7 @@ class ConflictingRenamer extends Renamer { |
| final Compiler compiler; |
| final Map<Element, String> renamed; |
| final Set<String> usedTopLevelIdentifiers; |
| + final Map<LibraryElement, String> imports; |
| TreeElements contextElements; |
| Element context; |
| @@ -18,7 +19,8 @@ class ConflictingRenamer extends Renamer { |
| ConflictingRenamer(this.compiler) : |
| renamed = new Map<Element, String>(), |
| - usedTopLevelIdentifiers = new Set<String>(); |
| + usedTopLevelIdentifiers = new Set<String>(), |
| + imports = new Map<LibraryElement, String>(); |
| void setContext(Element element) { |
| this.context = element; |
| @@ -82,9 +84,21 @@ class ConflictingRenamer extends Renamer { |
| } |
| String renameElement(Element element) { |
| + generateUniqueName(name) { |
| + while (usedTopLevelIdentifiers.contains(name)) { |
| + name = "x$name"; |
|
Roman
2012/07/30 14:43:30
Why 'x'? 'x' is an ordinary letter, it will be har
Anton Muhin
2012/07/30 14:54:31
Agree, but apparently due to the bug in DartVM, '_
Roman
2012/07/30 15:03:42
That's sad. Maybe '$' ? or anything else?
Anton Muhin
2012/07/30 15:37:16
Done.
|
| + } |
| + usedTopLevelIdentifiers.add(name); |
| + return name; |
| + } |
| + |
| String originalName = element.name.slowToString(); |
| - if (element.getLibrary() == compiler.coreLibrary || !element.isTopLevel()) { |
| - return originalName; |
| + // TODO(antonm): we should rename lib private names as well. |
| + if (!element.isTopLevel()) return originalName; |
| + final library = element.getLibrary(); |
| + if (isDartCoreLib(compiler, library)) { |
| + final prefix = imports.putIfAbsent(library, () => generateUniqueName('p')); |
|
Roman
2012/07/30 14:43:30
Why 'p' as a prefix? Easier to read would be somet
Anton Muhin
2012/07/30 14:54:31
I am not sure it's a valid Dart identifier. Plus
Roman
2012/07/30 15:03:42
We can fix it if for some reason this will not be
|
| + return '$prefix.$originalName'; |
| } |
| if (renamed[element] !== null) { |
|
Roman
2012/07/30 14:43:30
Should this check be moved to before generating re
Anton Muhin
2012/07/30 14:54:31
Done.
|
| return renamed[element]; |
| @@ -93,12 +107,6 @@ class ConflictingRenamer extends Renamer { |
| // Not renamed and top element. |
| // TODO(smok): Make sure that the new name does not conflict with existing |
| // local identifiers. |
| - String name = originalName; |
| - while (usedTopLevelIdentifiers.contains(name)) { |
| - name = "_$name"; |
| - } |
| - usedTopLevelIdentifiers.add(name); |
| - renamed[element] = name; |
| - return name; |
| + return renamed[element] = generateUniqueName(originalName); |
| } |
| } |