mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
Make assists use ImportsLocator directly
This commit is contained in:
parent
ff0f0fc31e
commit
a173e31890
6 changed files with 34 additions and 37 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -963,6 +963,7 @@ dependencies = [
|
||||||
"ra_db",
|
"ra_db",
|
||||||
"ra_fmt",
|
"ra_fmt",
|
||||||
"ra_hir",
|
"ra_hir",
|
||||||
|
"ra_ide_db",
|
||||||
"ra_prof",
|
"ra_prof",
|
||||||
"ra_syntax",
|
"ra_syntax",
|
||||||
"ra_text_edit",
|
"ra_text_edit",
|
||||||
|
@ -1165,7 +1166,6 @@ dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"proptest",
|
"proptest",
|
||||||
"ra_assists",
|
|
||||||
"ra_cfg",
|
"ra_cfg",
|
||||||
"ra_db",
|
"ra_db",
|
||||||
"ra_fmt",
|
"ra_fmt",
|
||||||
|
|
|
@ -18,5 +18,6 @@ ra_text_edit = { path = "../ra_text_edit" }
|
||||||
ra_fmt = { path = "../ra_fmt" }
|
ra_fmt = { path = "../ra_fmt" }
|
||||||
ra_prof = { path = "../ra_prof" }
|
ra_prof = { path = "../ra_prof" }
|
||||||
ra_db = { path = "../ra_db" }
|
ra_db = { path = "../ra_db" }
|
||||||
|
ra_ide_db = { path = "../ra_ide_db" }
|
||||||
hir = { path = "../ra_hir", package = "ra_hir" }
|
hir = { path = "../ra_hir", package = "ra_hir" }
|
||||||
test_utils = { path = "../test_utils" }
|
test_utils = { path = "../test_utils" }
|
||||||
|
|
|
@ -16,6 +16,7 @@ pub mod ast_transform;
|
||||||
use either::Either;
|
use either::Either;
|
||||||
use hir::{db::HirDatabase, ModuleDef};
|
use hir::{db::HirDatabase, ModuleDef};
|
||||||
use ra_db::FileRange;
|
use ra_db::FileRange;
|
||||||
|
use ra_ide_db::{imports_locator::ImportsLocatorIde, RootDatabase};
|
||||||
use ra_syntax::{TextRange, TextUnit};
|
use ra_syntax::{TextRange, TextUnit};
|
||||||
use ra_text_edit::TextEdit;
|
use ra_text_edit::TextEdit;
|
||||||
|
|
||||||
|
@ -88,20 +89,19 @@ pub trait ImportsLocator {
|
||||||
fn find_imports(&mut self, name_to_import: &str) -> Vec<ModuleDef>;
|
fn find_imports(&mut self, name_to_import: &str) -> Vec<ModuleDef>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ImportsLocator for ImportsLocatorIde<'_> {
|
||||||
|
fn find_imports(&mut self, name_to_import: &str) -> Vec<ModuleDef> {
|
||||||
|
self.find_imports(name_to_import)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Return all the assists applicable at the given position
|
/// Return all the assists applicable at the given position
|
||||||
/// and additional assists that need the imports locator functionality to work.
|
/// and additional assists that need the imports locator functionality to work.
|
||||||
///
|
///
|
||||||
/// Assists are returned in the "resolved" state, that is with edit fully
|
/// Assists are returned in the "resolved" state, that is with edit fully
|
||||||
/// computed.
|
/// computed.
|
||||||
pub fn assists_with_imports_locator<H, F>(
|
pub fn assists_with_imports_locator(db: &RootDatabase, range: FileRange) -> Vec<ResolvedAssist> {
|
||||||
db: &H,
|
let mut imports_locator = ImportsLocatorIde::new(db);
|
||||||
range: FileRange,
|
|
||||||
mut imports_locator: F,
|
|
||||||
) -> Vec<ResolvedAssist>
|
|
||||||
where
|
|
||||||
H: HirDatabase + 'static,
|
|
||||||
F: ImportsLocator,
|
|
||||||
{
|
|
||||||
AssistCtx::with_ctx(db, range, true, |ctx| {
|
AssistCtx::with_ctx(db, range, true, |ctx| {
|
||||||
let mut assists = assists::all()
|
let mut assists = assists::all()
|
||||||
.iter()
|
.iter()
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
use either::Either;
|
use either::Either;
|
||||||
use ra_assists::{AssistAction, AssistLabel};
|
use ra_assists::{AssistAction, AssistLabel};
|
||||||
use ra_db::{FilePosition, FileRange};
|
use ra_db::{FilePosition, FileRange};
|
||||||
use ra_ide_db::{imports_locator::ImportsLocatorIde, RootDatabase};
|
use ra_ide_db::RootDatabase;
|
||||||
|
|
||||||
use crate::{FileId, SourceChange, SourceFileEdit};
|
use crate::{FileId, SourceChange, SourceFileEdit};
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ pub struct Assist {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn assists(db: &RootDatabase, frange: FileRange) -> Vec<Assist> {
|
pub(crate) fn assists(db: &RootDatabase, frange: FileRange) -> Vec<Assist> {
|
||||||
ra_assists::assists_with_imports_locator(db, frange, ImportsLocatorIde::new(db))
|
ra_assists::assists_with_imports_locator(db, frange)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|assist| {
|
.map(|assist| {
|
||||||
let file_id = frange.file_id;
|
let file_id = frange.file_id;
|
||||||
|
|
|
@ -32,7 +32,6 @@ ra_cfg = { path = "../ra_cfg" }
|
||||||
ra_fmt = { path = "../ra_fmt" }
|
ra_fmt = { path = "../ra_fmt" }
|
||||||
ra_prof = { path = "../ra_prof" }
|
ra_prof = { path = "../ra_prof" }
|
||||||
test_utils = { path = "../test_utils" }
|
test_utils = { path = "../test_utils" }
|
||||||
ra_assists = { path = "../ra_assists" }
|
|
||||||
|
|
||||||
# ra_ide should depend only on the top-level `hir` package. if you need
|
# ra_ide should depend only on the top-level `hir` package. if you need
|
||||||
# something from some `hir_xxx` subpackage, reexport the API via `hir`.
|
# something from some `hir_xxx` subpackage, reexport the API via `hir`.
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
//! Later, this should be moved away to a separate crate that is accessible from the ra_assists module.
|
//! Later, this should be moved away to a separate crate that is accessible from the ra_assists module.
|
||||||
|
|
||||||
use hir::{db::HirDatabase, ModuleDef, SourceBinder};
|
use hir::{db::HirDatabase, ModuleDef, SourceBinder};
|
||||||
use ra_assists::ImportsLocator;
|
|
||||||
use ra_prof::profile;
|
use ra_prof::profile;
|
||||||
use ra_syntax::{ast, AstNode, SyntaxKind::NAME};
|
use ra_syntax::{ast, AstNode, SyntaxKind::NAME};
|
||||||
|
|
||||||
|
@ -22,29 +21,7 @@ impl<'a> ImportsLocatorIde<'a> {
|
||||||
Self { source_binder: SourceBinder::new(db) }
|
Self { source_binder: SourceBinder::new(db) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_name_definition(
|
pub fn find_imports(&mut self, name_to_import: &str) -> Vec<ModuleDef> {
|
||||||
&mut self,
|
|
||||||
db: &impl HirDatabase,
|
|
||||||
import_candidate: &FileSymbol,
|
|
||||||
) -> Option<NameKind> {
|
|
||||||
let _p = profile("get_name_definition");
|
|
||||||
let file_id = import_candidate.file_id.into();
|
|
||||||
let candidate_node = import_candidate.ptr.to_node(&db.parse_or_expand(file_id)?);
|
|
||||||
let candidate_name_node = if candidate_node.kind() != NAME {
|
|
||||||
candidate_node.children().find(|it| it.kind() == NAME)?
|
|
||||||
} else {
|
|
||||||
candidate_node
|
|
||||||
};
|
|
||||||
classify_name(
|
|
||||||
&mut self.source_binder,
|
|
||||||
hir::InFile { file_id, value: &ast::Name::cast(candidate_name_node)? },
|
|
||||||
)
|
|
||||||
.map(|it| it.kind)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ImportsLocator for ImportsLocatorIde<'_> {
|
|
||||||
fn find_imports(&mut self, name_to_import: &str) -> Vec<ModuleDef> {
|
|
||||||
let _p = profile("search_for_imports");
|
let _p = profile("search_for_imports");
|
||||||
let db = self.source_binder.db;
|
let db = self.source_binder.db;
|
||||||
|
|
||||||
|
@ -72,4 +49,24 @@ impl ImportsLocator for ImportsLocatorIde<'_> {
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_name_definition(
|
||||||
|
&mut self,
|
||||||
|
db: &impl HirDatabase,
|
||||||
|
import_candidate: &FileSymbol,
|
||||||
|
) -> Option<NameKind> {
|
||||||
|
let _p = profile("get_name_definition");
|
||||||
|
let file_id = import_candidate.file_id.into();
|
||||||
|
let candidate_node = import_candidate.ptr.to_node(&db.parse_or_expand(file_id)?);
|
||||||
|
let candidate_name_node = if candidate_node.kind() != NAME {
|
||||||
|
candidate_node.children().find(|it| it.kind() == NAME)?
|
||||||
|
} else {
|
||||||
|
candidate_node
|
||||||
|
};
|
||||||
|
classify_name(
|
||||||
|
&mut self.source_binder,
|
||||||
|
hir::InFile { file_id, value: &ast::Name::cast(candidate_name_node)? },
|
||||||
|
)
|
||||||
|
.map(|it| it.kind)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue