Index: lib/compiler/implementation/universe/universe.dart |
=================================================================== |
--- lib/compiler/implementation/universe/universe.dart (revision 12238) |
+++ lib/compiler/implementation/universe/universe.dart (working copy) |
@@ -215,6 +215,43 @@ |
int optionalParameterCount = parameters.optionalParameterCount; |
if (positionalArgumentCount < requiredParameterCount) return false; |
+ if (!parameters.optionalParametersAreNamed) { |
+ if (!Compiler.REJECT_NAMED_ARGUMENT_AS_POSITIONAL) { |
+ return optionalParametersAppliesDEPRECATED(element, compiler); |
+ } else { |
+ // We have already checked that the number of arguments are |
+ // not greater than the number of parameters. Therefore the |
+ // number of positional arguments are not greater than the |
+ // number of parameters. |
+ assert(positionalArgumentCount <= parameters.parameterCount); |
+ return namedArguments.isEmpty(); |
+ } |
+ } else { |
+ if (positionalArgumentCount > requiredParameterCount) return false; |
ahe
2012/09/13 14:29:10
assert(positionalArgumentCount == requiredParamete
ngeoffray
2012/09/17 12:21:01
Done.
|
+ if (namedArgumentCount > optionalParameterCount) return false; |
+ Set<SourceString> nameSet = new Set<SourceString>(); |
+ parameters.optionalParameters.forEach((Element element) { |
+ nameSet.add(element.name); |
+ }); |
+ for (SourceString name in namedArguments) { |
+ if (!nameSet.contains(name)) return false; |
+ // TODO(ngeoffray): By removing from the set we are checking |
ahe
2012/09/13 14:29:10
Perhaps Jamie would like to look at that. File a b
ngeoffray
2012/09/17 12:21:01
Done: http://code.google.com/p/dart/issues/detail?
|
+ // that we are not passing the name twice. We should have this |
+ // check in the resolver instead. |
+ nameSet.remove(name); |
+ } |
+ return true; |
+ } |
+ } |
+ |
+ // TODO(5074): Remove this method once we don't accept the |
+ // deprecated parameter specification. |
+ bool optionalParametersAppliesDEPRECATED(FunctionElement function, |
+ Compiler compiler) { |
+ FunctionSignature parameters = function.computeSignature(compiler); |
+ int requiredParameterCount = parameters.requiredParameterCount; |
+ int optionalParameterCount = parameters.optionalParameterCount; |
+ |
bool hasOptionalParameters = !parameters.optionalParameters.isEmpty(); |
if (namedArguments.isEmpty()) { |
if (!hasOptionalParameters) { |
@@ -246,34 +283,20 @@ |
} |
} |
- /** |
- * Returns [:true:] if the selector and the [element] match; [:false:] |
- * otherwise. |
- */ |
- bool addArgumentsToList(Link<Node> arguments, |
- List list, |
- FunctionElement element, |
- compileArgument(Node argument), |
- compileConstant(Element element), |
- Compiler compiler) { |
- if (!this.applies(element, compiler)) return false; |
- |
- void addMatchingArgumentsToList(Link<Node> link) {} |
- |
- FunctionSignature parameters = element.computeSignature(compiler); |
- if (this.positionalArgumentCount == parameters.parameterCount) { |
- for (Link<Node> link = arguments; !link.isEmpty(); link = link.tail) { |
- list.add(compileArgument(link.head)); |
- } |
- return true; |
- } |
- |
+ // TODO(5074): Remove this method once we don't accept the |
+ // deprecated parameter specification. |
+ bool addOptionalArgumentsToListDEPRECATED(Link<Node> arguments, |
+ List list, |
+ FunctionElement element, |
+ compileArgument(Node argument), |
+ compileConstant(Element element), |
+ Compiler compiler) { |
// If there are named arguments, provide them in the order |
// expected by the called function, which is the source order. |
+ FunctionSignature parameters = element.computeSignature(compiler); |
// Visit positional arguments and add them to the list. |
- int positionalArgumentCount = this.positionalArgumentCount; |
- for (int i = 0; |
+ for (int i = parameters.requiredParameterCount; |
i < positionalArgumentCount; |
arguments = arguments.tail, i++) { |
list.add(compileArgument(arguments.head)); |
@@ -302,20 +325,68 @@ |
!remainingNamedParameters.isEmpty(); |
remainingNamedParameters = remainingNamedParameters.tail) { |
Element parameter = remainingNamedParameters.head; |
- int foundIndex = -1; |
- for (int i = 0; i < namedArguments.length; i++) { |
- SourceString name = namedArguments[i]; |
- if (name == parameter.name) { |
- foundIndex = i; |
- break; |
- } |
- } |
+ int foundIndex = namedArguments.indexOf(parameter.name); |
if (foundIndex != -1) { |
list.add(compiledNamedArguments[foundIndex]); |
} else { |
list.add(compileConstant(parameter)); |
} |
} |
+ } |
+ |
+ |
+ /** |
+ * Returns [:true:] if the selector and the [element] match; [:false:] |
+ * otherwise. |
+ */ |
+ bool addArgumentsToList(Link<Node> arguments, |
+ List list, |
+ FunctionElement element, |
+ compileArgument(Node argument), |
+ compileConstant(Element element), |
+ Compiler compiler) { |
+ if (!this.applies(element, compiler)) return false; |
+ |
+ FunctionSignature parameters = element.computeSignature(compiler); |
+ parameters.forEachRequiredParameter((element) { |
+ list.add(compileArgument(arguments.head)); |
+ arguments = arguments.tail; |
+ }); |
+ |
+ if (!parameters.optionalParametersAreNamed) { |
+ if (!Compiler.REJECT_NAMED_ARGUMENT_AS_POSITIONAL) { |
ahe
2012/09/13 14:29:10
TODO?
ngeoffray
2012/09/17 12:21:01
Done.
|
+ addOptionalArgumentsToListDEPRECATED( |
+ arguments, list, element, compileArgument, compileConstant, |
+ compiler); |
+ } else { |
+ parameters.forEachOptionalParameter((element) { |
+ if (!arguments.isEmpty()) { |
+ list.add(compileArgument(arguments.head)); |
+ arguments = arguments.tail; |
+ } else { |
+ list.add(compileConstant(element)); |
+ } |
+ }); |
+ } |
+ } else { |
+ // Visit named arguments and add them into a temporary list. |
+ List compiledNamedArguments = []; |
+ for (; !arguments.isEmpty(); arguments = arguments.tail) { |
+ NamedArgument namedArgument = arguments.head; |
+ compiledNamedArguments.add(compileArgument(namedArgument.expression)); |
+ } |
+ // Iterate over the optional parameters of the signature, and try to |
+ // find them in [compiledNamedArguments]. If found, we use the |
+ // value in the temporary list, otherwise the default value. |
+ parameters.forEachOptionalParameter((element) { |
+ int foundIndex = namedArguments.indexOf(element.name); |
+ if (foundIndex != -1) { |
+ list.add(compiledNamedArguments[foundIndex]); |
+ } else { |
+ list.add(compileConstant(element)); |
+ } |
+ }); |
+ } |
return true; |
} |