| 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
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3d0e1f311bb63b9159d041b350b9eaacee0d31c8
|
| --- /dev/null
|
| +++ b/pkg/compiler/lib/src/js_backend/namer_names.dart
|
| @@ -0,0 +1,181 @@
|
| +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +part of js_backend;
|
| +
|
| +abstract class _NamerName extends jsAst.Name {
|
| + int get _kind;
|
| +
|
| + toString() => throw new UnsupportedError("Cannot convert a name to a string");
|
| +}
|
| +
|
| +enum _NamerNameKinds {
|
| + StringBacked,
|
| + Getter,
|
| + Setter,
|
| + Async,
|
| + Compound,
|
| + Token
|
| +}
|
| +
|
| +class StringBackedName extends _NamerName {
|
| + final String name;
|
| + int get _kind => _NamerNameKinds.StringBacked.index;
|
| +
|
| + StringBackedName(this.name);
|
| +
|
| + String get key => name;
|
| +
|
| + operator==(other) {
|
| + if (identical(this, other)) return true;
|
| + return (other is StringBackedName) && other.name == name;
|
| + }
|
| +
|
| + int get hashCode => name.hashCode;
|
| +
|
| + int compareTo(_NamerName other) {
|
| + if (other._kind != _kind) return other._kind - _kind;
|
| + return name.compareTo(other.name);
|
| + }
|
| +}
|
| +
|
| +abstract class _PrefixedName extends _NamerName implements jsAst.AstContainer {
|
| + final jsAst.Name prefix;
|
| + final jsAst.Name base;
|
| + int get _kind;
|
| +
|
| + Iterable<jsAst.Node> get containedNodes => [prefix, base];
|
| +
|
| + _PrefixedName(this.prefix, this.base);
|
| +
|
| + String get name => prefix.name + base.name;
|
| +
|
| + String get key => prefix.key + base.key;
|
| +
|
| + bool operator==(other) {
|
| + if (identical(this, other)) return true;
|
| + if (other is! _PrefixedName) return false;
|
| + return other.base == base && other.prefix == prefix;
|
| + }
|
| +
|
| + int get hashCode => base.hashCode * 13 + prefix.hashCode;
|
| +
|
| + int compareTo(_NamerName other) {
|
| + if (other._kind != _kind) return other._kind - _kind;
|
| + _PrefixedName otherSameKind = other;
|
| + int result = prefix.compareTo(otherSameKind.prefix);
|
| + if (result == 0) {
|
| + result = prefix.compareTo(otherSameKind.prefix);
|
| + if (result == 0) {
|
| + result = base.compareTo(otherSameKind.base);
|
| + }
|
| + }
|
| + return result;
|
| + }
|
| +}
|
| +
|
| +class GetterName extends _PrefixedName {
|
| + int get _kind => _NamerNameKinds.Getter.index;
|
| +
|
| + GetterName(jsAst.Name prefix, jsAst.Name base) : super(prefix, base);
|
| +}
|
| +
|
| +class SetterName extends _PrefixedName {
|
| + int get _kind => _NamerNameKinds.Setter.index;
|
| +
|
| + SetterName(jsAst.Name prefix, jsAst.Name base) : super(prefix, base);
|
| +}
|
| +
|
| +class _AsyncName extends _PrefixedName {
|
| + int get _kind => _NamerNameKinds.Async.index;
|
| +
|
| + _AsyncName(jsAst.Name prefix, jsAst.Name base) : super(prefix, base);
|
| +
|
| + @override
|
| + bool get allowRename => true;
|
| +}
|
| +
|
| +class CompoundName extends _NamerName implements jsAst.AstContainer {
|
| + final List<_NamerName> _parts;
|
| + int get _kind => _NamerNameKinds.Compound.index;
|
| + String _cachedName;
|
| + int _cachedHashCode = -1;
|
| +
|
| + Iterable<jsAst.Node> get containedNodes => _parts;
|
| +
|
| + CompoundName(this._parts);
|
| +
|
| + String get name {
|
| + if (_cachedName == null) {
|
| + _cachedName = _parts.map((jsAst.Name name) => name.name).join();
|
| + }
|
| + return _cachedName;
|
| + }
|
| +
|
| + String get key => _parts.map((_NamerName name) => name.key).join();
|
| +
|
| + bool operator==(other) {
|
| + if (identical(this, other)) return true;
|
| + if (other is! CompoundName) return false;
|
| + if (other._parts.length != _parts.length) return false;
|
| + for (int i = 0; i < _parts.length; ++i) {
|
| + if (other._parts[i] != _parts[i]) return false;
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + int get hashCode {
|
| + if (_cachedHashCode < 0) {
|
| + _cachedHashCode = 0;
|
| + for (jsAst.Name name in _parts) {
|
| + _cachedHashCode = (_cachedHashCode * 17 + name.hashCode) & 0x7fffffff;
|
| + }
|
| + }
|
| + return _cachedHashCode;
|
| + }
|
| +
|
| + int compareTo(_NamerName other) {
|
| + if (other._kind != _kind) return other._kind - _kind;
|
| + CompoundName otherSameKind = other;
|
| + if (otherSameKind._parts.length != _parts.length) {
|
| + return otherSameKind._parts.length - _parts.length;
|
| + }
|
| + int result = 0;
|
| + for (int pos = 0; result == 0 && pos < _parts.length; pos++) {
|
| + result = _parts[pos].compareTo(otherSameKind._parts[pos]);
|
| + }
|
| + return result;
|
| + }
|
| +}
|
| +
|
| +class TokenName extends _NamerName implements jsAst.ReferenceCountedAstNode {
|
| + int get _kind => _NamerNameKinds.Token.index;
|
| + String _name;
|
| + final String key;
|
| + final TokenScope _scope;
|
| + int _rc = 0;
|
| +
|
| + TokenName(this._scope, this.key);
|
| +
|
| + bool get isFinalized => _name != null;
|
| +
|
| + String get name {
|
| + assert(isFinalized);
|
| + return _name;
|
| + }
|
| +
|
| + @override
|
| + int compareTo(_NamerName other) {
|
| + if (other._kind != _kind) return other._kind - _kind;
|
| + TokenName otherToken = other;
|
| + return key.compareTo(otherToken.key);
|
| + }
|
| +
|
| + markSeen(jsAst.TokenCounter counter) => _rc++;
|
| +
|
| + finalize() {
|
| + assert(!isFinalized);
|
| + _name = _scope.getNextName();
|
| + }
|
| +}
|
|
|