| 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 73bbb9f579f424c1906d6619ae487cc0120c2af4..68a2a3ea2e0964aa704d137d66185e24b31c7911 100644
|
| --- a/dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart
|
| +++ b/dart/sdk/lib/_internal/compiler/implementation/universe/universe.dart
|
| @@ -192,17 +192,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.
|
| 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());
|
| @@ -210,6 +224,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");
|
| }
|
| }
|
|
|
| @@ -599,6 +616,8 @@ class Selector {
|
| Selector extendIfReachesAll(Compiler compiler) {
|
| return new TypedSelector(compiler.typesTask.dynamicType, this);
|
| }
|
| +
|
| + Selector toCallSelector() => new Selector.callClosureFrom(this);
|
| }
|
|
|
| class TypedSelector extends Selector {
|
|
|