From 0ebb25b29b0988be89f42091fd373ea58d7ff9fb Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 25 May 2020 15:55:25 +0200 Subject: Document `parentModule` experimental LSP request --- crates/rust-analyzer/src/caps.rs | 1 + crates/rust-analyzer/src/lsp_ext.rs | 6 ++--- crates/rust-analyzer/src/main_loop/handlers.rs | 32 ++++++++------------------ crates/rust-analyzer/src/to_proto.rs | 15 ++++++++---- 4 files changed, 25 insertions(+), 29 deletions(-) (limited to 'crates') diff --git a/crates/rust-analyzer/src/caps.rs b/crates/rust-analyzer/src/caps.rs index d55cbb15f..345693524 100644 --- a/crates/rust-analyzer/src/caps.rs +++ b/crates/rust-analyzer/src/caps.rs @@ -86,6 +86,7 @@ pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabiliti "joinLines": true, "ssr": true, "onEnter": true, + "parentModule": true, })), } } diff --git a/crates/rust-analyzer/src/lsp_ext.rs b/crates/rust-analyzer/src/lsp_ext.rs index c571c62ae..acb1dacb6 100644 --- a/crates/rust-analyzer/src/lsp_ext.rs +++ b/crates/rust-analyzer/src/lsp_ext.rs @@ -3,7 +3,7 @@ use std::{collections::HashMap, path::PathBuf}; use lsp_types::request::Request; -use lsp_types::{Location, Position, Range, TextDocumentIdentifier}; +use lsp_types::{Position, Range, TextDocumentIdentifier}; use rustc_hash::FxHashMap; use serde::{Deserialize, Serialize}; @@ -79,8 +79,8 @@ pub enum ParentModule {} impl Request for ParentModule { type Params = lsp_types::TextDocumentPositionParams; - type Result = Vec; - const METHOD: &'static str = "rust-analyzer/parentModule"; + type Result = Option; + const METHOD: &'static str = "experimental/parentModule"; } pub enum JoinLines {} diff --git a/crates/rust-analyzer/src/main_loop/handlers.rs b/crates/rust-analyzer/src/main_loop/handlers.rs index 3ccc95c23..1f910ff82 100644 --- a/crates/rust-analyzer/src/main_loop/handlers.rs +++ b/crates/rust-analyzer/src/main_loop/handlers.rs @@ -344,11 +344,8 @@ pub fn handle_goto_definition( None => return Ok(None), Some(it) => it, }; - let res = to_proto::goto_definition_response( - &world, - FileRange { file_id: position.file_id, range: nav_info.range }, - nav_info.info, - )?; + let src = FileRange { file_id: position.file_id, range: nav_info.range }; + let res = to_proto::goto_definition_response(&world, Some(src), nav_info.info)?; Ok(Some(res)) } @@ -362,11 +359,8 @@ pub fn handle_goto_implementation( None => return Ok(None), Some(it) => it, }; - let res = to_proto::goto_definition_response( - &world, - FileRange { file_id: position.file_id, range: nav_info.range }, - nav_info.info, - )?; + let src = FileRange { file_id: position.file_id, range: nav_info.range }; + let res = to_proto::goto_definition_response(&world, Some(src), nav_info.info)?; Ok(Some(res)) } @@ -380,26 +374,20 @@ pub fn handle_goto_type_definition( None => return Ok(None), Some(it) => it, }; - let res = to_proto::goto_definition_response( - &world, - FileRange { file_id: position.file_id, range: nav_info.range }, - nav_info.info, - )?; + let src = FileRange { file_id: position.file_id, range: nav_info.range }; + let res = to_proto::goto_definition_response(&world, Some(src), nav_info.info)?; Ok(Some(res)) } pub fn handle_parent_module( world: WorldSnapshot, params: lsp_types::TextDocumentPositionParams, -) -> Result> { +) -> Result> { let _p = profile("handle_parent_module"); let position = from_proto::file_position(&world, params)?; - world - .analysis() - .parent_module(position)? - .into_iter() - .map(|it| to_proto::location(&world, it.file_range())) - .collect::>>() + let navs = world.analysis().parent_module(position)?; + let res = to_proto::goto_definition_response(&world, None, navs)?; + Ok(Some(res)) } pub fn handle_runnables( diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs index 39d58f1e0..bb7594dbf 100644 --- a/crates/rust-analyzer/src/to_proto.rs +++ b/crates/rust-analyzer/src/to_proto.rs @@ -403,13 +403,20 @@ pub(crate) fn location(world: &WorldSnapshot, frange: FileRange) -> Result, target: NavigationTarget, ) -> Result { - let src_location = location(world, src)?; + let origin_selection_range = match src { + Some(src) => { + let line_index = world.analysis().file_line_index(src.file_id)?; + let range = range(&line_index, src.range); + Some(range) + } + None => None, + }; let (target_uri, target_range, target_selection_range) = location_info(world, target)?; let res = lsp_types::LocationLink { - origin_selection_range: Some(src_location.range), + origin_selection_range, target_uri, target_range, target_selection_range, @@ -432,7 +439,7 @@ fn location_info( pub(crate) fn goto_definition_response( world: &WorldSnapshot, - src: FileRange, + src: Option, targets: Vec, ) -> Result { if world.config.client_caps.location_link { -- cgit v1.2.3