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