Index: pkg/compiler/lib/src/js_backend/namer_names.dart |
diff --git a/pkg/compiler/lib/src/js_backend/namer_names.dart b/pkg/compiler/lib/src/js_backend/namer_names.dart |
index 3d0e1f311bb63b9159d041b350b9eaacee0d31c8..5d6eae3b59b22397624a5f598eee5357de9d6654 100644 |
--- a/pkg/compiler/lib/src/js_backend/namer_names.dart |
+++ b/pkg/compiler/lib/src/js_backend/namer_names.dart |
@@ -6,6 +6,7 @@ part of js_backend; |
abstract class _NamerName extends jsAst.Name { |
int get _kind; |
+ _NamerName get _target => this; |
toString() => throw new UnsupportedError("Cannot convert a name to a string"); |
} |
@@ -28,6 +29,7 @@ class StringBackedName extends _NamerName { |
String get key => name; |
operator==(other) { |
+ if (other is _NameReference) other = other._target; |
if (identical(this, other)) return true; |
return (other is StringBackedName) && other.name == name; |
} |
@@ -35,6 +37,7 @@ class StringBackedName extends _NamerName { |
int get hashCode => name.hashCode; |
int compareTo(_NamerName other) { |
+ other = other._target; |
if (other._kind != _kind) return other._kind - _kind; |
return name.compareTo(other.name); |
} |
@@ -54,6 +57,7 @@ abstract class _PrefixedName extends _NamerName implements jsAst.AstContainer { |
String get key => prefix.key + base.key; |
bool operator==(other) { |
+ if (other is _NameReference) other = other._target; |
if (identical(this, other)) return true; |
if (other is! _PrefixedName) return false; |
return other.base == base && other.prefix == prefix; |
@@ -62,6 +66,7 @@ abstract class _PrefixedName extends _NamerName implements jsAst.AstContainer { |
int get hashCode => base.hashCode * 13 + prefix.hashCode; |
int compareTo(_NamerName other) { |
+ other = other._target; |
if (other._kind != _kind) return other._kind - _kind; |
_PrefixedName otherSameKind = other; |
int result = prefix.compareTo(otherSameKind.prefix); |
@@ -116,6 +121,7 @@ class CompoundName extends _NamerName implements jsAst.AstContainer { |
String get key => _parts.map((_NamerName name) => name.key).join(); |
bool operator==(other) { |
+ if (other is _NameReference) other = other._target; |
if (identical(this, other)) return true; |
if (other is! CompoundName) return false; |
if (other._parts.length != _parts.length) return false; |
@@ -136,6 +142,7 @@ class CompoundName extends _NamerName implements jsAst.AstContainer { |
} |
int compareTo(_NamerName other) { |
+ other = other._target; |
if (other._kind != _kind) return other._kind - _kind; |
CompoundName otherSameKind = other; |
if (otherSameKind._parts.length != _parts.length) { |
@@ -167,6 +174,7 @@ class TokenName extends _NamerName implements jsAst.ReferenceCountedAstNode { |
@override |
int compareTo(_NamerName other) { |
+ other = other._target; |
if (other._kind != _kind) return other._kind - _kind; |
TokenName otherToken = other; |
return key.compareTo(otherToken.key); |
@@ -174,8 +182,40 @@ class TokenName extends _NamerName implements jsAst.ReferenceCountedAstNode { |
markSeen(jsAst.TokenCounter counter) => _rc++; |
+ @override |
+ bool operator==(other) { |
+ if (other is _NameReference) other = other._target; |
+ if (identical(this, other)) return true; |
+ return false; |
+ } |
+ |
+ @override |
+ int get hashCode => super.hashCode; |
+ |
finalize() { |
assert(!isFinalized); |
_name = _scope.getNextName(); |
} |
+} |
+ |
+class _NameReference extends _NamerName implements jsAst.AstContainer { |
+ _NamerName _target; |
+ |
+ int get _kind => _target._kind; |
+ String get key => _target.key; |
+ |
+ Iterable<jsAst.Node> get containedNodes => [_target]; |
+ |
+ _NameReference(this._target); |
+ |
+ String get name => _target.name; |
+ |
+ @override |
+ int compareTo(_NamerName other) => _target.compareTo(other); |
+ |
+ @override |
+ bool operator==(other) => _target == other; |
+ |
+ @override |
+ int get hashCode => _target.hashCode; |
} |