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 { |