From c023d4111a4d59ca6d423e484267916a898e6452 Mon Sep 17 00:00:00 2001 From: JT <547158+jntrnr@users.noreply.github.com> Date: Sun, 13 Mar 2022 11:30:37 -0700 Subject: [PATCH] Alias to keywords (eg `source`) (#4835) * Allow aliasing source * Add test --- crates/nu-command/tests/commands/alias.rs | 13 +++++++++++++ crates/nu-command/tests/commands/mod.rs | 1 + crates/nu-parser/src/parser.rs | 17 +++++++++++++---- tests/fixtures/formats/sample_def.nu | 3 +++ 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 crates/nu-command/tests/commands/alias.rs create mode 100644 tests/fixtures/formats/sample_def.nu diff --git a/crates/nu-command/tests/commands/alias.rs b/crates/nu-command/tests/commands/alias.rs new file mode 100644 index 0000000000..bb9cd3c27d --- /dev/null +++ b/crates/nu-command/tests/commands/alias.rs @@ -0,0 +1,13 @@ +use nu_test_support::{nu, pipeline}; + +#[test] +fn echo_range_is_lazy() { + let actual = nu!( + cwd: "tests/fixtures/formats", pipeline( + r#" + alias bar = source sample_def.nu; bar; greet + "# + )); + + assert_eq!(actual.out, "hello"); +} diff --git a/crates/nu-command/tests/commands/mod.rs b/crates/nu-command/tests/commands/mod.rs index bb17eddad5..a3b2acd618 100644 --- a/crates/nu-command/tests/commands/mod.rs +++ b/crates/nu-command/tests/commands/mod.rs @@ -1,3 +1,4 @@ +mod alias; mod all; mod any; mod append; diff --git a/crates/nu-parser/src/parser.rs b/crates/nu-parser/src/parser.rs index 99af7e60e6..b8c4f4de8c 100644 --- a/crates/nu-parser/src/parser.rs +++ b/crates/nu-parser/src/parser.rs @@ -897,10 +897,19 @@ pub fn parse_call( new_spans.extend(&spans[(pos + 1)..]); } - working_set.enter_scope(); - working_set.hide_alias(&name); - let (mut result, err) = parse_expression(working_set, &new_spans, false); - working_set.exit_scope(); + let alias_id = working_set.hide_alias(&name); + let lite_command = LiteCommand { + comments: vec![], + parts: new_spans.clone(), + }; + let (mut result, err) = parse_builtin_commands(working_set, &lite_command); + if let Some(frame) = working_set.delta.scope.last_mut() { + if let Some(alias_id) = alias_id { + frame.aliases.insert(name.clone(), alias_id); + } + } + + let mut result = result.expressions.remove(0); result.replace_span(working_set, expansion_span, orig_span); diff --git a/tests/fixtures/formats/sample_def.nu b/tests/fixtures/formats/sample_def.nu new file mode 100644 index 0000000000..a7f9a0602e --- /dev/null +++ b/tests/fixtures/formats/sample_def.nu @@ -0,0 +1,3 @@ +def greet [] { + "hello" +}