Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Filter imports on find-all-references #13186

Merged
merged 12 commits into from
Sep 12, 2022
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
1 change: 1 addition & 0 deletions crates/ide/src/annotations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ 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
5 changes: 4 additions & 1 deletion crates/ide/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -425,8 +425,11 @@ 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))
self.with_db(|db| {
references::find_all_refs(&Semantics::new(db), position, search_scope, exclude_imports)
})
}

/// Finds all methods and free functions for the file. Does not return tests!
Expand Down
18 changes: 17 additions & 1 deletion crates/ide/src/references.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ 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 @@ -79,6 +80,10 @@ 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 @@ -112,6 +117,17 @@ 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 @@ -1094,7 +1110,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).unwrap().unwrap();
let refs = analysis.find_all_refs(pos, search_scope, false).unwrap().unwrap();

let mut actual = String::new();
for refs in refs {
Expand Down
8 changes: 7 additions & 1 deletion crates/rust-analyzer/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,6 @@ config_data! {
files_excludeDirs: Vec<PathBuf> = "[]",
/// Controls file watching implementation.
files_watcher: FilesWatcherDef = "\"client\"",

/// Enables highlighting of related references while the cursor is on `break`, `loop`, `while`, or `for` keywords.
highlightRelated_breakPoints_enable: bool = "true",
/// Enables highlighting of all exit points while the cursor is on any `return`, `?`, `fn`, or return type arrow (`->`).
Expand Down Expand Up @@ -359,6 +358,9 @@ config_data! {
/// this is rust-analyzer itself, but we override this in tests).
procMacro_server: Option<PathBuf> = "null",

/// Exclude imports from find-all-references.
references_excludeImports: bool = "false",

/// Command to be executed instead of 'cargo' for runnables.
runnables_command: Option<String> = "null",
/// Additional arguments to be passed to cargo for runnables such as
Expand Down Expand Up @@ -1147,6 +1149,10 @@ impl Config {
}
}

pub fn find_all_refs_exclude_imports(&self) -> bool {
self.data.references_excludeImports
}

pub fn snippet_cap(&self) -> bool {
self.experimental("snippetTextEdit")
}
Expand Down
8 changes: 6 additions & 2 deletions crates/rust-analyzer/src/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1012,7 +1012,9 @@ pub(crate) fn handle_references(
let _p = profile::span("handle_references");
let position = from_proto::file_position(&snap, params.text_document_position)?;

let refs = match snap.analysis.find_all_refs(position, None)? {
let exclude_imports = snap.config.find_all_refs_exclude_imports();

let refs = match snap.analysis.find_all_refs(position, None, exclude_imports)? {
None => return Ok(None),
Some(refs) => refs,
};
Expand Down Expand Up @@ -1652,7 +1654,9 @@ 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).unwrap_or(None) {
if let Some(ref_search_res) =
snap.analysis.find_all_refs(*position, None, false).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
5 changes: 5 additions & 0 deletions docs/user/generated_config.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,11 @@ This config takes a map of crate names with the exported proc-macro names to ign
Internal config, path to proc-macro server executable (typically,
this is rust-analyzer itself, but we override this in tests).
--
[[rust-analyzer.references.excludeImports]]rust-analyzer.references.excludeImports (default: `false`)::
+
--
Exclude imports from find-all-references.
--
[[rust-analyzer.runnables.command]]rust-analyzer.runnables.command (default: `null`)::
+
--
Expand Down
5 changes: 5 additions & 0 deletions editors/code/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -1036,6 +1036,11 @@
"string"
]
},
"rust-analyzer.references.excludeImports": {
"markdownDescription": "Exclude imports from find-all-references.",
"default": false,
"type": "boolean"
},
"rust-analyzer.runnables.command": {
"markdownDescription": "Command to be executed instead of 'cargo' for runnables.",
"default": null,
Expand Down