| Index: pkg/compiler/lib/src/js_backend/namer.dart
 | 
| diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
 | 
| index 5bb88de8ea935cdcd98a1f62080bc94c0619ee01..783b5181750e069b5d438ec094efa4e723d0f4df 100644
 | 
| --- a/pkg/compiler/lib/src/js_backend/namer.dart
 | 
| +++ b/pkg/compiler/lib/src/js_backend/namer.dart
 | 
| @@ -636,6 +636,32 @@ class Namer {
 | 
|      return invocationName(new Selector.fromElement(method));
 | 
|    }
 | 
|  
 | 
| +  String _jsNameHelper(Element e) {
 | 
| +    if (e.jsInteropName != null && e.jsInteropName.isNotEmpty)
 | 
| +      return e.jsInteropName;
 | 
| +    return e.isLibrary ? 'self' : e.name;
 | 
| +  }
 | 
| +
 | 
| +  /// Returns a JavaScript path specifying the context in which
 | 
| +  /// [element.fixedBackendName] should be evaluated. Only applicable for
 | 
| +  /// elements using typed JavaScript interop.
 | 
| +  /// For example: fixedBackendPath for the static method createMap in the
 | 
| +  /// Map class of the goog.map JavaScript library would have path
 | 
| +  /// "goog.maps.Map".
 | 
| +  String fixedBackendPath(Element element) {
 | 
| +    if (!element.isJsInterop) return null;
 | 
| +    if (element.isInstanceMember) return 'this';
 | 
| +    if (element.isConstructor) return fixedBackendPath(element.enclosingClass);
 | 
| +    if (element.isLibrary) return 'self';
 | 
| +    var sb = new StringBuffer();
 | 
| +    sb..write(_jsNameHelper(element.library));
 | 
| +
 | 
| +    if (element.enclosingClass != null && element.enclosingClass != element) {
 | 
| +      sb..write('.')..write(_jsNameHelper(element.enclosingClass));
 | 
| +    }
 | 
| +    return sb.toString();
 | 
| +  }
 | 
| +
 | 
|    /// Returns the annotated name for a variant of `call`.
 | 
|    /// The result has the form:
 | 
|    ///
 | 
| @@ -766,11 +792,6 @@ class Namer {
 | 
|      ClassElement enclosingClass = element.enclosingClass;
 | 
|  
 | 
|      if (element.hasFixedBackendName) {
 | 
| -      // Certain native fields must be given a specific name. Native names must
 | 
| -      // not contain '$'. We rely on this to avoid clashes.
 | 
| -      assert(enclosingClass.isNative &&
 | 
| -             !element.fixedBackendName.contains(r'$'));
 | 
| -
 | 
|        return new StringBackedName(element.fixedBackendName);
 | 
|      }
 | 
|  
 | 
| 
 |