Skip to content

Commit

Permalink
added goto functions in helix-term
Browse files Browse the repository at this point in the history
  • Loading branch information
janhrastnik authored and archseer committed Mar 16, 2021
1 parent b738ae1 commit 3869d77
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 24 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

97 changes: 74 additions & 23 deletions helix-term/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ use once_cell::sync::Lazy;
use crate::compositor::Compositor;
use crate::ui::{self, Popup, Prompt, PromptEvent};

use lsp_types as lsp;
use std::path::PathBuf;

use smol::Executor;

use helix_view::{
document::Mode,
view::{View, PADDING},
Expand Down Expand Up @@ -846,34 +851,13 @@ pub fn exit_select_mode(cx: &mut Context) {
cx.doc().mode = Mode::Normal;
}

pub fn goto_definition(cx: &mut Context) {
pub fn goto_generic(cx: &mut Context, res: Vec<lsp::Location>) {
let doc = cx.doc();

let language_server = match doc.language_server.as_ref() {
Some(language_server) => language_server,
None => return,
};

// TODO: blocking here is not ideal
let pos = helix_lsp::util::pos_to_lsp_pos(doc.text().slice(..), doc.selection().cursor());

// TODO: handle fails
let res =
smol::block_on(language_server.goto_definition(doc.identifier(), pos)).unwrap_or_default();

/*
if res.len() == 1 {
let definition_pos = res.get(0).unwrap().range.start;
let new_pos = helix_lsp::util::lsp_pos_to_pos(doc.text().slice(..), definition_pos);
doc.set_selection(Selection::point(new_pos));
} else {
// show menu picker i guess
}*/

doc.mode = Mode::Normal;

log::info!("{:?}", res);
let filepath = doc.path.clone().unwrap();
let filepath = doc.path().unwrap();
log::info!("{:?}", filepath);

match &res.as_slice() {
Expand All @@ -884,6 +868,9 @@ pub fn goto_definition(cx: &mut Context) {
doc.set_selection(Selection::point(new_pos));
} else {
// open new file
cx.editor
.open(PathBuf::from(location.uri.path()), cx.executor);
// TODO: go to position
}
}
[] => (), // maybe show user message that no definition was found?
Expand All @@ -907,6 +894,70 @@ pub fn goto_definition(cx: &mut Context) {
}
}

pub fn goto_definition(cx: &mut Context) {
let doc = cx.doc();
let language_server = match doc.language_server.as_ref() {
Some(language_server) => language_server,
None => return,
};

// TODO: blocking here is not ideal
let pos = helix_lsp::util::pos_to_lsp_pos(doc.text().slice(..), doc.selection().cursor());

// TODO: handle fails
let res =
smol::block_on(language_server.goto_definition(doc.identifier(), pos)).unwrap_or_default();
goto_generic(cx, res);
}

pub fn goto_type_definition(cx: &mut Context) {
let doc = cx.doc();
let language_server = match doc.language_server.as_ref() {
Some(language_server) => language_server,
None => return,
};

// TODO: blocking here is not ideal
let pos = helix_lsp::util::pos_to_lsp_pos(doc.text().slice(..), doc.selection().cursor());

// TODO: handle fails
let res = smol::block_on(language_server.goto_type_definition(doc.identifier(), pos))
.unwrap_or_default();
goto_generic(cx, res);
}

pub fn goto_implementation(cx: &mut Context) {
let doc = cx.doc();
let language_server = match doc.language_server.as_ref() {
Some(language_server) => language_server,
None => return,
};

// TODO: blocking here is not ideal
let pos = helix_lsp::util::pos_to_lsp_pos(doc.text().slice(..), doc.selection().cursor());

// TODO: handle fails
let res = smol::block_on(language_server.goto_implementation(doc.identifier(), pos))
.unwrap_or_default();
goto_generic(cx, res);
}

pub fn goto_reference(cx: &mut Context) {
let doc = cx.doc();
let language_server = match doc.language_server.as_ref() {
Some(language_server) => language_server,
None => return,
};

// TODO: blocking here is not ideal
let pos = helix_lsp::util::pos_to_lsp_pos(doc.text().slice(..), doc.selection().cursor());

// TODO: handle fails
let res =
smol::block_on(language_server.goto_reference(doc.identifier(), pos)).unwrap_or_default();
goto_generic(cx, res);
}

// NOTE: Transactions in this module get appended to history when we switch back to normal mode.
pub mod insert {
use super::*;
Expand Down
2 changes: 1 addition & 1 deletion helix-view/src/document.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ pub enum Mode {
pub struct Document {
pub state: State, // rope + selection
/// File path on disk.
pub path: Option<PathBuf>, // pub for testing
path: Option<PathBuf>,

/// Current editing mode.
pub mode: Mode,
Expand Down

0 comments on commit 3869d77

Please sign in to comment.