Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/import_map.rs')
-rw-r--r--crates/hir-def/src/import_map.rs104
1 files changed, 55 insertions, 49 deletions
diff --git a/crates/hir-def/src/import_map.rs b/crates/hir-def/src/import_map.rs
index d43776b8a6..db571f045d 100644
--- a/crates/hir-def/src/import_map.rs
+++ b/crates/hir-def/src/import_map.rs
@@ -2,22 +2,22 @@
use std::fmt;
-use base_db::CrateId;
-use fst::{raw::IndexedValue, Automaton, Streamer};
+use base_db::Crate;
+use fst::{Automaton, Streamer, raw::IndexedValue};
use hir_expand::name::Name;
use itertools::Itertools;
use rustc_hash::FxHashSet;
use smallvec::SmallVec;
use span::Edition;
-use stdx::{format_to, TupleExt};
+use stdx::format_to;
use triomphe::Arc;
use crate::{
+ AssocItemId, AttrDefId, Complete, FxIndexMap, ModuleDefId, ModuleId, TraitId,
db::DefDatabase,
item_scope::{ImportOrExternCrate, ItemInNs},
nameres::DefMap,
visibility::Visibility,
- AssocItemId, FxIndexMap, ModuleDefId, ModuleId, TraitId,
};
/// Item import details stored in the `ImportMap`.
@@ -31,6 +31,8 @@ pub struct ImportInfo {
pub is_doc_hidden: bool,
/// Whether this item is annotated with `#[unstable(..)]`.
pub is_unstable: bool,
+ /// The value of `#[rust_analyzer::completions(...)]`, if exists.
+ pub complete: Complete,
}
/// A map from publicly exported items to its name.
@@ -66,19 +68,14 @@ impl ImportMap {
for (k, v) in self.item_to_info_map.iter() {
format_to!(out, "{:?} ({:?}) -> ", k, v.1);
for v in &v.0 {
- format_to!(
- out,
- "{}:{:?}, ",
- v.name.display(db.upcast(), Edition::CURRENT),
- v.container
- );
+ format_to!(out, "{}:{:?}, ", v.name.display(db, Edition::CURRENT), v.container);
}
format_to!(out, "\n");
}
out
}
- pub(crate) fn import_map_query(db: &dyn DefDatabase, krate: CrateId) -> Arc<Self> {
+ pub(crate) fn import_map_query(db: &dyn DefDatabase, krate: Crate) -> Arc<Self> {
let _p = tracing::info_span!("import_map_query").entered();
let map = Self::collect_import_map(db, krate);
@@ -129,7 +126,7 @@ impl ImportMap {
self.item_to_info_map.get(&item).map(|(info, _)| &**info)
}
- fn collect_import_map(db: &dyn DefDatabase, krate: CrateId) -> ImportMapIndex {
+ fn collect_import_map(db: &dyn DefDatabase, krate: Crate) -> ImportMapIndex {
let _p = tracing::info_span!("collect_import_map").entered();
let def_map = db.crate_def_map(krate);
@@ -155,11 +152,7 @@ impl ImportMap {
let visible_items = mod_data.scope.entries().filter_map(|(name, per_ns)| {
let per_ns = per_ns.filter_visibility(|vis| vis == Visibility::Public);
- if per_ns.is_none() {
- None
- } else {
- Some((name, per_ns))
- }
+ if per_ns.is_none() { None } else { Some((name, per_ns)) }
});
for (name, per_ns) in visible_items {
@@ -176,16 +169,22 @@ impl ImportMap {
ItemInNs::Macros(id) => Some(id.into()),
}
};
- let (is_doc_hidden, is_unstable) = attr_id.map_or((false, false), |attr_id| {
- let attrs = db.attrs(attr_id);
- (attrs.has_doc_hidden(), attrs.is_unstable())
- });
+ let (is_doc_hidden, is_unstable, do_not_complete) = match attr_id {
+ None => (false, false, Complete::Yes),
+ Some(attr_id) => {
+ let attrs = db.attrs(attr_id);
+ let do_not_complete =
+ Complete::extract(matches!(attr_id, AttrDefId::TraitId(_)), &attrs);
+ (attrs.has_doc_hidden(), attrs.is_unstable(), do_not_complete)
+ }
+ };
let import_info = ImportInfo {
name: name.clone(),
container: module,
is_doc_hidden,
is_unstable,
+ complete: do_not_complete,
};
if let Some(ModuleDefId::TraitId(tr)) = item.as_module_def_id() {
@@ -222,7 +221,7 @@ impl ImportMap {
trait_import_info: &ImportInfo,
) {
let _p = tracing::info_span!("collect_trait_assoc_items").entered();
- for &(ref assoc_item_name, item) in &db.trait_data(tr).items {
+ for &(ref assoc_item_name, item) in &db.trait_items(tr).items {
let module_def_id = match item {
AssocItemId::FunctionId(f) => ModuleDefId::from(f),
AssocItemId::ConstId(c) => ModuleDefId::from(c),
@@ -239,12 +238,17 @@ impl ImportMap {
ItemInNs::Values(module_def_id)
};
- let attrs = &db.attrs(item.into());
+ let attr_id = item.into();
+ let attrs = &db.attrs(attr_id);
+ let item_do_not_complete = Complete::extract(false, attrs);
+ let do_not_complete =
+ Complete::for_trait_item(trait_import_info.complete, item_do_not_complete);
let assoc_item_info = ImportInfo {
container: trait_import_info.container,
name: assoc_item_name.clone(),
is_doc_hidden: attrs.has_doc_hidden(),
is_unstable: attrs.is_unstable(),
+ complete: do_not_complete,
};
let (infos, _) =
@@ -400,15 +404,13 @@ impl Query {
/// This returns a list of items that could be imported from dependencies of `krate`.
pub fn search_dependencies(
db: &dyn DefDatabase,
- krate: CrateId,
+ krate: Crate,
query: &Query,
-) -> FxHashSet<ItemInNs> {
+) -> FxHashSet<(ItemInNs, Complete)> {
let _p = tracing::info_span!("search_dependencies", ?query).entered();
- let graph = db.crate_graph();
-
let import_maps: Vec<_> =
- graph[krate].dependencies.iter().map(|dep| db.import_map(dep.crate_id)).collect();
+ krate.data(db).dependencies.iter().map(|dep| db.import_map(dep.crate_id)).collect();
let mut op = fst::map::OpBuilder::new();
@@ -445,7 +447,7 @@ fn search_maps(
import_maps: &[Arc<ImportMap>],
mut stream: fst::map::Union<'_>,
query: &Query,
-) -> FxHashSet<ItemInNs> {
+) -> FxHashSet<(ItemInNs, Complete)> {
let mut res = FxHashSet::default();
while let Some((_, indexed_values)) = stream.next() {
for &IndexedValue { index: import_map_idx, value } in indexed_values {
@@ -465,8 +467,9 @@ fn search_maps(
})
.filter(|&(_, info)| {
query.search_mode.check(&query.query, query.case_sensitive, info.name.as_str())
- });
- res.extend(iter.map(TupleExt::head));
+ })
+ .map(|(item, import_info)| (item, import_info.complete));
+ res.extend(iter);
}
}
@@ -475,11 +478,11 @@ fn search_maps(
#[cfg(test)]
mod tests {
- use base_db::{SourceDatabase, Upcast};
- use expect_test::{expect, Expect};
+ use base_db::RootQueryDb;
+ use expect_test::{Expect, expect};
use test_fixture::WithFixture;
- use crate::{test_db::TestDB, ItemContainerId, Lookup};
+ use crate::{ItemContainerId, Lookup, test_db::TestDB};
use super::*;
@@ -512,21 +515,23 @@ mod tests {
expect: Expect,
) {
let db = TestDB::with_files(ra_fixture);
- let crate_graph = db.crate_graph();
- let krate = crate_graph
+ let all_crates = db.all_crates();
+ let krate = all_crates
.iter()
+ .copied()
.find(|&krate| {
- crate_graph[krate]
+ krate
+ .extra_data(&db)
.display_name
.as_ref()
.is_some_and(|it| it.crate_name().as_str() == crate_name)
})
.expect("could not find crate");
- let actual = search_dependencies(db.upcast(), krate, &query)
+ let actual = search_dependencies(&db, krate, &query)
.into_iter()
- .filter_map(|dependency| {
- let dependency_krate = dependency.krate(db.upcast())?;
+ .filter_map(|(dependency, _)| {
+ let dependency_krate = dependency.krate(&db)?;
let dependency_imports = db.import_map(dependency_krate);
let (path, mark) = match assoc_item_path(&db, &dependency_imports, dependency) {
@@ -545,7 +550,7 @@ mod tests {
Some(format!(
"{}::{} ({})\n",
- crate_graph[dependency_krate].display_name.as_ref()?,
+ dependency_krate.extra_data(&db).display_name.as_ref()?,
path,
mark
))
@@ -575,8 +580,8 @@ mod tests {
let trait_info = dependency_imports.import_info_for(ItemInNs::Types(trait_id.into()))?;
- let trait_data = db.trait_data(trait_id);
- let (assoc_item_name, _) = trait_data
+ let trait_items = db.trait_items(trait_id);
+ let (assoc_item_name, _) = trait_items
.items
.iter()
.find(|(_, assoc_item_id)| &dependency_assoc_item_id == assoc_item_id)?;
@@ -584,23 +589,24 @@ mod tests {
Some(format!(
"{}::{}",
render_path(db, &trait_info[0]),
- assoc_item_name.display(db.upcast(), Edition::CURRENT)
+ assoc_item_name.display(db, Edition::CURRENT)
))
}
fn check(#[rust_analyzer::rust_fixture] ra_fixture: &str, expect: Expect) {
let db = TestDB::with_files(ra_fixture);
- let crate_graph = db.crate_graph();
+ let all_crates = db.all_crates();
- let actual = crate_graph
+ let actual = all_crates
.iter()
+ .copied()
.filter_map(|krate| {
- let cdata = &crate_graph[krate];
+ let cdata = &krate.extra_data(&db);
let name = cdata.display_name.as_ref()?;
let map = db.import_map(krate);
- Some(format!("{name}:\n{}\n", map.fmt_for_test(db.upcast())))
+ Some(format!("{name}:\n{}\n", map.fmt_for_test(&db)))
})
.sorted()
.collect::<String>();
@@ -623,7 +629,7 @@ mod tests {
module = parent;
}
- segments.iter().rev().map(|it| it.display(db.upcast(), Edition::CURRENT)).join("::")
+ segments.iter().rev().map(|it| it.display(db, Edition::CURRENT)).join("::")
}
#[test]