Skip to content

Commit

Permalink
Fix command name lookup for known externals (nushell#7830)
Browse files Browse the repository at this point in the history
  • Loading branch information
kubouch authored and Xoffio committed Feb 7, 2023
1 parent 61d8e3c commit c1f6c4a
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 1 deletion.
10 changes: 9 additions & 1 deletion crates/nu-parser/src/known_external.rs
Expand Up @@ -51,7 +51,15 @@ impl Command for KnownExternal {

let mut extern_call = Call::new(head_span);

let extern_name = engine_state.get_decl(call.decl_id).name();
let extern_name = if let Some(name_bytes) = engine_state.find_decl_name(call.decl_id, &[]) {
String::from_utf8_lossy(name_bytes)
} else {
return Err(ShellError::NushellFailedSpanned(
"known external name not found".to_string(),
"could not find name for this command".to_string(),
call.head,
));
};

let extern_name: Vec<_> = extern_name.split(' ').collect();

Expand Down
18 changes: 18 additions & 0 deletions crates/nu-protocol/src/engine/engine_state.rs
Expand Up @@ -585,6 +585,24 @@ impl EngineState {
None
}

pub fn find_decl_name(&self, decl_id: DeclId, removed_overlays: &[Vec<u8>]) -> Option<&[u8]> {
let mut visibility: Visibility = Visibility::new();

for overlay_frame in self.active_overlays(removed_overlays).iter().rev() {
visibility.append(&overlay_frame.visibility);

if visibility.is_decl_id_visible(&decl_id) {
for ((name, _), id) in overlay_frame.decls.iter() {
if id == &decl_id {
return Some(name);
}
}
}
}

None
}

pub fn find_alias(&self, name: &[u8], removed_overlays: &[Vec<u8>]) -> Option<AliasId> {
let mut visibility: Visibility = Visibility::new();

Expand Down
31 changes: 31 additions & 0 deletions src/tests/test_known_external.rs
Expand Up @@ -76,3 +76,34 @@ fn known_external_misc_values() -> TestResult {
"abc a b c",
)
}

/// GitHub issue #7822
#[test]
fn known_external_subcommand_from_module() -> TestResult {
run_test_contains(
r#"
module cargo {
export extern check []
};
use cargo;
cargo check -h
"#,
"cargo check",
)
}

/// GitHub issue #7822
#[test]
fn known_external_aliased_subcommand_from_module() -> TestResult {
run_test_contains(
r#"
module cargo {
export extern check []
};
use cargo;
alias cc = cargo check;
cc -h
"#,
"cargo check",
)
}

0 comments on commit c1f6c4a

Please sign in to comment.