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
15 changes: 13 additions & 2 deletions crates/ide-db/src/search.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use std::{mem, sync::Arc};
use base_db::{FileId, FileRange, SourceDatabase, SourceDatabaseExt};
use hir::{DefWithBody, HasAttrs, HasSource, InFile, ModuleSource, Semantics, Visibility};
use once_cell::unsync::Lazy;
use parser::SyntaxKind;
use stdx::hash::NoHashHashMap;
use syntax::{ast, match_ast, AstNode, TextRange, TextSize};

Expand Down Expand Up @@ -67,6 +68,7 @@ pub enum ReferenceCategory {
// Create
Write,
Read,
Import,
// FIXME: Some day should be able to search in doc comments. Would probably
// need to switch from enum to bitflags then?
// DocComment
Expand Down Expand Up @@ -577,7 +579,7 @@ impl<'a> FindUsages<'a> {
let reference = FileReference {
range,
name: ast::NameLike::NameRef(name_ref.clone()),
category: None,
category: is_name_ref_in_import(name_ref).then(|| ReferenceCategory::Import),
};
sink(file_id, reference)
}
Expand Down Expand Up @@ -756,7 +758,7 @@ impl ReferenceCategory {
fn new(def: &Definition, r: &ast::NameRef) -> Option<ReferenceCategory> {
// Only Locals and Fields have accesses for now.
if !matches!(def, Definition::Local(_) | Definition::Field(_)) {
return None;
return is_name_ref_in_import(r).then(|| ReferenceCategory::Import);
}

let mode = r.syntax().ancestors().find_map(|node| {
Expand All @@ -783,3 +785,12 @@ impl ReferenceCategory {
mode.or(Some(ReferenceCategory::Read))
}
}

fn is_name_ref_in_import(name_ref: &ast::NameRef) -> bool {
name_ref
.syntax()
.parent()
.and_then(ast::PathSegment::cast)
.and_then(|it| it.parent_path().top_path().syntax().parent())
.map_or(false, |it| it.kind() == SyntaxKind::USE_TREE)
}
1 change: 0 additions & 1 deletion crates/ide/src/annotations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,6 @@ pub(crate) fn resolve_annotation(db: &RootDatabase, mut annotation: Annotation)
&Semantics::new(db),
FilePosition { file_id, offset: annotation.range.start() },
None,
false,
)
.map(|result| {
result
Expand Down
11 changes: 6 additions & 5 deletions crates/ide/src/highlight_related.rs
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,7 @@ mod tests {
match it {
ReferenceCategory::Read => "read",
ReferenceCategory::Write => "write",
ReferenceCategory::Import => "import",
}
.to_string()
}),
Expand Down Expand Up @@ -423,20 +424,20 @@ struct Foo;
check(
r#"
use crate$0;
//^^^^^
//^^^^^ import
use self;
//^^^^
//^^^^ import
mod __ {
use super;
//^^^^^
//^^^^^ import
}
"#,
);
check(
r#"
//- /main.rs crate:main deps:lib
use lib$0;
//^^^
//^^^ import
//- /lib.rs crate:lib
"#,
);
Expand All @@ -450,7 +451,7 @@ use lib$0;
mod foo;
//- /foo.rs
use self$0;
// ^^^^
// ^^^^ import
"#,
);
}
Expand Down
5 changes: 1 addition & 4 deletions crates/ide/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -425,11 +425,8 @@ impl Analysis {
&self,
position: FilePosition,
search_scope: Option<SearchScope>,
exclude_imports: bool,
) -> Cancellable<Option<Vec<ReferenceSearchResult>>> {
self.with_db(|db| {
references::find_all_refs(&Semantics::new(db), position, search_scope, exclude_imports)
})
self.with_db(|db| references::find_all_refs(&Semantics::new(db), position, search_scope))
}

/// Finds all methods and free functions for the file. Does not return tests!
Expand Down
38 changes: 11 additions & 27 deletions crates/ide/src/references.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ pub(crate) fn find_all_refs(
sema: &Semantics<'_, RootDatabase>,
position: FilePosition,
search_scope: Option<SearchScope>,
exclude_imports: bool,
) -> Option<Vec<ReferenceSearchResult>> {
let _p = profile::span("find_all_refs");
let syntax = sema.parse(position.file_id).syntax().clone();
Expand All @@ -80,10 +79,6 @@ pub(crate) fn find_all_refs(
retain_adt_literal_usages(&mut usages, def, sema);
}

if exclude_imports {
filter_import_references(&mut usages);
}

let references = usages
.into_iter()
.map(|(file_id, refs)| {
Expand Down Expand Up @@ -117,17 +112,6 @@ pub(crate) fn find_all_refs(
}
}

fn filter_import_references(usages: &mut UsageSearchResult) {
for (_file_id, refs) in &mut usages.references {
refs.retain(|it| match it.name.as_name_ref() {
Some(name_ref) => {
!name_ref.syntax().ancestors().any(|it_ref| matches!(it_ref.kind(), USE))
}
None => true,
});
}
}

pub(crate) fn find_defs<'a>(
sema: &'a Semantics<'_, RootDatabase>,
syntax: &SyntaxNode,
Expand Down Expand Up @@ -758,7 +742,7 @@ pub struct Foo {
expect![[r#"
foo Module FileId(0) 0..8 4..7

FileId(0) 14..17
FileId(0) 14..17 Import
"#]],
);
}
Expand All @@ -776,7 +760,7 @@ use self$0;
expect![[r#"
foo Module FileId(0) 0..8 4..7

FileId(1) 4..8
FileId(1) 4..8 Import
"#]],
);
}
Expand All @@ -791,7 +775,7 @@ use self$0;
expect![[r#"
Module FileId(0) 0..10

FileId(0) 4..8
FileId(0) 4..8 Import
"#]],
);
}
Expand Down Expand Up @@ -819,7 +803,7 @@ pub(super) struct Foo$0 {
expect![[r#"
Foo Struct FileId(2) 0..41 18..21

FileId(1) 20..23
FileId(1) 20..23 Import
FileId(1) 47..50
"#]],
);
Expand Down Expand Up @@ -982,7 +966,7 @@ fn g() { f(); }
expect![[r#"
f Function FileId(0) 22..31 25..26

FileId(1) 11..12
FileId(1) 11..12 Import
FileId(1) 24..25
"#]],
);
Expand Down Expand Up @@ -1110,7 +1094,7 @@ impl Foo {

fn check_with_scope(ra_fixture: &str, search_scope: Option<SearchScope>, expect: Expect) {
let (analysis, pos) = fixture::position(ra_fixture);
let refs = analysis.find_all_refs(pos, search_scope, false).unwrap().unwrap();
let refs = analysis.find_all_refs(pos, search_scope).unwrap().unwrap();

let mut actual = String::new();
for refs in refs {
Expand Down Expand Up @@ -1440,9 +1424,9 @@ pub use level1::Foo;
expect![[r#"
Foo Struct FileId(0) 0..15 11..14

FileId(1) 16..19
FileId(2) 16..19
FileId(3) 16..19
FileId(1) 16..19 Import
FileId(2) 16..19 Import
FileId(3) 16..19 Import
"#]],
);
}
Expand Down Expand Up @@ -1470,7 +1454,7 @@ lib::foo!();
expect![[r#"
foo Macro FileId(1) 0..61 29..32

FileId(0) 46..49
FileId(0) 46..49 Import
FileId(2) 0..3
FileId(3) 5..8
"#]],
Expand Down Expand Up @@ -1633,7 +1617,7 @@ struct Foo;
expect![[r#"
derive_identity Derive FileId(2) 1..107 45..60

FileId(0) 17..31
FileId(0) 17..31 Import
FileId(0) 56..70
"#]],
);
Expand Down
18 changes: 10 additions & 8 deletions crates/rust-analyzer/src/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ use std::{
use anyhow::Context;
use ide::{
AnnotationConfig, AssistKind, AssistResolveStrategy, FileId, FilePosition, FileRange,
HoverAction, HoverGotoTypeData, Query, RangeInfo, Runnable, RunnableKind, SingleResolve,
SourceChange, TextEdit,
HoverAction, HoverGotoTypeData, Query, RangeInfo, ReferenceCategory, Runnable, RunnableKind,
SingleResolve, SourceChange, TextEdit,
};
use ide_db::SymbolKind;
use lsp_server::ErrorCode;
Expand Down Expand Up @@ -1014,7 +1014,7 @@ pub(crate) fn handle_references(

let exclude_imports = snap.config.find_all_refs_exclude_imports();

let refs = match snap.analysis.find_all_refs(position, None, exclude_imports)? {
let refs = match snap.analysis.find_all_refs(position, None)? {
None => return Ok(None),
Some(refs) => refs,
};
Expand All @@ -1034,7 +1034,11 @@ pub(crate) fn handle_references(
refs.references
.into_iter()
.flat_map(|(file_id, refs)| {
refs.into_iter().map(move |(range, _)| FileRange { file_id, range })
refs.into_iter()
.filter(|&(_, category)| {
!exclude_imports || category != Some(ReferenceCategory::Import)
})
.map(move |(range, _)| FileRange { file_id, range })
})
.chain(decl)
})
Expand Down Expand Up @@ -1285,7 +1289,7 @@ pub(crate) fn handle_document_highlight(
.into_iter()
.map(|ide::HighlightedRange { range, category }| lsp_types::DocumentHighlight {
range: to_proto::range(&line_index, range),
kind: category.map(to_proto::document_highlight_kind),
kind: category.and_then(to_proto::document_highlight_kind),
})
.collect();
Ok(Some(res))
Expand Down Expand Up @@ -1654,9 +1658,7 @@ fn show_ref_command_link(
position: &FilePosition,
) -> Option<lsp_ext::CommandLinkGroup> {
if snap.config.hover_actions().references && snap.config.client_commands().show_reference {
if let Some(ref_search_res) =
snap.analysis.find_all_refs(*position, None, false).unwrap_or(None)
{
if let Some(ref_search_res) = snap.analysis.find_all_refs(*position, None).unwrap_or(None) {
let uri = to_proto::url(snap, position.file_id);
let line_index = snap.file_line_index(position.file_id).ok()?;
let position = to_proto::position(&line_index, position.offset);
Expand Down
7 changes: 4 additions & 3 deletions crates/rust-analyzer/src/to_proto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,11 @@ pub(crate) fn structure_node_kind(kind: StructureNodeKind) -> lsp_types::SymbolK

pub(crate) fn document_highlight_kind(
category: ReferenceCategory,
) -> lsp_types::DocumentHighlightKind {
) -> Option<lsp_types::DocumentHighlightKind> {
match category {
ReferenceCategory::Read => lsp_types::DocumentHighlightKind::READ,
ReferenceCategory::Write => lsp_types::DocumentHighlightKind::WRITE,
ReferenceCategory::Read => Some(lsp_types::DocumentHighlightKind::READ),
ReferenceCategory::Write => Some(lsp_types::DocumentHighlightKind::WRITE),
ReferenceCategory::Import => None,
}
}

Expand Down