Skip to content

Commit

Permalink
Allow default values to use earlier recipe arguments (#2382)
Browse files Browse the repository at this point in the history
  • Loading branch information
casey authored Sep 21, 2024
1 parent 4e06ada commit d38e683
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 26 deletions.
13 changes: 7 additions & 6 deletions src/recipe_resolver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ impl<'src: 'run, 'run> RecipeResolver<'src, 'run> {
}

for recipe in resolver.resolved_recipes.values() {
for parameter in &recipe.parameters {
for (i, parameter) in recipe.parameters.iter().enumerate() {
if let Some(expression) = &parameter.default {
for variable in expression.variables() {
resolver.resolve_variable(&variable, &[])?;
resolver.resolve_variable(&variable, &recipe.parameters[..i])?;
}
}
}
Expand Down Expand Up @@ -63,11 +63,12 @@ impl<'src: 'run, 'run> RecipeResolver<'src, 'run> {
parameters: &[Parameter],
) -> CompileResult<'src> {
let name = variable.lexeme();
let undefined = !self.assignments.contains_key(name)
&& !parameters.iter().any(|p| p.name.lexeme() == name)
&& !constants().contains_key(name);

if undefined {
let defined = self.assignments.contains_key(name)
|| parameters.iter().any(|p| p.name.lexeme() == name)
|| constants().contains_key(name);

if !defined {
return Err(variable.error(UndefinedVariable { variable: name }));
}

Expand Down
1 change: 1 addition & 0 deletions tests/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ mod no_cd;
mod no_dependencies;
mod no_exit_message;
mod os_attributes;
mod parameters;
mod parser;
mod positional_arguments;
mod private;
Expand Down
20 changes: 0 additions & 20 deletions tests/misc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1941,26 +1941,6 @@ test! {
shell: false,
}

test! {
name: parameter_cross_reference_error,
justfile: "
foo:
bar a b=a:
",
args: (),
stdout: "",
stderr: "
error: Variable `a` not defined
β€”β€”β–Ά justfile:3:9
β”‚
3 β”‚ bar a b=a:
β”‚ ^
",
status: EXIT_FAILURE,
shell: false,
}

#[cfg(windows)]
test! {
name: pwsh_invocation_directory,
Expand Down
38 changes: 38 additions & 0 deletions tests/parameters.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
use super::*;

#[test]
fn parameter_default_values_may_use_earlier_parameters() {
Test::new()
.justfile(
"
@foo a b=a:
echo {{ b }}
",
)
.args(["foo", "bar"])
.stdout("bar\n")
.run();
}

#[test]
fn parameter_default_values_may_not_use_later_parameters() {
Test::new()
.justfile(
"
@foo a b=c c='':
echo {{ b }}
",
)
.args(["foo", "bar"])
.stderr(
"
error: Variable `c` not defined
β€”β€”β–Ά justfile:1:10
β”‚
1 β”‚ @foo a b=c c='':
β”‚ ^
",
)
.status(EXIT_FAILURE)
.run();
}

0 comments on commit d38e683

Please sign in to comment.