@@ -861,15 +861,42 @@ pub fn goto_definition(cx: &mut Context) {
861 let res =
861 let res =
862 smol::block_on(language_server.goto_definition(doc.identifier(), pos)).unwrap_or_default();
862 smol::block_on(language_server.goto_definition(doc.identifier(), pos)).unwrap_or_default();
864 if res.len() == 1 {
865 if res.len() == 1 {
865 let definition_pos = res.get(0).unwrap().range.start;
866 let definition_pos = res.get(0).unwrap().range.start;
866 let new_pos = helix_lsp::util::lsp_pos_to_pos(doc.text().slice(..), definition_pos);
867 let new_pos = helix_lsp::util::lsp_pos_to_pos(doc.text().slice(..), definition_pos);
867 doc.set_selection(Selection::point(new_pos));
868 doc.set_selection(Selection::point(new_pos));
869 // show menu picker i guess
870 // show menu picker i guess
872 doc.mode = Mode::Normal;
873 doc.mode = Mode::Normal;
875+ match &res.as_slice() {
877+ let definition_pos = location.range.start;
878+ let new_pos = helix_lsp::util::lsp_pos_to_pos(doc.text().slice(..), definition_pos);
879+ doc.set_selection(Selection::point(new_pos));
881+ [] => (), // maybe show user message that no definition was found?
883+ let snapshot = doc.state.clone();
884+ let mut picker = ui::Picker::new(
887+ let file = item.uri.as_str();
888+ let line = item.range.start.line.to_string();
889+ format!("{}:{}", file, line).into()
891+ move |editor: &mut Editor, item| {
892+ let doc = &mut editor.view_mut().doc;
894+ // revert state to what it was before the last update
895+ doc.state = snapshot.clone();
875// NOTE: Transactions in this module get appended to history when we switch back to normal mode.
902// NOTE: Transactions in this module get appended to history when we switch back to normal mode.