From 227bc0b6d478564c45f49cb47dac963d9c37a528 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 8 Jul 2019 13:39:16 +0300 Subject: add try_conv_with_to_vec --- crates/ra_lsp_server/src/conv.rs | 67 ++++++++++++++++++-------- crates/ra_lsp_server/src/main_loop/handlers.rs | 27 +++-------- 2 files changed, 54 insertions(+), 40 deletions(-) (limited to 'crates/ra_lsp_server') diff --git a/crates/ra_lsp_server/src/conv.rs b/crates/ra_lsp_server/src/conv.rs index 32e67838e..fc01b1c0e 100644 --- a/crates/ra_lsp_server/src/conv.rs +++ b/crates/ra_lsp_server/src/conv.rs @@ -384,27 +384,32 @@ impl TryConvWith for &NavigationTarget { } } -pub fn to_location_link( - target: &RangeInfo, - world: &WorldSnapshot, - // line index for original range file - line_index: &LineIndex, -) -> Result { - let target_uri = target.info.file_id().try_conv_with(world)?; - let tgt_line_index = world.analysis().file_line_index(target.info.file_id()); - - let target_range = target.info.full_range().conv_with(&tgt_line_index); - - let target_selection_range = - target.info.focus_range().map(|it| it.conv_with(&tgt_line_index)).unwrap_or(target_range); - - let res = LocationLink { - origin_selection_range: Some(target.range.conv_with(line_index)), - target_uri, - target_range, - target_selection_range, - }; - Ok(res) +impl TryConvWith for (FileId, RangeInfo) { + type Ctx = WorldSnapshot; + type Output = LocationLink; + fn try_conv_with(self, world: &WorldSnapshot) -> Result { + let (src_file_id, target) = self; + + let target_uri = target.info.file_id().try_conv_with(world)?; + let src_line_index = world.analysis().file_line_index(src_file_id); + let tgt_line_index = world.analysis().file_line_index(target.info.file_id()); + + let target_range = target.info.full_range().conv_with(&tgt_line_index); + + let target_selection_range = target + .info + .focus_range() + .map(|it| it.conv_with(&tgt_line_index)) + .unwrap_or(target_range); + + let res = LocationLink { + origin_selection_range: Some(target.range.conv_with(&src_line_index)), + target_uri, + target_range, + target_selection_range, + }; + Ok(res) + } } pub fn to_location( @@ -452,3 +457,23 @@ where self.iter.next().map(|item| item.conv_with(self.ctx)) } } + +pub trait TryConvWithToVec<'a>: Sized + 'a { + type Ctx; + type Output; + + fn try_conv_with_to_vec(self, ctx: &'a Self::Ctx) -> Result>; +} + +impl<'a, I> TryConvWithToVec<'a> for I +where + I: Iterator + 'a, + I::Item: TryConvWith, +{ + type Ctx = ::Ctx; + type Output = ::Output; + + fn try_conv_with_to_vec(self, ctx: &'a Self::Ctx) -> Result> { + self.map(|it| it.try_conv_with(ctx)).collect() + } +} diff --git a/crates/ra_lsp_server/src/main_loop/handlers.rs b/crates/ra_lsp_server/src/main_loop/handlers.rs index 62c8cbf71..8f07f5027 100644 --- a/crates/ra_lsp_server/src/main_loop/handlers.rs +++ b/crates/ra_lsp_server/src/main_loop/handlers.rs @@ -21,7 +21,7 @@ use url_serde::Ser; use crate::{ cargo_target_spec::{runnable_args, CargoTargetSpec}, - conv::{to_location, to_location_link, Conv, ConvWith, MapConvWith, TryConvWith}, + conv::{to_location, Conv, ConvWith, MapConvWith, TryConvWith, TryConvWithToVec}, req::{self, Decoration}, world::WorldSnapshot, LspError, Result, @@ -263,7 +263,6 @@ pub fn handle_goto_definition( params: req::TextDocumentPositionParams, ) -> Result> { let position = params.try_conv_with(&world)?; - let line_index = world.analysis().file_line_index(position.file_id); let nav_info = match world.analysis().goto_definition(position)? { None => return Ok(None), Some(it) => it, @@ -272,9 +271,8 @@ pub fn handle_goto_definition( let res = nav_info .info .into_iter() - .map(|nav| RangeInfo::new(nav_range, nav)) - .map(|nav| to_location_link(&nav, &world, &line_index)) - .collect::>>()?; + .map(|nav| (position.file_id, RangeInfo::new(nav_range, nav))) + .try_conv_with_to_vec(&world)?; Ok(Some(res.into())) } @@ -283,7 +281,6 @@ pub fn handle_goto_implementation( params: req::TextDocumentPositionParams, ) -> Result> { let position = params.try_conv_with(&world)?; - let line_index = world.analysis().file_line_index(position.file_id); let nav_info = match world.analysis().goto_implementation(position)? { None => return Ok(None), Some(it) => it, @@ -292,9 +289,8 @@ pub fn handle_goto_implementation( let res = nav_info .info .into_iter() - .map(|nav| RangeInfo::new(nav_range, nav)) - .map(|nav| to_location_link(&nav, &world, &line_index)) - .collect::>>()?; + .map(|nav| (position.file_id, RangeInfo::new(nav_range, nav))) + .try_conv_with_to_vec(&world)?; Ok(Some(res.into())) } @@ -303,7 +299,6 @@ pub fn handle_goto_type_definition( params: req::TextDocumentPositionParams, ) -> Result> { let position = params.try_conv_with(&world)?; - let line_index = world.analysis().file_line_index(position.file_id); let nav_info = match world.analysis().goto_type_definition(position)? { None => return Ok(None), Some(it) => it, @@ -312,9 +307,8 @@ pub fn handle_goto_type_definition( let res = nav_info .info .into_iter() - .map(|nav| RangeInfo::new(nav_range, nav)) - .map(|nav| to_location_link(&nav, &world, &line_index)) - .collect::>>()?; + .map(|nav| (position.file_id, RangeInfo::new(nav_range, nav))) + .try_conv_with_to_vec(&world)?; Ok(Some(res.into())) } @@ -323,12 +317,7 @@ pub fn handle_parent_module( params: req::TextDocumentPositionParams, ) -> Result> { let position = params.try_conv_with(&world)?; - world - .analysis() - .parent_module(position)? - .into_iter() - .map(|nav| nav.try_conv_with(&world)) - .collect::>>() + world.analysis().parent_module(position)?.iter().try_conv_with_to_vec(&world) } pub fn handle_runnables( -- cgit v1.2.3