Chromium Code Reviews| Index: lib/compiler/implementation/universe.dart |
| diff --git a/lib/compiler/implementation/universe.dart b/lib/compiler/implementation/universe.dart |
| index 1bd48c86fe23a71b5ea5c83e8902a4005a0211da..fcffaf82b034be1f4e9c70c39956e35e6d4cdf25 100644 |
| --- a/lib/compiler/implementation/universe.dart |
| +++ b/lib/compiler/implementation/universe.dart |
| @@ -75,6 +75,7 @@ class SelectorKind { |
| static final SelectorKind GETTER = const SelectorKind('getter'); |
| static final SelectorKind SETTER = const SelectorKind('setter'); |
| + // TODO(kasperl): Rename INVOCATION to CALL and introduce CALL_ANY. |
| static final SelectorKind INVOCATION = const SelectorKind('invocation'); |
| static final SelectorKind OPERATOR = const SelectorKind('operator'); |
| static final SelectorKind INDEX = const SelectorKind('index'); |
| @@ -83,59 +84,88 @@ class SelectorKind { |
| } |
| class Selector implements Hashable { |
| + final SelectorKind kind; |
| + final SourceString name; // Name is null for call-any selectors. |
|
ahe
2012/08/15 07:37:59
Wouldn't it better using a documentation comment?
|
| + final LibraryElement library; // Library is null for non-private selectors. |
| + |
| // The numbers of arguments of the selector. Includes named arguments. |
| final int argumentCount; |
| - final SelectorKind kind; |
| final List<SourceString> namedArguments; |
| final List<SourceString> orderedNamedArguments; |
| - // The const constructor. |
| - const Selector.constant(this.kind, this.argumentCount) |
| - : this.namedArguments = const <SourceString>[], |
| - this.orderedNamedArguments = const <SourceString>[]; |
| - |
| Selector( |
| this.kind, |
| + SourceString name, |
| + LibraryElement library, |
| this.argumentCount, |
| [List<SourceString> namedArguments = const <SourceString>[]]) |
| - : this.namedArguments = namedArguments, |
| + : this.name = name, |
| + this.library = (name != null && name.isPrivate()) ? library : null, |
| + this.namedArguments = namedArguments, |
| this.orderedNamedArguments = namedArguments.isEmpty() |
| ? namedArguments |
| - : <SourceString>[]; |
| + : <SourceString>[] { |
| + // TODO(kasperl): Only allow null name for call-any selectors. |
| + assert(name == null || !name.isPrivate() || library != null); |
| + } |
| - Selector.invocation( |
| - int argumentCount, |
| - [List<SourceString> namedArguments = const <SourceString>[]]) |
| - : this(SelectorKind.INVOCATION, argumentCount, namedArguments); |
| + Selector.getter(SourceString name, LibraryElement library) |
| + : this(SelectorKind.GETTER, name, library, 0); |
| + |
| + Selector.setter(SourceString name, LibraryElement library) |
| + : this(SelectorKind.SETTER, name, library, 1); |
| + |
| + Selector.unaryOperator(SourceString name) |
| + : this(SelectorKind.OPERATOR, operatorName(name, true), null, 0); |
| + |
| + Selector.binaryOperator(SourceString name) |
| + : this(SelectorKind.OPERATOR, operatorName(name, false), null, 1); |
| + |
| + Selector.index() |
| + : this(SelectorKind.INDEX, indexName(), null, 1); |
| + |
| + Selector.indexSet() |
| + : this(SelectorKind.INDEX, indexSetName(), null, 2); |
| + |
| + Selector.call(SourceString name, |
| + LibraryElement library, |
| + int arity, |
| + [List<SourceString> named = const []]) |
| + : this(SelectorKind.INVOCATION, name, library, arity, named); |
| + |
| + Selector.callAny(int arity, [List<SourceString> named = const []]) |
| + : this(SelectorKind.INVOCATION, null, null, arity, named); |
| + |
| + // TODO(kasperl): This belongs somewhere else. |
| + Selector.noSuchMethod() |
| + : this(SelectorKind.INVOCATION, Compiler.NO_SUCH_METHOD, null, 2); |
| + |
| + bool isGetter() => kind === SelectorKind.GETTER; |
| + bool isSetter() => kind === SelectorKind.SETTER; |
| + bool isCall() => kind === SelectorKind.INVOCATION; |
| + |
| + bool isIndex() => kind === SelectorKind.INDEX && argumentCount == 1; |
| + bool isIndexSet() => kind === SelectorKind.INDEX && argumentCount == 2; |
| + |
| + bool isOperator() => kind === SelectorKind.OPERATOR; |
| + bool isUnaryOperator() => isOperator() && argumentCount == 0; |
| + bool isBinaryOperator() => isOperator() && argumentCount == 1; |
| + |
| + static SourceString operatorName(SourceString name, bool isUnary) |
| + => Elements.constructOperatorName( |
| + const SourceString('operator'), name, isUnary); |
| + |
| + static SourceString indexName() |
| + => operatorName(const SourceString('[]'), false); |
| + |
| + static SourceString indexSetName() |
| + => operatorName(const SourceString('[]='), false); |
| int hashCode() => argumentCount + 1000 * namedArguments.length; |
| int get namedArgumentCount() => namedArguments.length; |
| int get positionalArgumentCount() => argumentCount - namedArgumentCount; |
| Type get receiverType() => null; |
| - static final Selector GETTER = |
| - const Selector.constant(SelectorKind.GETTER, 0); |
| - static final Selector SETTER = |
| - const Selector.constant(SelectorKind.SETTER, 1); |
| - static final Selector UNARY_OPERATOR = |
| - const Selector.constant(SelectorKind.OPERATOR, 0); |
| - static final Selector BINARY_OPERATOR = |
| - const Selector.constant(SelectorKind.OPERATOR, 1); |
| - static final Selector INDEX = |
| - const Selector.constant(SelectorKind.INDEX, 1); |
| - static final Selector INDEX_SET = |
| - const Selector.constant(SelectorKind.INDEX, 2); |
| - static final Selector INDEX_AND_INDEX_SET = |
| - const Selector.constant(SelectorKind.INDEX, 2); |
| - static final Selector GETTER_AND_SETTER = |
| - const Selector.constant(SelectorKind.SETTER, 1); |
| - static final Selector INVOCATION_0 = |
| - const Selector.constant(SelectorKind.INVOCATION, 0); |
| - static final Selector INVOCATION_1 = |
| - const Selector.constant(SelectorKind.INVOCATION, 1); |
| - static final Selector INVOCATION_2 = |
| - const Selector.constant(SelectorKind.INVOCATION, 2); |
| - |
| bool applies(Element element, Compiler compiler) { |
| if (element.isSetter()) return kind === SelectorKind.SETTER; |
| if (element.isGetter()) { |
| @@ -268,9 +298,11 @@ class Selector implements Hashable { |
| bool operator ==(other) { |
| if (other is !Selector) return false; |
| - if (receiverType !== other.receiverType) return false; |
| - return argumentCount == other.argumentCount |
| + return name == other.name |
| + && library === other.library |
| + && argumentCount == other.argumentCount |
| && namedArguments.length == other.namedArguments.length |
| + && receiverType === other.receiverType |
| && sameNames(namedArguments, other.namedArguments); |
| } |
| @@ -285,7 +317,7 @@ class Selector implements Hashable { |
| return orderedNamedArguments; |
| } |
| - toString() => 'Selector($kind, $argumentCount)'; |
| + toString() => 'Selector($kind, $name, $argumentCount)'; |
| } |
| class TypedSelector extends Selector { |
| @@ -297,6 +329,8 @@ class TypedSelector extends Selector { |
| TypedSelector(this.receiverType, Selector selector) |
| : super(selector.kind, |
| + selector.name, |
| + selector.library, |
| selector.argumentCount, |
| selector.namedArguments); |