Chromium Code Reviews| Index: dart/frog/leg/namer.dart |
| diff --git a/dart/frog/leg/namer.dart b/dart/frog/leg/namer.dart |
| index d9302c10bbc3d6b5212ca0ac8acdf2d74d6230c1..8f25da44d2c9a32d68803f89ad2f7825dcdeeb33 100644 |
| --- a/dart/frog/leg/namer.dart |
| +++ b/dart/frog/leg/namer.dart |
| @@ -34,15 +34,25 @@ class Namer { |
| String closureInvocationName(Selector selector) { |
| // TODO(floitsch): mangle, while not conflicting with instance names. |
| - return instanceMethodInvocationName(CLOSURE_INVOCATION_NAME, selector); |
| + return instanceMethodInvocationName(null, CLOSURE_INVOCATION_NAME, |
| + selector); |
| } |
| - String instanceMethodName(SourceString name, int arity) { |
| + String privateName(LibraryElement lib, SourceString name) { |
| + if (name.isPrivate()) { |
| + return '_${getName(lib)}${name.slowToString()}'; |
|
floitsch
2012/03/18 18:29:30
Unless I'm wrong this means that a user can "fake"
ahe
2012/03/18 19:17:05
I think I covered that by prefixing with _
|
| + } else { |
| + return '${name.slowToString()}'; |
| + } |
| + } |
| + |
| + String instanceMethodName(LibraryElement lib, SourceString name, int arity) { |
| // TODO(floitsch): mangle, while preserving uniqueness. |
|
floitsch
2012/03/18 18:29:30
I think you can remove the TODO here.
ahe
2012/03/18 21:12:04
Done.
|
| - return '${name.slowToString()}\$$arity'; |
| + return '${privateName(lib, name)}\$$arity'; |
| } |
| - String instanceMethodInvocationName(SourceString name, Selector selector) { |
| + String instanceMethodInvocationName(LibraryElement lib, SourceString name, |
| + Selector selector) { |
| // TODO(floitsch): mangle, while preserving uniqueness. |
| StringBuffer buffer = new StringBuffer(); |
| List<SourceString> names = selector.getOrderedNamedArguments(); |
| @@ -50,19 +60,19 @@ class Namer { |
| buffer.add(@'$'); |
| argumentName.printOn(buffer); |
| } |
| - return '${name.slowToString()}\$${selector.argumentCount}$buffer'; |
| + return '${privateName(lib, name)}\$${selector.argumentCount}$buffer'; |
| } |
| - String instanceFieldName(SourceString name) { |
| - return name.slowToString(); |
| + String instanceFieldName(LibraryElement lib, SourceString name) { |
| + return privateName(lib, name); |
| } |
| - String setterName(SourceString name) { |
| - return 'set\$${name.slowToString()}'; |
| + String setterName(LibraryElement lib, SourceString name) { |
| + return 'set\$${privateName(lib, name)}'; |
| } |
| - String getterName(SourceString name) { |
| - return 'get\$${name.slowToString()}'; |
| + String getterName(LibraryElement lib, SourceString name) { |
| + return 'get\$${privateName(lib, name)}'; |
| } |
| String getFreshGlobalName(String proposedName) { |
| @@ -89,23 +99,28 @@ class Namer { |
| */ |
| String _computeGuess(Element element) { |
| assert(!element.isInstanceMember()); |
| + LibraryElement lib = element.getLibrary(); |
| if (element.kind == ElementKind.GENERATIVE_CONSTRUCTOR) { |
| FunctionElement functionElement = element; |
| - return instanceMethodName( |
| - element.name, functionElement.parameterCount(compiler)); |
| + return instanceMethodName(lib, element.name, |
| + functionElement.parameterCount(compiler)); |
| } else { |
| // TODO(floitsch): deal with named constructors. |
| String name; |
| - if (element.kind == ElementKind.GETTER) { |
| - name = getterName(element.name); |
| + if (Elements.isStaticOrTopLevel(element)) { |
| + name = element.name.slowToString(); |
| + } else if (element.kind == ElementKind.GETTER) { |
| + name = getterName(lib, element.name); |
| } else if (element.kind == ElementKind.SETTER) { |
| - name = setterName(element.name); |
| + name = setterName(lib, element.name); |
| } else if (element.kind == ElementKind.FUNCTION) { |
| FunctionElement functionElement = element; |
| name = element.name.slowToString(); |
| name = '$name\$${functionElement.parameterCount(compiler)}'; |
| + } else if (element.kind === ElementKind.LIBRARY) { |
| + name = 'lib'; |
| } else { |
| - name = '${element.name.slowToString()}'; |
| + name = element.name.slowToString(); |
| } |
| // Prefix the name with '$' if it is reserved. |
| if (jsReserved.contains(name)) { |
| @@ -133,17 +148,19 @@ class Namer { |
| if (element.kind == ElementKind.GENERATIVE_CONSTRUCTOR_BODY) { |
| ConstructorBodyElement bodyElement = element; |
| SourceString name = bodyElement.constructor.name; |
| - return instanceMethodName(name, bodyElement.parameterCount(compiler)); |
| + return instanceMethodName(element.getLibrary(), |
| + name, bodyElement.parameterCount(compiler)); |
| } else if (element.kind == ElementKind.FUNCTION) { |
| FunctionElement functionElement = element; |
| - return instanceMethodName( |
| - element.name, functionElement.parameterCount(compiler)); |
| + return instanceMethodName(element.getLibrary(), |
| + element.name, |
| + functionElement.parameterCount(compiler)); |
| } else if (element.kind == ElementKind.GETTER) { |
| - return getterName(element.name); |
| + return getterName(element.getLibrary(), element.name); |
| } else if (element.kind == ElementKind.SETTER) { |
| - return setterName(element.name); |
| + return setterName(element.getLibrary(), element.name); |
| } else { |
| - return instanceFieldName(element.name); |
| + return instanceFieldName(element.getLibrary(), element.name); |
| } |
| } else { |
| // Dealing with a top-level or static element. |
| @@ -164,6 +181,7 @@ class Namer { |
| case ElementKind.GETTER: |
| case ElementKind.SETTER: |
| case ElementKind.TYPEDEF: |
| + case ElementKind.LIBRARY: |
| String result = getFreshGlobalName(guess); |
| globals[element] = result; |
| return result; |