@@ -212,6 +212,23 @@ impl Completion {
212212
213213 let (view, doc) = current!(editor);
214214
215+ macro_rules! language_server {
216+ ($item:expr) => {
217+ match editor
218+ .language_servers
219+ .get_by_id($item.language_server_id)
220+ {
221+ Some(ls) => ls,
222+ None => {
223+ editor.set_error("language server disappeared between completion request and application");
224+ // TODO close the completion menu somehow,
225+ // currently there is no trivial way to access the EditorView to close the completion menu
226+ return;
227+ }
228+ }
229+ };
230+ }
231+
215232 match event {
216233 PromptEvent::Abort => {}
217234 PromptEvent::Update => {
@@ -236,17 +253,11 @@ impl Completion {
236253 // always present here
237254 let item = item.unwrap();
238255
239− let offset_encoding = editor
240− .language_servers
241− .get_by_id(item.language_server_id)
242− .expect("language server disappeared between completion request and application")
243− .offset_encoding();
244−
245256 let transaction = item_to_transaction(
246257 doc,
247258 view.id,
248259 item,
249− offset_encoding,
260+ language_server!(item).offset_encoding(),
250261 trigger_offset,
251262 true,
252263 replace_mode,
@@ -262,11 +273,8 @@ impl Completion {
262273 // always present here
263274 let mut item = item.unwrap().clone();
264275
265− let offset_encoding = editor
266− .language_servers
267− .get_by_id(item.language_server_id)
268− .expect("language server disappeared between completion request and application")
269− .offset_encoding();
276+ let language_server = language_server!(item);
277+ let offset_encoding = language_server.offset_encoding();
270278
271279 let language_server = editor
272280 .language_servers
@@ -401,20 +409,11 @@ impl Completion {
401409 Some(item) if !item.resolved => item.clone(),
402410 _ => return false,
403411 };
404− let language_server = match cx
405− .editor
406− .language_servers
407− .get_by_id(current_item.language_server_id)
408− {
409− Some(language_server) => language_server,
410− None => return false,
411− };
412+
413+ let Some(language_server) = cx.editor.language_server_by_id(current_item.language_server_id) else { return false; };
412414
413415 // This method should not block the compositor so we handle the response asynchronously.
414− let future = match language_server.resolve_completion_item(current_item.item.clone()) {
415− Some(future) => future,
416− None => return false,
417− };
416+ let Some(future) = language_server.resolve_completion_item(current_item.item.clone()) else { return false; };
418417
419418 cx.callback(
420419 future,