@@ -13,6 +13,11 @@ use once_cell::sync::Lazy;
13use crate::compositor::Compositor;
13use crate::compositor::Compositor;
14use crate::ui::{self, Popup, Prompt, PromptEvent};
14use crate::ui::{self, Popup, Prompt, PromptEvent};
17+use std::path::PathBuf;
16use helix_view::{
21use helix_view::{
17 document::Mode,
22 document::Mode,
18 view::{View, PADDING},
23 view::{View, PADDING},
@@ -846,34 +851,13 @@ pub fn exit_select_mode(cx: &mut Context) {
846 cx.doc().mode = Mode::Normal;
851 cx.doc().mode = Mode::Normal;
849−pub fn goto_definition(cx: &mut Context) {
854+pub fn goto_generic(cx: &mut Context, res: Vec<lsp::Location>) {
850 let doc = cx.doc();
855 let doc = cx.doc();
852− let language_server = match doc.language_server.as_ref() {
853− Some(language_server) => language_server,
857− // TODO: blocking here is not ideal
858− let pos = helix_lsp::util::pos_to_lsp_pos(doc.text().slice(..), doc.selection().cursor());
860− // TODO: handle fails
862− smol::block_on(language_server.goto_definition(doc.identifier(), pos)).unwrap_or_default();
866− let definition_pos = res.get(0).unwrap().range.start;
867− let new_pos = helix_lsp::util::lsp_pos_to_pos(doc.text().slice(..), definition_pos);
868− doc.set_selection(Selection::point(new_pos));
870− // show menu picker i guess
873 doc.mode = Mode::Normal;
857 doc.mode = Mode::Normal;
875 log::info!("{:?}", res);
859 log::info!("{:?}", res);
876− let filepath = doc.path.clone().unwrap();
860+ let filepath = doc.path().unwrap();
877 log::info!("{:?}", filepath);
861 log::info!("{:?}", filepath);
879 match &res.as_slice() {
863 match &res.as_slice() {
@@ -884,6 +868,9 @@ pub fn goto_definition(cx: &mut Context) {
884 doc.set_selection(Selection::point(new_pos));
868 doc.set_selection(Selection::point(new_pos));
886 // open new file
870 // open new file
872+ .open(PathBuf::from(location.uri.path()), cx.executor);
873+ // TODO: go to position
889 [] => (), // maybe show user message that no definition was found?
876 [] => (), // maybe show user message that no definition was found?
@@ -907,6 +894,70 @@ pub fn goto_definition(cx: &mut Context) {
897+pub fn goto_definition(cx: &mut Context) {
899+ let language_server = match doc.language_server.as_ref() {
900+ Some(language_server) => language_server,
904+ // TODO: blocking here is not ideal
905+ let pos = helix_lsp::util::pos_to_lsp_pos(doc.text().slice(..), doc.selection().cursor());
907+ // TODO: handle fails
909+ smol::block_on(language_server.goto_definition(doc.identifier(), pos)).unwrap_or_default();
910+ goto_generic(cx, res);
913+pub fn goto_type_definition(cx: &mut Context) {
915+ let language_server = match doc.language_server.as_ref() {
916+ Some(language_server) => language_server,
920+ // TODO: blocking here is not ideal
921+ let pos = helix_lsp::util::pos_to_lsp_pos(doc.text().slice(..), doc.selection().cursor());
923+ // TODO: handle fails
924+ let res = smol::block_on(language_server.goto_type_definition(doc.identifier(), pos))
925+ .unwrap_or_default();
926+ goto_generic(cx, res);
929+pub fn goto_implementation(cx: &mut Context) {
931+ let language_server = match doc.language_server.as_ref() {
932+ Some(language_server) => language_server,
936+ // TODO: blocking here is not ideal
937+ let pos = helix_lsp::util::pos_to_lsp_pos(doc.text().slice(..), doc.selection().cursor());
939+ // TODO: handle fails
940+ let res = smol::block_on(language_server.goto_implementation(doc.identifier(), pos))
941+ .unwrap_or_default();
942+ goto_generic(cx, res);
945+pub fn goto_reference(cx: &mut Context) {
947+ let language_server = match doc.language_server.as_ref() {
948+ Some(language_server) => language_server,
952+ // TODO: blocking here is not ideal
953+ let pos = helix_lsp::util::pos_to_lsp_pos(doc.text().slice(..), doc.selection().cursor());
955+ // TODO: handle fails
957+ smol::block_on(language_server.goto_reference(doc.identifier(), pos)).unwrap_or_default();
958+ goto_generic(cx, res);
910// NOTE: Transactions in this module get appended to history when we switch back to normal mode.
961// NOTE: Transactions in this module get appended to history when we switch back to normal mode.
911pub mod insert {
962pub mod insert {
912 use super::*;
963 use super::*;