aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src/ui
diff options
context:
space:
mode:
authorPhilipp Mildenberger2023-04-05 16:50:05 +0000
committerPhilipp Mildenberger2023-05-18 20:04:47 +0000
commit39b9a4bba2a026844348886c9d9f2026a3d6f658 (patch)
tree5d940e2692d13faf949606aa5bb13267dad48547 /helix-term/src/ui
parent521cdec5a1a53c61d38ce5a1df85f82857f59149 (diff)
Add function `Editor::language_server_by_id` and refactor/simplify related code, also don't 'crash' in completion menu if language_server somehow disappeared
Diffstat (limited to 'helix-term/src/ui')
-rw-r--r--helix-term/src/ui/completion.rs47
1 files changed, 23 insertions, 24 deletions
diff --git a/helix-term/src/ui/completion.rs b/helix-term/src/ui/completion.rs
index e62efdac..28a5157c 100644
--- a/helix-term/src/ui/completion.rs
+++ b/helix-term/src/ui/completion.rs
@@ -212,6 +212,23 @@ impl Completion {
let (view, doc) = current!(editor);
+ macro_rules! language_server {
+ ($item:expr) => {
+ match editor
+ .language_servers
+ .get_by_id($item.language_server_id)
+ {
+ Some(ls) => ls,
+ None => {
+ editor.set_error("language server disappeared between completion request and application");
+ // TODO close the completion menu somehow,
+ // currently there is no trivial way to access the EditorView to close the completion menu
+ return;
+ }
+ }
+ };
+ }
+
match event {
PromptEvent::Abort => {}
PromptEvent::Update => {
@@ -236,17 +253,11 @@ impl Completion {
// always present here
let item = item.unwrap();
- let offset_encoding = editor
- .language_servers
- .get_by_id(item.language_server_id)
- .expect("language server disappeared between completion request and application")
- .offset_encoding();
-
let transaction = item_to_transaction(
doc,
view.id,
item,
- offset_encoding,
+ language_server!(item).offset_encoding(),
trigger_offset,
true,
replace_mode,
@@ -262,11 +273,8 @@ impl Completion {
// always present here
let mut item = item.unwrap().clone();
- let offset_encoding = editor
- .language_servers
- .get_by_id(item.language_server_id)
- .expect("language server disappeared between completion request and application")
- .offset_encoding();
+ let language_server = language_server!(item);
+ let offset_encoding = language_server.offset_encoding();
let language_server = editor
.language_servers
@@ -401,20 +409,11 @@ impl Completion {
Some(item) if !item.resolved => item.clone(),
_ => return false,
};
- let language_server = match cx
- .editor
- .language_servers
- .get_by_id(current_item.language_server_id)
- {
- Some(language_server) => language_server,
- None => return false,
- };
+
+ let Some(language_server) = cx.editor.language_server_by_id(current_item.language_server_id) else { return false; };
// This method should not block the compositor so we handle the response asynchronously.
- let future = match language_server.resolve_completion_item(current_item.item.clone()) {
- Some(future) => future,
- None => return false,
- };
+ let Some(future) = language_server.resolve_completion_item(current_item.item.clone()) else { return false; };
cx.callback(
future,