From af7e300041b1af68e671446fe22d2b9e5d30f83d Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 30 Jun 2020 13:27:13 +0200 Subject: [PATCH] Remove confusing API --- .../ra_ide/src/display/navigation_target.rs | 36 ++++++++----------- crates/ra_ide/src/goto_implementation.rs | 2 +- crates/rust-analyzer/src/handlers.rs | 9 ++--- crates/rust-analyzer/src/to_proto.rs | 12 +++++++ 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/crates/ra_ide/src/display/navigation_target.rs b/crates/ra_ide/src/display/navigation_target.rs index f8a4663046..8bf2428ed4 100644 --- a/crates/ra_ide/src/display/navigation_target.rs +++ b/crates/ra_ide/src/display/navigation_target.rs @@ -11,7 +11,7 @@ use ra_syntax::{ TextRange, }; -use crate::{FileRange, FileSymbol}; +use crate::FileSymbol; use super::short_label::ShortLabel; @@ -47,6 +47,19 @@ impl NavigationTarget { pub fn range(&self) -> TextRange { self.focus_range.unwrap_or(self.full_range) } + /// A "most interesting" range withing the `full_range`. + /// + /// Typically, `full_range` is the whole syntax node, + /// including doc comments, and `focus_range` is the range of the identifier. + pub fn focus_range(&self) -> Option { + self.focus_range + } + pub fn full_range(&self) -> TextRange { + self.full_range + } + pub fn file_id(&self) -> FileId { + self.file_id + } pub fn name(&self) -> &SmolStr { &self.name @@ -60,19 +73,6 @@ impl NavigationTarget { self.kind } - pub fn file_id(&self) -> FileId { - self.file_id - } - - // TODO: inconsistent - pub fn file_range(&self) -> FileRange { - FileRange { file_id: self.file_id, range: self.full_range } - } - - pub fn full_range(&self) -> TextRange { - self.full_range - } - pub fn docs(&self) -> Option<&str> { self.docs.as_deref() } @@ -81,14 +81,6 @@ impl NavigationTarget { self.description.as_deref() } - /// A "most interesting" range withing the `full_range`. - /// - /// Typically, `full_range` is the whole syntax node, - /// including doc comments, and `focus_range` is the range of the identifier. - pub fn focus_range(&self) -> Option { - self.focus_range - } - pub(crate) fn from_module_to_decl(db: &RootDatabase, module: hir::Module) -> NavigationTarget { let name = module.name(db).map(|it| it.to_string().into()).unwrap_or_default(); if let Some(src) = module.declaration_source(db) { diff --git a/crates/ra_ide/src/goto_implementation.rs b/crates/ra_ide/src/goto_implementation.rs index 1882789c4a..99a7022a48 100644 --- a/crates/ra_ide/src/goto_implementation.rs +++ b/crates/ra_ide/src/goto_implementation.rs @@ -76,7 +76,7 @@ fn impls_for_trait( mod tests { use ra_db::FileRange; - use crate::mock_analysis::{analysis_and_position, MockAnalysis}; + use crate::mock_analysis::MockAnalysis; fn check(ra_fixture: &str) { let (mock, position) = MockAnalysis::with_files_and_position(ra_fixture); diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs index 0940fcc287..25bcd80af8 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs @@ -330,11 +330,12 @@ pub(crate) fn handle_workspace_symbol( fn exec_query(snap: &GlobalStateSnapshot, query: Query) -> Result> { let mut res = Vec::new(); for nav in snap.analysis.symbol_search(query)? { + let container_name = nav.container_name().map(|v| v.to_string()); let info = SymbolInformation { name: nav.name().to_string(), kind: to_proto::symbol_kind(nav.kind()), - location: to_proto::location(snap, nav.file_range())?, - container_name: nav.container_name().map(|v| v.to_string()), + location: to_proto::location_from_nav(snap, nav)?, + container_name, deprecated: None, }; res.push(info); @@ -1213,8 +1214,8 @@ fn show_impl_command_link( let position = to_proto::position(&line_index, position.offset); let locations: Vec<_> = nav_data .info - .iter() - .filter_map(|it| to_proto::location(snap, it.file_range()).ok()) + .into_iter() + .filter_map(|nav| to_proto::location_from_nav(snap, nav).ok()) .collect(); let title = implementation_title(locations.len()); let command = show_references_command(title, &uri, position, locations); diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs index a03222ae96..a0a58f689d 100644 --- a/crates/rust-analyzer/src/to_proto.rs +++ b/crates/rust-analyzer/src/to_proto.rs @@ -446,6 +446,18 @@ pub(crate) fn location( Ok(loc) } +/// Perefer using `location_link`, if the client has the cap. +pub(crate) fn location_from_nav( + snap: &GlobalStateSnapshot, + nav: NavigationTarget, +) -> Result { + let url = url(snap, nav.file_id()); + let line_index = snap.analysis.file_line_index(nav.file_id())?; + let range = range(&line_index, nav.full_range()); + let loc = lsp_types::Location::new(url, range); + Ok(loc) +} + pub(crate) fn location_link( snap: &GlobalStateSnapshot, src: Option,