Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions crates/ide/src/highlight_related.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -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,
})?;

Expand All @@ -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()
Expand Down
31 changes: 24 additions & 7 deletions crates/ide_db/src/search.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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>>,
}
Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -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);
Expand Down