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,
}],