Add support for insert_text_mode
of a completion (#28171)
I wanted this for CONL (https://conl.dev )'s nascent langauge server, and it seems like most of the support was already wired up on the LSP side, so this surfaces it into the editor. Release Notes: - Added support for the `insert_text_mode` field of completions from the language server protocol.
This commit is contained in:
parent
5a7222edc5
commit
a577a72f69
10 changed files with 91 additions and 4 deletions
|
@ -240,6 +240,7 @@ impl CompletionsMenu {
|
|||
icon_path: None,
|
||||
documentation: None,
|
||||
confirm: None,
|
||||
insert_text_mode: None,
|
||||
source: CompletionSource::Custom,
|
||||
})
|
||||
.collect();
|
||||
|
|
|
@ -136,7 +136,7 @@ use task::{ResolvedTask, TaskTemplate, TaskVariables};
|
|||
pub use lsp::CompletionContext;
|
||||
use lsp::{
|
||||
CodeActionKind, CompletionItemKind, CompletionTriggerKind, DiagnosticSeverity,
|
||||
InsertTextFormat, LanguageServerId, LanguageServerName,
|
||||
InsertTextFormat, InsertTextMode, LanguageServerId, LanguageServerName,
|
||||
};
|
||||
|
||||
use language::BufferSnapshot;
|
||||
|
@ -4442,6 +4442,7 @@ impl Editor {
|
|||
word_range,
|
||||
resolved: false,
|
||||
},
|
||||
insert_text_mode: Some(InsertTextMode::AS_IS),
|
||||
confirm: None,
|
||||
}));
|
||||
|
||||
|
@ -4687,7 +4688,13 @@ impl Editor {
|
|||
} else {
|
||||
this.buffer.update(cx, |buffer, cx| {
|
||||
let edits = ranges.iter().map(|range| (range.clone(), text));
|
||||
buffer.edit(edits, this.autoindent_mode.clone(), cx);
|
||||
let auto_indent = if completion.insert_text_mode == Some(InsertTextMode::AS_IS)
|
||||
{
|
||||
None
|
||||
} else {
|
||||
this.autoindent_mode.clone()
|
||||
};
|
||||
buffer.edit(edits, auto_indent, cx);
|
||||
});
|
||||
}
|
||||
for (buffer, edits) in linked_edits {
|
||||
|
@ -18637,6 +18644,7 @@ fn snippet_completions(
|
|||
.description
|
||||
.clone()
|
||||
.map(|description| CompletionDocumentation::SingleLine(description.into())),
|
||||
insert_text_mode: None,
|
||||
confirm: None,
|
||||
})
|
||||
})
|
||||
|
|
|
@ -10235,6 +10235,62 @@ async fn test_completion_sort(cx: &mut TestAppContext) {
|
|||
});
|
||||
}
|
||||
|
||||
#[gpui::test]
|
||||
async fn test_as_is_completions(cx: &mut TestAppContext) {
|
||||
init_test(cx, |_| {});
|
||||
let mut cx = EditorLspTestContext::new_rust(
|
||||
lsp::ServerCapabilities {
|
||||
completion_provider: Some(lsp::CompletionOptions {
|
||||
..Default::default()
|
||||
}),
|
||||
..Default::default()
|
||||
},
|
||||
cx,
|
||||
)
|
||||
.await;
|
||||
cx.lsp
|
||||
.set_request_handler::<lsp::request::Completion, _, _>(move |_, _| async move {
|
||||
Ok(Some(lsp::CompletionResponse::Array(vec![
|
||||
lsp::CompletionItem {
|
||||
label: "unsafe".into(),
|
||||
text_edit: Some(lsp::CompletionTextEdit::Edit(lsp::TextEdit {
|
||||
range: lsp::Range {
|
||||
start: lsp::Position {
|
||||
line: 1,
|
||||
character: 2,
|
||||
},
|
||||
end: lsp::Position {
|
||||
line: 1,
|
||||
character: 3,
|
||||
},
|
||||
},
|
||||
new_text: "unsafe".to_string(),
|
||||
})),
|
||||
insert_text_mode: Some(lsp::InsertTextMode::AS_IS),
|
||||
..Default::default()
|
||||
},
|
||||
])))
|
||||
});
|
||||
cx.set_state("fn a() {}\n nˇ");
|
||||
cx.executor().run_until_parked();
|
||||
cx.update_editor(|editor, window, cx| {
|
||||
editor.show_completions(
|
||||
&ShowCompletions {
|
||||
trigger: Some("\n".into()),
|
||||
},
|
||||
window,
|
||||
cx,
|
||||
);
|
||||
});
|
||||
cx.executor().run_until_parked();
|
||||
|
||||
cx.update_editor(|editor, window, cx| {
|
||||
editor.confirm_completion(&Default::default(), window, cx)
|
||||
});
|
||||
cx.executor().run_until_parked();
|
||||
cx.assert_editor_state("fn a() {}\n unsafeˇ");
|
||||
}
|
||||
|
||||
#[gpui::test]
|
||||
async fn test_no_duplicated_completion_requests(cx: &mut TestAppContext) {
|
||||
init_test(cx, |_| {});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue