From e2ede38d479a1b8e2b739bcb4c478d1e857e6cec Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Thu, 2 Sep 2021 17:30:02 +0200 Subject: [PATCH] Use correct search scopes for macros --- crates/ide/src/highlight_related.rs | 13 +++++++----- crates/ide_db/src/search.rs | 31 ++++++++++++++++++++++------- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/crates/ide/src/highlight_related.rs b/crates/ide/src/highlight_related.rs index 67ad263fa2..6994e41c8a 100644 --- a/crates/ide/src/highlight_related.rs +++ b/crates/ide/src/highlight_related.rs @@ -9,7 +9,9 @@ use ide_db::{ use rustc_hash::FxHashSet; use syntax::{ ast::{self, LoopBodyOwner}, - match_ast, AstNode, SyntaxNode, SyntaxToken, TextRange, TextSize, T, + match_ast, AstNode, + SyntaxKind::IDENT, + SyntaxNode, SyntaxToken, TextRange, TextSize, T, }; use crate::{display::TryToNav, references, NavigationTarget}; @@ -46,9 +48,10 @@ pub(crate) fn highlight_related( let syntax = sema.parse(position.file_id).syntax().clone(); let token = pick_best_token(syntax.token_at_offset(position.offset), |kind| match kind { - T![?] => 3, // prefer `?` when the cursor is sandwiched like in `await$0?` - T![->] => 2, - kind if kind.is_keyword() => 1, + T![?] => 4, // prefer `?` when the cursor is sandwiched like in `await$0?` + T![->] => 3, + kind if kind.is_keyword() => 2, + IDENT => 1, _ => 0, })?; @@ -75,7 +78,7 @@ fn highlight_references( let defs = find_defs(sema, syntax, offset); let usages = defs .iter() - .flat_map(|&d| { + .filter_map(|&d| { d.usages(sema) .set_scope(Some(SearchScope::single_file(file_id))) .include_self_refs() diff --git a/crates/ide_db/src/search.rs b/crates/ide_db/src/search.rs index 14c896cdd0..8b8c91b2fc 100644 --- a/crates/ide_db/src/search.rs +++ b/crates/ide_db/src/search.rs @@ -71,7 +71,7 @@ pub enum ReferenceAccess { /// For `pub(crate)` things it's a crate, for `pub` things it's a crate and dependant crates. /// In some cases, the location of the references is known to within a `TextRange`, /// e.g. for things like local variables. -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct SearchScope { entries: FxHashMap>, } @@ -216,6 +216,14 @@ impl Definition { return SearchScope::crate_graph(db); } + // def is crate root + // FIXME: We don't do searches for crates currently, as a crate does not actually have a single name + if let &Definition::ModuleDef(hir::ModuleDef::Module(module)) = self { + if module.crate_root(db) == module { + return SearchScope::reverse_dependencies(db, module.krate()); + } + } + let module = match self.module(db) { Some(it) => it, None => return SearchScope::empty(), @@ -273,13 +281,22 @@ impl Definition { } if let Definition::Macro(macro_def) = self { - if macro_def.kind() == hir::MacroKind::Declarative { - return if macro_def.attrs(db).by_key("macro_export").exists() { + return match macro_def.kind() { + hir::MacroKind::Declarative => { + if macro_def.attrs(db).by_key("macro_export").exists() { + SearchScope::reverse_dependencies(db, module.krate()) + } else { + SearchScope::krate(db, module.krate()) + } + } + hir::MacroKind::BuiltIn => SearchScope::crate_graph(db), + // FIXME: We don't actually see derives in derive attributes as these do not + // expand to something that references the derive macro in the output. + // We could get around this by emitting dummy `use DeriveMacroPathHere as _;` items maybe? + hir::MacroKind::Derive | hir::MacroKind::Attr | hir::MacroKind::ProcMacro => { SearchScope::reverse_dependencies(db, module.krate()) - } else { - SearchScope::krate(db, module.krate()) - }; - } + } + }; } let vis = self.visibility(db);