Fix defaulting alias var values (#2631)

This commit is contained in:
Jonathan Turner 2020-10-03 09:18:23 +13:00 committed by GitHub
parent 4201f48be5
commit 0adf2accdd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 1 deletions

View File

@ -4,7 +4,7 @@ use crate::prelude::*;
use derive_new::new; use derive_new::new;
use nu_errors::ShellError; use nu_errors::ShellError;
use nu_protocol::{hir::Block, Scope, Signature, SyntaxShape}; use nu_protocol::{hir::Block, Scope, Signature, SyntaxShape, UntaggedValue};
#[derive(new, Clone)] #[derive(new, Clone)]
pub struct AliasCommand { pub struct AliasCommand {
@ -51,12 +51,24 @@ impl WholeStreamCommand for AliasCommand {
let evaluated = call_info.evaluate(&registry).await?; let evaluated = call_info.evaluate(&registry).await?;
let mut vars = IndexMap::new(); let mut vars = IndexMap::new();
let mut num_positionals = 0;
if let Some(positional) = &evaluated.args.positional { if let Some(positional) = &evaluated.args.positional {
num_positionals = positional.len();
for (pos, arg) in positional.iter().enumerate() { for (pos, arg) in positional.iter().enumerate() {
vars.insert(alias_command.args[pos].0.to_string(), arg.clone()); vars.insert(alias_command.args[pos].0.to_string(), arg.clone());
} }
} }
if alias_command.args.len() > num_positionals {
for idx in 0..(alias_command.args.len() - num_positionals) {
vars.insert(
alias_command.args[idx + num_positionals].0.to_string(),
UntaggedValue::nothing().into_untagged_value(),
);
}
}
let scope = Scope::append_vars(scope, vars); let scope = Scope::append_vars(scope, vars);
// FIXME: we need to patch up the spans to point at the top-level error // FIXME: we need to patch up the spans to point at the top-level error

View File

@ -16,6 +16,21 @@ fn alias_args_work() {
}) })
} }
#[test]
fn alias_missing_args_work() {
Playground::setup("append_test_1", |dirs, _| {
let actual = nu!(
cwd: dirs.root(),
r#"
alias double_echo [a b] {^echo $a $b}
double_echo bob
"#
);
assert_eq!(actual.out, "bob");
})
}
#[test] #[test]
#[cfg(not(windows))] #[cfg(not(windows))]
fn alias_parses_path_tilde() { fn alias_parses_path_tilde() {