OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of js_backend; | 5 part of js_backend; |
6 | 6 |
7 abstract class _NamerName extends jsAst.Name { | 7 abstract class _NamerName extends jsAst.Name { |
8 int get _kind; | 8 int get _kind; |
| 9 _NamerName get _target => this; |
9 | 10 |
10 toString() => throw new UnsupportedError("Cannot convert a name to a string"); | 11 toString() => throw new UnsupportedError("Cannot convert a name to a string"); |
11 } | 12 } |
12 | 13 |
13 enum _NamerNameKinds { | 14 enum _NamerNameKinds { |
14 StringBacked, | 15 StringBacked, |
15 Getter, | 16 Getter, |
16 Setter, | 17 Setter, |
17 Async, | 18 Async, |
18 Compound, | 19 Compound, |
19 Token | 20 Token |
20 } | 21 } |
21 | 22 |
22 class StringBackedName extends _NamerName { | 23 class StringBackedName extends _NamerName { |
23 final String name; | 24 final String name; |
24 int get _kind => _NamerNameKinds.StringBacked.index; | 25 int get _kind => _NamerNameKinds.StringBacked.index; |
25 | 26 |
26 StringBackedName(this.name); | 27 StringBackedName(this.name); |
27 | 28 |
28 String get key => name; | 29 String get key => name; |
29 | 30 |
30 operator==(other) { | 31 operator==(other) { |
| 32 if (other is _NameReference) other = other._target; |
31 if (identical(this, other)) return true; | 33 if (identical(this, other)) return true; |
32 return (other is StringBackedName) && other.name == name; | 34 return (other is StringBackedName) && other.name == name; |
33 } | 35 } |
34 | 36 |
35 int get hashCode => name.hashCode; | 37 int get hashCode => name.hashCode; |
36 | 38 |
37 int compareTo(_NamerName other) { | 39 int compareTo(_NamerName other) { |
| 40 other = other._target; |
38 if (other._kind != _kind) return other._kind - _kind; | 41 if (other._kind != _kind) return other._kind - _kind; |
39 return name.compareTo(other.name); | 42 return name.compareTo(other.name); |
40 } | 43 } |
41 } | 44 } |
42 | 45 |
43 abstract class _PrefixedName extends _NamerName implements jsAst.AstContainer { | 46 abstract class _PrefixedName extends _NamerName implements jsAst.AstContainer { |
44 final jsAst.Name prefix; | 47 final jsAst.Name prefix; |
45 final jsAst.Name base; | 48 final jsAst.Name base; |
46 int get _kind; | 49 int get _kind; |
47 | 50 |
48 Iterable<jsAst.Node> get containedNodes => [prefix, base]; | 51 Iterable<jsAst.Node> get containedNodes => [prefix, base]; |
49 | 52 |
50 _PrefixedName(this.prefix, this.base); | 53 _PrefixedName(this.prefix, this.base); |
51 | 54 |
52 String get name => prefix.name + base.name; | 55 String get name => prefix.name + base.name; |
53 | 56 |
54 String get key => prefix.key + base.key; | 57 String get key => prefix.key + base.key; |
55 | 58 |
56 bool operator==(other) { | 59 bool operator==(other) { |
| 60 if (other is _NameReference) other = other._target; |
57 if (identical(this, other)) return true; | 61 if (identical(this, other)) return true; |
58 if (other is! _PrefixedName) return false; | 62 if (other is! _PrefixedName) return false; |
59 return other.base == base && other.prefix == prefix; | 63 return other.base == base && other.prefix == prefix; |
60 } | 64 } |
61 | 65 |
62 int get hashCode => base.hashCode * 13 + prefix.hashCode; | 66 int get hashCode => base.hashCode * 13 + prefix.hashCode; |
63 | 67 |
64 int compareTo(_NamerName other) { | 68 int compareTo(_NamerName other) { |
| 69 other = other._target; |
65 if (other._kind != _kind) return other._kind - _kind; | 70 if (other._kind != _kind) return other._kind - _kind; |
66 _PrefixedName otherSameKind = other; | 71 _PrefixedName otherSameKind = other; |
67 int result = prefix.compareTo(otherSameKind.prefix); | 72 int result = prefix.compareTo(otherSameKind.prefix); |
68 if (result == 0) { | 73 if (result == 0) { |
69 result = prefix.compareTo(otherSameKind.prefix); | 74 result = prefix.compareTo(otherSameKind.prefix); |
70 if (result == 0) { | 75 if (result == 0) { |
71 result = base.compareTo(otherSameKind.base); | 76 result = base.compareTo(otherSameKind.base); |
72 } | 77 } |
73 } | 78 } |
74 return result; | 79 return result; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 String get name { | 114 String get name { |
110 if (_cachedName == null) { | 115 if (_cachedName == null) { |
111 _cachedName = _parts.map((jsAst.Name name) => name.name).join(); | 116 _cachedName = _parts.map((jsAst.Name name) => name.name).join(); |
112 } | 117 } |
113 return _cachedName; | 118 return _cachedName; |
114 } | 119 } |
115 | 120 |
116 String get key => _parts.map((_NamerName name) => name.key).join(); | 121 String get key => _parts.map((_NamerName name) => name.key).join(); |
117 | 122 |
118 bool operator==(other) { | 123 bool operator==(other) { |
| 124 if (other is _NameReference) other = other._target; |
119 if (identical(this, other)) return true; | 125 if (identical(this, other)) return true; |
120 if (other is! CompoundName) return false; | 126 if (other is! CompoundName) return false; |
121 if (other._parts.length != _parts.length) return false; | 127 if (other._parts.length != _parts.length) return false; |
122 for (int i = 0; i < _parts.length; ++i) { | 128 for (int i = 0; i < _parts.length; ++i) { |
123 if (other._parts[i] != _parts[i]) return false; | 129 if (other._parts[i] != _parts[i]) return false; |
124 } | 130 } |
125 return true; | 131 return true; |
126 } | 132 } |
127 | 133 |
128 int get hashCode { | 134 int get hashCode { |
129 if (_cachedHashCode < 0) { | 135 if (_cachedHashCode < 0) { |
130 _cachedHashCode = 0; | 136 _cachedHashCode = 0; |
131 for (jsAst.Name name in _parts) { | 137 for (jsAst.Name name in _parts) { |
132 _cachedHashCode = (_cachedHashCode * 17 + name.hashCode) & 0x7fffffff; | 138 _cachedHashCode = (_cachedHashCode * 17 + name.hashCode) & 0x7fffffff; |
133 } | 139 } |
134 } | 140 } |
135 return _cachedHashCode; | 141 return _cachedHashCode; |
136 } | 142 } |
137 | 143 |
138 int compareTo(_NamerName other) { | 144 int compareTo(_NamerName other) { |
| 145 other = other._target; |
139 if (other._kind != _kind) return other._kind - _kind; | 146 if (other._kind != _kind) return other._kind - _kind; |
140 CompoundName otherSameKind = other; | 147 CompoundName otherSameKind = other; |
141 if (otherSameKind._parts.length != _parts.length) { | 148 if (otherSameKind._parts.length != _parts.length) { |
142 return otherSameKind._parts.length - _parts.length; | 149 return otherSameKind._parts.length - _parts.length; |
143 } | 150 } |
144 int result = 0; | 151 int result = 0; |
145 for (int pos = 0; result == 0 && pos < _parts.length; pos++) { | 152 for (int pos = 0; result == 0 && pos < _parts.length; pos++) { |
146 result = _parts[pos].compareTo(otherSameKind._parts[pos]); | 153 result = _parts[pos].compareTo(otherSameKind._parts[pos]); |
147 } | 154 } |
148 return result; | 155 return result; |
(...skipping 11 matching lines...) Expand all Loading... |
160 | 167 |
161 bool get isFinalized => _name != null; | 168 bool get isFinalized => _name != null; |
162 | 169 |
163 String get name { | 170 String get name { |
164 assert(isFinalized); | 171 assert(isFinalized); |
165 return _name; | 172 return _name; |
166 } | 173 } |
167 | 174 |
168 @override | 175 @override |
169 int compareTo(_NamerName other) { | 176 int compareTo(_NamerName other) { |
| 177 other = other._target; |
170 if (other._kind != _kind) return other._kind - _kind; | 178 if (other._kind != _kind) return other._kind - _kind; |
171 TokenName otherToken = other; | 179 TokenName otherToken = other; |
172 return key.compareTo(otherToken.key); | 180 return key.compareTo(otherToken.key); |
173 } | 181 } |
174 | 182 |
175 markSeen(jsAst.TokenCounter counter) => _rc++; | 183 markSeen(jsAst.TokenCounter counter) => _rc++; |
176 | 184 |
| 185 @override |
| 186 bool operator==(other) { |
| 187 if (other is _NameReference) other = other._target; |
| 188 if (identical(this, other)) return true; |
| 189 return false; |
| 190 } |
| 191 |
| 192 @override |
| 193 int get hashCode => super.hashCode; |
| 194 |
177 finalize() { | 195 finalize() { |
178 assert(!isFinalized); | 196 assert(!isFinalized); |
179 _name = _scope.getNextName(); | 197 _name = _scope.getNextName(); |
180 } | 198 } |
| 199 } |
| 200 |
| 201 class _NameReference extends _NamerName implements jsAst.AstContainer { |
| 202 _NamerName _target; |
| 203 |
| 204 int get _kind => _target._kind; |
| 205 String get key => _target.key; |
| 206 |
| 207 Iterable<jsAst.Node> get containedNodes => [_target]; |
| 208 |
| 209 _NameReference(this._target); |
| 210 |
| 211 String get name => _target.name; |
| 212 |
| 213 @override |
| 214 int compareTo(_NamerName other) => _target.compareTo(other); |
| 215 |
| 216 @override |
| 217 bool operator==(other) => _target == other; |
| 218 |
| 219 @override |
| 220 int get hashCode => _target.hashCode; |
181 } | 221 } |
OLD | NEW |