| 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 bf35ab3a9ecb8047ad7ca508c34279a7f9b21c43..c1406ce4357705833cd4d11c6f81d6d2ad39b23e 100644
|
| --- a/lib/compiler/implementation/dart_backend/renamer.dart
|
| +++ b/lib/compiler/implementation/dart_backend/renamer.dart
|
| @@ -83,12 +83,59 @@ void renamePlaceholders(
|
| }
|
| }
|
|
|
| + String renameType(DartType type, Function renameElement) {
|
| + // TODO(smok): Do not rename type if it is in platform library or
|
| + // js-helpers.
|
| + StringBuffer result = new StringBuffer(renameElement(type.element));
|
| + if (type is InterfaceType && !type.arguments.isEmpty) {
|
| + result.add('<');
|
| + Link<DartType> argumentsLink = type.arguments;
|
| + result.add(renameType(argumentsLink.head, renameElement));
|
| + for (Link<DartType> link = argumentsLink.tail; !link.isEmpty;
|
| + link = link.tail) {
|
| + result.add(',');
|
| + result.add(renameType(link.head, renameElement));
|
| + }
|
| + result.add('>');
|
| + }
|
| + return result.toString();
|
| + }
|
| +
|
| + String renameConstructor(Element element, DartType type,
|
| + Function renameString, Function renameElement) {
|
| + assert(element.isConstructor());
|
| + StringBuffer result = new StringBuffer();
|
| + String name = element.name.slowToString();
|
| + if (element.name != element.getEnclosingClass().name) {
|
| + // Named constructor or factory. Is there a more reliable way to check
|
| + // this case?
|
| + result.add(renameType(type, renameElement));
|
| + result.add('.');
|
| + String prefix = '${element.getEnclosingClass().name.slowToString()}\$';
|
| + if (!name.startsWith(prefix)) {
|
| + // Factory for another interface (that is going away soon).
|
| + compiler.internalErrorOnElement(element,
|
| + "Factory constructors for external interfaces are not supported.");
|
| + }
|
| + assert(name.startsWith(prefix));
|
| + name = name.substring(prefix.length);
|
| + // result.add(renameString(element.getLibrary(), name));
|
| + result.add(name);
|
| + } else {
|
| + result.add(renameType(type, renameElement));
|
| + }
|
| + return result.toString();
|
| + }
|
| +
|
| Function makeElementRenamer(rename, generateUniqueName) => (element) {
|
| assert(Elements.isStaticOrTopLevel(element)
|
| || element is TypeVariableElement);
|
| // TODO(smok): We may want to reuse class static field and method names.
|
| String originalName = element.name.slowToString();
|
| LibraryElement library = element.getLibrary();
|
| + if (identical(element.getLibrary(), compiler.coreLibrary)) {
|
| + return originalName;
|
| + }
|
| if (library.isPlatformLibrary) {
|
| assert(element.isTopLevel());
|
| final prefix =
|
| @@ -108,6 +155,7 @@ void renamePlaceholders(
|
| // Renamer function that takes library and original name and returns a new
|
| // name for given identifier.
|
| Function rename;
|
| + Function renameElement;
|
| // A function that takes original identifier name and generates a new unique
|
| // identifier.
|
| Function generateUniqueName;
|
| @@ -119,7 +167,7 @@ void renamePlaceholders(
|
| generateUniqueName = (_) =>
|
| generator.generate(forbiddenIdentifiers.contains);
|
| rename = makeRenamer(generateUniqueName);
|
| - Function renameElement = makeElementRenamer(rename, generateUniqueName);
|
| + renameElement = makeElementRenamer(rename, generateUniqueName);
|
|
|
| Set<String> allParameterIdentifiers = new Set<String>();
|
| for (var functionScope in placeholderCollector.functionScopes.values) {
|
| @@ -188,7 +236,7 @@ void renamePlaceholders(
|
| return newName;
|
| };
|
| rename = makeRenamer(generateUniqueName);
|
| - Function renameElement = makeElementRenamer(rename, generateUniqueName);
|
| + renameElement = makeElementRenamer(rename, generateUniqueName);
|
| // Rename elements.
|
| sortedForEach(placeholderCollector.elementNodes,
|
| (Element element, Set<Node> nodes) {
|
| @@ -230,6 +278,14 @@ void renamePlaceholders(
|
| });
|
| }
|
|
|
| + // Rename constructors.
|
| + placeholderCollector.constructorPlaceholders.forEach(
|
| + (Element constructor, List<ConstructorPlaceholder> placeholders) {
|
| + for (ConstructorPlaceholder ph in placeholders) {
|
| + renames[ph.node] =
|
| + renameConstructor(constructor, ph.type, rename, renameElement);
|
| + }
|
| + });
|
| sortedForEach(placeholderCollector.privateNodes, (library, nodes) {
|
| renameNodes(nodes, (node) => rename(library, node.source.slowToString()));
|
| });
|
|
|