Return multiple modules in parent_module

This commit is contained in:
Lukas Wirth 2021-03-15 14:51:20 +01:00
parent f2c39d0cdf
commit 2e3c156b0e
5 changed files with 76 additions and 35 deletions

View file

@ -12,6 +12,7 @@ use hir_def::{
};
use hir_expand::{name::AsName, AstId, MacroDefKind};
use rustc_hash::FxHashMap;
use smallvec::SmallVec;
use stdx::impl_from;
use syntax::{
ast::{self, NameOwner},
@ -28,14 +29,19 @@ pub(super) struct SourceToDefCtx<'a, 'b> {
}
impl SourceToDefCtx<'_, '_> {
pub(super) fn file_to_def(&mut self, file: FileId) -> Option<ModuleId> {
pub(super) fn file_to_def(&mut self, file: FileId) -> SmallVec<[ModuleId; 1]> {
let _p = profile::span("SourceBinder::to_module_def");
self.db.relevant_crates(file).iter().find_map(|&crate_id| {
let mut mods = SmallVec::new();
for &crate_id in self.db.relevant_crates(file).iter() {
// FIXME: inner items
let crate_def_map = self.db.crate_def_map(crate_id);
let local_id = crate_def_map.modules_for_file(file).next()?;
Some(crate_def_map.module_id(local_id))
})
mods.extend(
crate_def_map
.modules_for_file(file)
.map(|local_id| crate_def_map.module_id(local_id)),
)
}
mods
}
pub(super) fn module_to_def(&mut self, src: InFile<ast::Module>) -> Option<ModuleId> {
@ -55,7 +61,7 @@ impl SourceToDefCtx<'_, '_> {
Some(parent_declaration) => self.module_to_def(parent_declaration),
None => {
let file_id = src.file_id.original_file(self.db.upcast());
self.file_to_def(file_id)
self.file_to_def(file_id).get(0).copied()
}
}?;
@ -185,7 +191,7 @@ impl SourceToDefCtx<'_, '_> {
) -> Option<MacroDefId> {
let kind = MacroDefKind::Declarative;
let file_id = src.file_id.original_file(self.db.upcast());
let krate = self.file_to_def(file_id)?.krate();
let krate = self.file_to_def(file_id).get(0).copied()?.krate();
let file_ast_id = self.db.ast_id_map(src.file_id).ast_id(&src.value);
let ast_id = Some(AstId::new(src.file_id, file_ast_id.upcast()));
Some(MacroDefId { krate, ast_id, kind, local_inner: false })
@ -245,7 +251,7 @@ impl SourceToDefCtx<'_, '_> {
return Some(res);
}
let def = self.file_to_def(src.file_id.original_file(self.db.upcast()))?;
let def = self.file_to_def(src.file_id.original_file(self.db.upcast())).get(0).copied()?;
Some(def.into())
}