Chromium Code Reviews| Index: dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart |
| diff --git a/dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart |
| index 8e9d50615742e89fb4871c53f5868c93c9e61418..a526f409913b320c66d91abdf5a17716a0b5de3f 100644 |
| --- a/dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart |
| +++ b/dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart |
| @@ -184,17 +184,31 @@ class Selector { |
| } |
| factory Selector.fromElement(Element element, Compiler compiler) { |
| + // TODO(ahe): This method doesn't work as one might expect if there are |
| + // optional arguments. |
|
Johnni Winther
2013/12/05 11:49:56
How?
ahe
2013/12/06 15:57:54
I think I fixed that below :-)
|
| String name = element.name; |
| if (element.isFunction()) { |
| - int arity = element.asFunctionElement().requiredParameterCount(compiler); |
| if (name == '[]') { |
| return new Selector.index(); |
| } else if (name == '[]=') { |
| return new Selector.indexSet(); |
| - } else if (Elements.operatorNameToIdentifier(name) != name) { |
| - return new Selector(SelectorKind.OPERATOR, name, null, arity); |
| + } |
| + FunctionSignature signature = |
| + element.asFunctionElement().computeSignature(compiler); |
| + int arity = signature.parameterCount; |
| + List<String> namedArguments = null; |
| + if (signature.optionalParametersAreNamed) { |
| + namedArguments = |
| + signature.orderedOptionalParameters.map((e) => e.name).toList(); |
| + } |
| + if (Elements.operatorNameToIdentifier(name) != name) { |
| + // Operators cannot have named arguments, however, that doesn't prevent |
| + // a user from declaring such an operator. |
| + return new Selector( |
| + SelectorKind.OPERATOR, name, null, arity, namedArguments); |
| } else { |
| - return new Selector.call(name, element.getLibrary(), arity); |
| + return new Selector.call( |
| + name, element.getLibrary(), arity, namedArguments); |
| } |
| } else if (element.isSetter()) { |
| return new Selector.setter(name, element.getLibrary()); |
| @@ -202,6 +216,9 @@ class Selector { |
| return new Selector.getter(name, element.getLibrary()); |
| } else if (element.isField()) { |
| return new Selector.getter(name, element.getLibrary()); |
| + } else { |
| + throw new SpannableAssertionFailure( |
| + element, "Can't get selector from $element"); |
| } |
| } |
| @@ -590,6 +607,8 @@ class Selector { |
| Selector extendIfReachesAll(Compiler compiler) { |
| return new TypedSelector(compiler.typesTask.dynamicType, this); |
| } |
| + |
| + Selector toCallSelector() => new Selector.callClosureFrom(this); |
| } |
| class TypedSelector extends Selector { |