diff options
Diffstat (limited to 'crates/ra_ide_db/src')
-rw-r--r-- | crates/ra_ide_db/src/imports_locator.rs | 8 | ||||
-rw-r--r-- | crates/ra_ide_db/src/search.rs | 20 | ||||
-rw-r--r-- | crates/ra_ide_db/src/symbol_index.rs | 7 |
3 files changed, 16 insertions, 19 deletions
diff --git a/crates/ra_ide_db/src/imports_locator.rs b/crates/ra_ide_db/src/imports_locator.rs index c96351982..bf0d8db60 100644 --- a/crates/ra_ide_db/src/imports_locator.rs +++ b/crates/ra_ide_db/src/imports_locator.rs | |||
@@ -1,7 +1,7 @@ | |||
1 | //! This module contains an import search funcionality that is provided to the ra_assists module. | 1 | //! This module contains an import search funcionality that is provided to the ra_assists module. |
2 | //! Later, this should be moved away to a separate crate that is accessible from the ra_assists module. | 2 | //! Later, this should be moved away to a separate crate that is accessible from the ra_assists module. |
3 | 3 | ||
4 | use hir::{ModuleDef, Semantics}; | 4 | use hir::{MacroDef, ModuleDef, Semantics}; |
5 | use ra_prof::profile; | 5 | use ra_prof::profile; |
6 | use ra_syntax::{ast, AstNode, SyntaxKind::NAME}; | 6 | use ra_syntax::{ast, AstNode, SyntaxKind::NAME}; |
7 | 7 | ||
@@ -10,6 +10,7 @@ use crate::{ | |||
10 | symbol_index::{self, FileSymbol, Query}, | 10 | symbol_index::{self, FileSymbol, Query}, |
11 | RootDatabase, | 11 | RootDatabase, |
12 | }; | 12 | }; |
13 | use either::Either; | ||
13 | 14 | ||
14 | pub struct ImportsLocator<'a> { | 15 | pub struct ImportsLocator<'a> { |
15 | sema: Semantics<'a, RootDatabase>, | 16 | sema: Semantics<'a, RootDatabase>, |
@@ -20,7 +21,7 @@ impl<'a> ImportsLocator<'a> { | |||
20 | Self { sema: Semantics::new(db) } | 21 | Self { sema: Semantics::new(db) } |
21 | } | 22 | } |
22 | 23 | ||
23 | pub fn find_imports(&mut self, name_to_import: &str) -> Vec<ModuleDef> { | 24 | pub fn find_imports(&mut self, name_to_import: &str) -> Vec<Either<ModuleDef, MacroDef>> { |
24 | let _p = profile("search_for_imports"); | 25 | let _p = profile("search_for_imports"); |
25 | let db = self.sema.db; | 26 | let db = self.sema.db; |
26 | 27 | ||
@@ -43,7 +44,8 @@ impl<'a> ImportsLocator<'a> { | |||
43 | .chain(lib_results.into_iter()) | 44 | .chain(lib_results.into_iter()) |
44 | .filter_map(|import_candidate| self.get_name_definition(&import_candidate)) | 45 | .filter_map(|import_candidate| self.get_name_definition(&import_candidate)) |
45 | .filter_map(|name_definition_to_import| match name_definition_to_import { | 46 | .filter_map(|name_definition_to_import| match name_definition_to_import { |
46 | Definition::ModuleDef(module_def) => Some(module_def), | 47 | Definition::ModuleDef(module_def) => Some(Either::Left(module_def)), |
48 | Definition::Macro(macro_def) => Some(Either::Right(macro_def)), | ||
47 | _ => None, | 49 | _ => None, |
48 | }) | 50 | }) |
49 | .collect() | 51 | .collect() |
diff --git a/crates/ra_ide_db/src/search.rs b/crates/ra_ide_db/src/search.rs index cf78d3e41..117454695 100644 --- a/crates/ra_ide_db/src/search.rs +++ b/crates/ra_ide_db/src/search.rs | |||
@@ -10,9 +10,7 @@ use hir::{DefWithBody, HasSource, ModuleSource, Semantics}; | |||
10 | use once_cell::unsync::Lazy; | 10 | use once_cell::unsync::Lazy; |
11 | use ra_db::{FileId, FileRange, SourceDatabaseExt}; | 11 | use ra_db::{FileId, FileRange, SourceDatabaseExt}; |
12 | use ra_prof::profile; | 12 | use ra_prof::profile; |
13 | use ra_syntax::{ | 13 | use ra_syntax::{ast, match_ast, AstNode, TextRange, TextUnit}; |
14 | algo::find_node_at_offset, ast, match_ast, AstNode, TextRange, TextUnit, TokenAtOffset, | ||
15 | }; | ||
16 | use rustc_hash::FxHashMap; | 14 | use rustc_hash::FxHashMap; |
17 | use test_utils::tested_by; | 15 | use test_utils::tested_by; |
18 | 16 | ||
@@ -219,21 +217,11 @@ impl Definition { | |||
219 | continue; | 217 | continue; |
220 | } | 218 | } |
221 | 219 | ||
222 | let name_ref = | 220 | let name_ref: ast::NameRef = |
223 | if let Some(name_ref) = find_node_at_offset::<ast::NameRef>(&tree, offset) { | 221 | if let Some(name_ref) = sema.find_node_at_offset_with_descend(&tree, offset) { |
224 | name_ref | 222 | name_ref |
225 | } else { | 223 | } else { |
226 | // Handle macro token cases | 224 | continue; |
227 | let token = match tree.token_at_offset(offset) { | ||
228 | TokenAtOffset::None => continue, | ||
229 | TokenAtOffset::Single(t) => t, | ||
230 | TokenAtOffset::Between(_, t) => t, | ||
231 | }; | ||
232 | let expanded = sema.descend_into_macros(token); | ||
233 | match ast::NameRef::cast(expanded.parent()) { | ||
234 | Some(name_ref) => name_ref, | ||
235 | _ => continue, | ||
236 | } | ||
237 | }; | 225 | }; |
238 | 226 | ||
239 | // FIXME: reuse sb | 227 | // FIXME: reuse sb |
diff --git a/crates/ra_ide_db/src/symbol_index.rs b/crates/ra_ide_db/src/symbol_index.rs index 884359ee3..0f46f93c1 100644 --- a/crates/ra_ide_db/src/symbol_index.rs +++ b/crates/ra_ide_db/src/symbol_index.rs | |||
@@ -362,6 +362,13 @@ fn to_symbol(node: &SyntaxNode) -> Option<(SmolStr, SyntaxNodePtr, TextRange)> { | |||
362 | ast::TypeAliasDef(it) => { decl(it) }, | 362 | ast::TypeAliasDef(it) => { decl(it) }, |
363 | ast::ConstDef(it) => { decl(it) }, | 363 | ast::ConstDef(it) => { decl(it) }, |
364 | ast::StaticDef(it) => { decl(it) }, | 364 | ast::StaticDef(it) => { decl(it) }, |
365 | ast::MacroCall(it) => { | ||
366 | if it.is_macro_rules().is_some() { | ||
367 | decl(it) | ||
368 | } else { | ||
369 | None | ||
370 | } | ||
371 | }, | ||
365 | _ => None, | 372 | _ => None, |
366 | } | 373 | } |
367 | } | 374 | } |