ensure correct trigger/start completion offset

When re requesting a completion that already has a selected item we
reuse that selections savepoint. However, the selection has likely
changed since that savepoint which requires us to use the selection
from that savepoint
This commit is contained in:
Pascal Kuthe 2023-04-05 01:38:17 +02:00 committed by Blaž Hrastnik
parent 30ff7f8db2
commit 9c558fc470
2 changed files with 24 additions and 9 deletions
helix-term/src
helix-view/src

View file

@ -4210,16 +4210,23 @@ pub fn completion(cx: &mut Context) {
let (view, doc) = current!(cx.editor);
let savepoint = if let Some(CompleteAction::Selected { savepoint }) = &cx.editor.last_completion
{
savepoint.clone()
} else {
doc.savepoint(view)
};
let language_server = match doc.language_server() {
Some(language_server) => language_server,
None => return,
};
let offset_encoding = language_server.offset_encoding();
let text = doc.text().slice(..);
let cursor = doc.selection(view.id).primary().cursor(text);
let text = savepoint.text.clone();
let cursor = savepoint.cursor();
let pos = pos_to_lsp_pos(doc.text(), cursor, offset_encoding);
let pos = pos_to_lsp_pos(&text, cursor, offset_encoding);
let future = match language_server.completion(doc.identifier(), pos, None) {
Some(future) => future,
@ -4254,12 +4261,6 @@ pub fn completion(cx: &mut Context) {
iter.reverse();
let offset = iter.take_while(|ch| chars::char_is_word(*ch)).count();
let start_offset = cursor.saturating_sub(offset);
let savepoint = if let Some(CompleteAction::Selected { savepoint }) = &cx.editor.last_completion
{
savepoint.clone()
} else {
doc.savepoint(view)
};
let trigger_doc = doc.id();
let trigger_view = view.id;

View file

@ -114,6 +114,19 @@ pub struct SavePoint {
/// The view this savepoint is associated with
pub view: ViewId,
revert: Mutex<Transaction>,
pub text: Rope,
}
impl SavePoint {
pub fn cursor(&self) -> usize {
// we always create transactions with selections
self.revert
.lock()
.selection()
.unwrap()
.primary()
.cursor(self.text.slice(..))
}
}
pub struct Document {
@ -1230,6 +1243,7 @@ impl Document {
let savepoint = Arc::new(SavePoint {
view: view.id,
revert: Mutex::new(revert),
text: self.text.clone(),
});
self.savepoints.push(Arc::downgrade(&savepoint));
savepoint