@@ -212,6 +212,23 @@ impl Completion {
213 let (view, doc) = current!(editor);
213 let (view, doc) = current!(editor);
215+ macro_rules! language_server {
219+ .get_by_id($item.language_server_id)
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
215 match event {
232 match event {
216 PromptEvent::Abort => {}
233 PromptEvent::Abort => {}
217 PromptEvent::Update => {
234 PromptEvent::Update => {
@@ -236,17 +253,11 @@ impl Completion {
236 // always present here
253 // always present here
237 let item = item.unwrap();
254 let item = item.unwrap();
239− let offset_encoding = editor
241− .get_by_id(item.language_server_id)
242− .expect("language server disappeared between completion request and application")
245 let transaction = item_to_transaction(
256 let transaction = item_to_transaction(
249− offset_encoding,
260+ language_server!(item).offset_encoding(),
250 trigger_offset,
261 trigger_offset,
252 replace_mode,
263 replace_mode,
@@ -262,11 +273,8 @@ impl Completion {
262 // always present here
273 // always present here
263 let mut item = item.unwrap().clone();
274 let mut item = item.unwrap().clone();
265− let offset_encoding = editor
276+ let language_server = language_server!(item);
267− .get_by_id(item.language_server_id)
268− .expect("language server disappeared between completion request and application")
269− .offset_encoding();
277+ let offset_encoding = language_server.offset_encoding();
271 let language_server = editor
279 let language_server = editor
272 .language_servers
280 .language_servers
@@ -401,20 +409,11 @@ impl Completion {
401 Some(item) if !item.resolved => item.clone(),
409 Some(item) if !item.resolved => item.clone(),
402 _ => return false,
410 _ => return false,
404− let language_server = match cx
412+
407− .get_by_id(current_item.language_server_id)
413+ let Some(language_server) = cx.editor.language_server_by_id(current_item.language_server_id) else { return false; };
409− Some(language_server) => language_server,
410− None => return false,
413 // This method should not block the compositor so we handle the response asynchronously.
415 // 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()) {
416+ let Some(future) = language_server.resolve_completion_item(current_item.item.clone()) else { return false; };
415− Some(future) => future,
416− None => return false,
419 cx.callback(
418 cx.callback(