mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
Limit import map queries
This commit is contained in:
parent
bcf875f46a
commit
56c7145993
2 changed files with 51 additions and 7 deletions
|
@ -104,12 +104,16 @@ impl Crate {
|
|||
db: &dyn DefDatabase,
|
||||
query: &str,
|
||||
) -> impl Iterator<Item = Either<ModuleDef, MacroDef>> {
|
||||
import_map::search_dependencies(db, self.into(), import_map::Query::new(query).anchor_end())
|
||||
.into_iter()
|
||||
.map(|item| match item {
|
||||
ItemInNs::Types(mod_id) | ItemInNs::Values(mod_id) => Either::Left(mod_id.into()),
|
||||
ItemInNs::Macros(mac_id) => Either::Right(mac_id.into()),
|
||||
})
|
||||
import_map::search_dependencies(
|
||||
db,
|
||||
self.into(),
|
||||
import_map::Query::new(query).anchor_end().limit(40),
|
||||
)
|
||||
.into_iter()
|
||||
.map(|item| match item {
|
||||
ItemInNs::Types(mod_id) | ItemInNs::Values(mod_id) => Either::Left(mod_id.into()),
|
||||
ItemInNs::Macros(mac_id) => Either::Right(mac_id.into()),
|
||||
})
|
||||
}
|
||||
|
||||
pub fn all(db: &dyn HirDatabase) -> Vec<Crate> {
|
||||
|
|
|
@ -178,11 +178,12 @@ fn cmp((_, lhs): &(&ItemInNs, &ModPath), (_, rhs): &(&ItemInNs, &ModPath)) -> Or
|
|||
pub struct Query {
|
||||
query: String,
|
||||
anchor_end: bool,
|
||||
limit: usize,
|
||||
}
|
||||
|
||||
impl Query {
|
||||
pub fn new(query: &str) -> Self {
|
||||
Self { query: query.to_lowercase(), anchor_end: false }
|
||||
Self { query: query.to_lowercase(), anchor_end: false, limit: usize::max_value() }
|
||||
}
|
||||
|
||||
/// Only returns items whose paths end with the (case-insensitive) query string as their last
|
||||
|
@ -190,6 +191,11 @@ impl Query {
|
|||
pub fn anchor_end(self) -> Self {
|
||||
Self { anchor_end: true, ..self }
|
||||
}
|
||||
|
||||
/// Limits the returned number of items to `limit`.
|
||||
pub fn limit(self, limit: usize) -> Self {
|
||||
Self { limit, ..self }
|
||||
}
|
||||
}
|
||||
|
||||
/// Searches dependencies of `krate` for an importable path matching `query`.
|
||||
|
@ -237,6 +243,11 @@ pub fn search_dependencies<'a>(
|
|||
let item_path = &import_map.map[item];
|
||||
fst_path(item_path) == fst_path(path)
|
||||
}));
|
||||
|
||||
if res.len() >= query.limit {
|
||||
res.truncate(query.limit);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -570,4 +581,33 @@ mod tests {
|
|||
dep::Fmt (m)
|
||||
"###);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn search_limit() {
|
||||
let res = search_dependencies_of(
|
||||
r#"
|
||||
//- /main.rs crate:main deps:dep
|
||||
//- /dep.rs crate:dep
|
||||
pub mod fmt {
|
||||
pub trait Display {
|
||||
fn fmt();
|
||||
}
|
||||
}
|
||||
#[macro_export]
|
||||
macro_rules! Fmt {
|
||||
() => {};
|
||||
}
|
||||
pub struct Fmt;
|
||||
|
||||
pub fn format() {}
|
||||
pub fn no() {}
|
||||
"#,
|
||||
"main",
|
||||
Query::new("").limit(2),
|
||||
);
|
||||
assert_snapshot!(res, @r###"
|
||||
dep::fmt (t)
|
||||
dep::Fmt (t)
|
||||
"###);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue