From ee461a211195b093269ead477f01fcf63f20cf34 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 5 Jan 2019 20:00:03 +0300 Subject: kill approximatelly_resolve_symbol --- crates/ra_analysis/src/goto_defenition.rs | 2 +- crates/ra_analysis/src/hover.rs | 17 +++++---- crates/ra_analysis/src/imp.rs | 62 +------------------------------ crates/ra_analysis/src/lib.rs | 20 ---------- 4 files changed, 11 insertions(+), 90 deletions(-) diff --git a/crates/ra_analysis/src/goto_defenition.rs b/crates/ra_analysis/src/goto_defenition.rs index 08d1809ee..e37421f8d 100644 --- a/crates/ra_analysis/src/goto_defenition.rs +++ b/crates/ra_analysis/src/goto_defenition.rs @@ -20,7 +20,7 @@ pub(crate) fn goto_defenition( Ok(None) } -fn reference_defenition( +pub(crate) fn reference_defenition( db: &RootDatabase, file_id: FileId, name_ref: ast::NameRef, diff --git a/crates/ra_analysis/src/hover.rs b/crates/ra_analysis/src/hover.rs index 766fa0547..758de376e 100644 --- a/crates/ra_analysis/src/hover.rs +++ b/crates/ra_analysis/src/hover.rs @@ -1,4 +1,5 @@ use ra_db::{Cancelable, SyntaxDatabase}; +use ra_editor::find_node_at_offset; use ra_syntax::{ AstNode, SyntaxNode, ast::{self, NameOwner}, @@ -11,18 +12,18 @@ pub(crate) fn hover( db: &RootDatabase, position: FilePosition, ) -> Cancelable>> { + let file = db.source_file(position.file_id); let mut res = Vec::new(); - let range = if let Some(rr) = db.approximately_resolve_symbol(position)? { - for nav in rr.resolves_to { + let range = if let Some(name_ref) = + find_node_at_offset::(file.syntax(), position.offset) + { + let navs = crate::goto_defenition::reference_defenition(db, position.file_id, name_ref)?; + for nav in navs { res.extend(doc_text_for(db, nav)?) } - rr.reference_range + name_ref.syntax().range() } else { - let file = db.source_file(position.file_id); - let expr: ast::Expr = ctry!(ra_editor::find_node_at_offset( - file.syntax(), - position.offset - )); + let expr: ast::Expr = ctry!(find_node_at_offset(file.syntax(), position.offset)); let frange = FileRange { file_id: position.file_id, range: expr.syntax().range(), diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs index 6df118c20..6ab3c5476 100644 --- a/crates/ra_analysis/src/imp.rs +++ b/crates/ra_analysis/src/imp.rs @@ -18,7 +18,7 @@ use crate::{ AnalysisChange, Cancelable, NavigationTarget, CrateId, db, Diagnostic, FileId, FilePosition, FileRange, FileSystemEdit, - Query, ReferenceResolution, RootChange, SourceChange, SourceFileEdit, + Query, RootChange, SourceChange, SourceFileEdit, symbol_index::{LibrarySymbolsQuery, FileSymbol}, }; @@ -139,66 +139,6 @@ impl db::RootDatabase { pub(crate) fn crate_root(&self, crate_id: CrateId) -> FileId { self.crate_graph().crate_root(crate_id) } - pub(crate) fn approximately_resolve_symbol( - &self, - position: FilePosition, - ) -> Cancelable> { - let file = self.source_file(position.file_id); - let syntax = file.syntax(); - if let Some(name_ref) = find_node_at_offset::(syntax, position.offset) { - let mut rr = ReferenceResolution::new(name_ref.syntax().range()); - if let Some(fn_descr) = - source_binder::function_from_child_node(self, position.file_id, name_ref.syntax())? - { - let scope = fn_descr.scopes(self); - // First try to resolve the symbol locally - if let Some(entry) = scope.resolve_local_name(name_ref) { - rr.resolves_to.push(NavigationTarget { - file_id: position.file_id, - name: entry.name().to_string().into(), - range: entry.ptr().range(), - kind: NAME, - ptr: None, - }); - return Ok(Some(rr)); - }; - } - // If that fails try the index based approach. - rr.resolves_to.extend( - self.index_resolve(name_ref)? - .into_iter() - .map(NavigationTarget::from_symbol), - ); - return Ok(Some(rr)); - } - if let Some(name) = find_node_at_offset::(syntax, position.offset) { - let mut rr = ReferenceResolution::new(name.syntax().range()); - if let Some(module) = name.syntax().parent().and_then(ast::Module::cast) { - if module.has_semi() { - if let Some(child_module) = - source_binder::module_from_declaration(self, position.file_id, module)? - { - let file_id = child_module.file_id(); - let name = match child_module.name() { - Some(name) => name.to_string().into(), - None => "".into(), - }; - let symbol = NavigationTarget { - file_id, - name, - range: TextRange::offset_len(0.into(), 0.into()), - kind: MODULE, - ptr: None, - }; - rr.resolves_to.push(symbol); - return Ok(Some(rr)); - } - } - } - } - Ok(None) - } - pub(crate) fn find_all_refs( &self, position: FilePosition, diff --git a/crates/ra_analysis/src/lib.rs b/crates/ra_analysis/src/lib.rs index 13527e628..4d895b004 100644 --- a/crates/ra_analysis/src/lib.rs +++ b/crates/ra_analysis/src/lib.rs @@ -274,26 +274,6 @@ impl RangeInfo { } } -/// Result of "goto def" query. -#[derive(Debug)] -pub struct ReferenceResolution { - /// The range of the reference itself. Client does not know what constitutes - /// a reference, it handles us only the offset. It's helpful to tell the - /// client where the reference was. - pub reference_range: TextRange, - /// What this reference resolves to. - pub resolves_to: Vec, -} - -impl ReferenceResolution { - fn new(reference_range: TextRange) -> ReferenceResolution { - ReferenceResolution { - reference_range, - resolves_to: Vec::new(), - } - } -} - /// `AnalysisHost` stores the current state of the world. #[derive(Debug, Default)] pub struct AnalysisHost { -- cgit v1.2.3