mirror of
https://github.com/NixOS/nix.git
synced 2025-11-09 20:16:03 +01:00
Pass all args when auto-calling a function with an ellipsis
The command line options --arg and --argstr that are used by a bunch of
CLI commands to pass arguments to top-level functions in files go
through the same code-path as auto-calling top-level functions with
their default arguments - this, however, was only passing the arguments
that were *explicitly* mentioned in the formals of the function - in the
case of an as-pattern with an ellipsis (eg args @ { ... }) extra passed
arguments would get omitted. This fixes that to instead pass *all*
specified auto args in the case that our function has an ellipsis.
Fixes #598
This commit is contained in:
parent
eb75282b8d
commit
626200713b
1 changed files with 17 additions and 6 deletions
|
|
@ -1299,13 +1299,24 @@ void EvalState::autoCallFunction(Bindings & args, Value & fun, Value & res)
|
||||||
Value * actualArgs = allocValue();
|
Value * actualArgs = allocValue();
|
||||||
mkAttrs(*actualArgs, fun.lambda.fun->formals->formals.size());
|
mkAttrs(*actualArgs, fun.lambda.fun->formals->formals.size());
|
||||||
|
|
||||||
|
if (fun.lambda.fun->formals->ellipsis) {
|
||||||
|
// If the formals have an ellipsis (eg the function accepts extra args) pass
|
||||||
|
// all available automatic arguments (which includes arguments specified on
|
||||||
|
// the command line via --arg/--argstr)
|
||||||
|
for (auto& v : args) {
|
||||||
|
actualArgs->attrs->push_back(v);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Otherwise, only pass the arguments that the function accepts
|
||||||
for (auto & i : fun.lambda.fun->formals->formals) {
|
for (auto & i : fun.lambda.fun->formals->formals) {
|
||||||
Bindings::iterator j = args.find(i.name);
|
Bindings::iterator j = args.find(i.name);
|
||||||
if (j != args.end())
|
if (j != args.end()) {
|
||||||
actualArgs->attrs->push_back(*j);
|
actualArgs->attrs->push_back(*j);
|
||||||
else if (!i.def)
|
} else if (!i.def) {
|
||||||
throwTypeError("cannot auto-call a function that has an argument without a default value ('%1%')", i.name);
|
throwTypeError("cannot auto-call a function that has an argument without a default value ('%1%')", i.name);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
actualArgs->attrs->sort();
|
actualArgs->attrs->sort();
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue