From aaac273cd057f826ea3a4b845231ac2d15f96f54 Mon Sep 17 00:00:00 2001 From: Yash Thakur <45539777+ysthakur@users.noreply.github.com> Date: Mon, 22 Jan 2024 08:01:45 -0500 Subject: [PATCH] Fix regression in help menu introduced by #11488 (#11608) For fixing #11599 # Description Turns out I didn't properly test the description menu in #11488, apologies for that. It turns out that `NuHelpCompleter`, which provides completions for the description/help menu, was treating the position it was given as the start of the line rather than the start. Flipping that appears to fix the issue. I missed not only `NuHelpCompleter` but also `NuMenuCompleter` in my previous PR. If the menu's source is a closure and it doesn't return a record with the start and end, then `pos` is again treated as the start, so I've changed that too. External completers shouldn't need changing. # User-Facing Changes # Tests + Formatting - [X] Test description menu - [X] Test menu sources that return records that don't have `start` and `end` - [ ] Test external completers if any changes have to be made there No changes needed, it looks like # After Submitting --- crates/nu-cli/src/menus/help_completions.rs | 43 ++++++++++++++++++++- crates/nu-cli/src/menus/menu_completions.rs | 28 +++++++++++--- 2 files changed, 63 insertions(+), 8 deletions(-) diff --git a/crates/nu-cli/src/menus/help_completions.rs b/crates/nu-cli/src/menus/help_completions.rs index 91642ff980..97883e79a3 100644 --- a/crates/nu-cli/src/menus/help_completions.rs +++ b/crates/nu-cli/src/menus/help_completions.rs @@ -104,8 +104,8 @@ impl NuHelpCompleter { description: Some(long_desc), extra: Some(extra), span: reedline::Span { - start: pos, - end: pos + line.len(), + start: pos - line.len(), + end: pos, }, append_whitespace: false, } @@ -119,3 +119,42 @@ impl Completer for NuHelpCompleter { self.completion_helper(line, pos) } } + +#[cfg(test)] +mod test { + use super::*; + use rstest::rstest; + + #[rstest] + #[case("who", 5, 8, &["whoami"])] + #[case("hash", 1, 5, &["hash", "hash md5", "hash sha256"])] + #[case("into f", 0, 6, &["into float", "into filesize"])] + #[case("into nonexistent", 0, 16, &[])] + fn test_help_completer( + #[case] line: &str, + #[case] start: usize, + #[case] end: usize, + #[case] expected: &[&str], + ) { + let engine_state = + nu_command::add_shell_command_context(nu_cmd_lang::create_default_context()); + let mut completer = NuHelpCompleter::new(engine_state.into()); + let suggestions = completer.complete(line, end); + + assert_eq!( + expected.len(), + suggestions.len(), + "expected {:?}, got {:?}", + expected, + suggestions + .iter() + .map(|s| s.value.clone()) + .collect::>() + ); + + for (exp, actual) in expected.iter().zip(suggestions) { + assert_eq!(exp, &actual.value); + assert_eq!(reedline::Span::new(start, end), actual.span); + } + } +} diff --git a/crates/nu-cli/src/menus/menu_completions.rs b/crates/nu-cli/src/menus/menu_completions.rs index b18c6540b7..6414436bc5 100644 --- a/crates/nu-cli/src/menus/menu_completions.rs +++ b/crates/nu-cli/src/menus/menu_completions.rs @@ -101,9 +101,13 @@ fn convert_to_suggestions( } } _ => reedline::Span { - start: if only_buffer_difference { pos } else { 0 }, + start: if only_buffer_difference { + pos - line.len() + } else { + 0 + }, end: if only_buffer_difference { - pos + line.len() + pos } else { line.len() }, @@ -111,9 +115,13 @@ fn convert_to_suggestions( } } _ => reedline::Span { - start: if only_buffer_difference { pos } else { 0 }, + start: if only_buffer_difference { + pos - line.len() + } else { + 0 + }, end: if only_buffer_difference { - pos + line.len() + pos } else { line.len() }, @@ -152,8 +160,16 @@ fn convert_to_suggestions( description: None, extra: None, span: reedline::Span { - start: 0, - end: line.len(), + start: if only_buffer_difference { + pos - line.len() + } else { + 0 + }, + end: if only_buffer_difference { + pos + } else { + line.len() + }, }, append_whitespace: false, }],