Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide/src/highlight_related.rs13
-rw-r--r--crates/ide_db/src/search.rs31
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<FileId, Option<TextRange>>,
}
@@ -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);