Retain tag when accessing a var (#3535)

This commit is contained in:
JT 2021-06-02 19:49:14 +12:00 committed by GitHub
parent 2486492c4d
commit 290c712cde
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 63 additions and 2 deletions

View File

@ -200,7 +200,11 @@ pub fn evaluate_baseline_expr(
}; };
} }
Ok(item.value.into_value(tag)) if path.tail.is_empty() {
Ok(item)
} else {
Ok(item.value.into_value(tag))
}
} }
Expression::Boolean(_boolean) => Ok(UntaggedValue::boolean(*_boolean).into_value(tag)), Expression::Boolean(_boolean) => Ok(UntaggedValue::boolean(*_boolean).into_value(tag)),
Expression::Garbage => unimplemented!(), Expression::Garbage => unimplemented!(),
@ -289,7 +293,10 @@ fn evaluate_invocation(block: &hir::Block, ctx: &EvaluationContext) -> Result<Va
} }
match output.len() { match output.len() {
x if x > 1 => Ok(UntaggedValue::Table(output).into_value(Tag::unknown())), x if x > 1 => {
let tag = output[0].tag.clone();
Ok(UntaggedValue::Table(output).into_value(tag))
}
1 => Ok(output[0].clone()), 1 => Ok(output[0].clone()),
_ => Ok(UntaggedValue::nothing().into_value(Tag::unknown())), _ => Ok(UntaggedValue::nothing().into_value(Tag::unknown())),
} }

View File

@ -61,6 +61,60 @@ fn treats_dot_dot_as_path_not_range() {
}) })
} }
#[test]
fn tags_dont_persist_through_column_path() {
Playground::setup("dot_dot_dir", |dirs, sandbox| {
sandbox.with_files(vec![FileWithContentToBeTrimmed(
"nu_times.csv",
r#"
name,rusty_luck,origin
Jason,1,Canada
"#,
)]);
let actual = nu!(
cwd: dirs.test(), pipeline(
r#"
mkdir temp;
cd temp;
let x = (open ../nu_times.csv).name;
$x | tags | get anchor | autoview;
rmdir temp
"#
));
// chop will remove the last escaped double quote from \"Estados Unidos\"
assert!(actual.err.contains("isn't a column"));
})
}
#[test]
fn tags_persist_through_vars() {
Playground::setup("dot_dot_dir", |dirs, sandbox| {
sandbox.with_files(vec![FileWithContentToBeTrimmed(
"nu_times.csv",
r#"
name,rusty_luck,origin
Jason,1,Canada
"#,
)]);
let actual = nu!(
cwd: dirs.test(), pipeline(
r#"
mkdir temp;
cd temp;
let x = (open ../nu_times.csv);
$x | tags | get anchor | autoview;
rmdir temp
"#
));
// chop will remove the last escaped double quote from \"Estados Unidos\"
assert!(actual.out.contains("nu_times.csv"));
})
}
#[test] #[test]
fn invocation_properly_redirects() { fn invocation_properly_redirects() {
let actual = nu!( let actual = nu!(