resolve: Pre-compute non-reexport module children
Instead of repeating the same logic by walking HIR during metadata encoding. The only difference is that we are no longer encoding `macro_rules` items, but we never currently need them as a part of this list. They can be encoded separately if this need ever arises. `module_reexports` is also un-querified, because I don't see any reasons to make it a query, only overhead.
This commit is contained in:
parent
9be9b5e09a
commit
7c40a6fb34
16 changed files with 72 additions and 99 deletions
|
@ -43,8 +43,6 @@ pub struct ModChild {
|
|||
pub vis: ty::Visibility<DefId>,
|
||||
/// Span of the item.
|
||||
pub span: Span,
|
||||
/// A proper `macro_rules` item (not a reexport).
|
||||
pub macro_rules: bool,
|
||||
/// Reexport chain linking this module child to its original reexported item.
|
||||
/// Empty if the module child is a proper item.
|
||||
pub reexport_chain: SmallVec<[Reexport; 2]>,
|
||||
|
|
|
@ -1516,10 +1516,6 @@ rustc_queries! {
|
|||
desc { "getting traits in scope at a block" }
|
||||
}
|
||||
|
||||
query module_reexports(def_id: LocalDefId) -> &'tcx [ModChild] {
|
||||
desc { |tcx| "looking up reexports of module `{}`", tcx.def_path_str(def_id.to_def_id()) }
|
||||
}
|
||||
|
||||
query impl_defaultness(def_id: DefId) -> hir::Defaultness {
|
||||
desc { |tcx| "looking up whether `{}` is a default impl", tcx.def_path_str(def_id) }
|
||||
cache_on_disk_if { def_id.is_local() }
|
||||
|
|
|
@ -8,6 +8,7 @@ use crate::arena::Arena;
|
|||
use crate::dep_graph::{DepGraph, DepKindStruct};
|
||||
use crate::infer::canonical::CanonicalVarInfo;
|
||||
use crate::lint::struct_lint_level;
|
||||
use crate::metadata::ModChild;
|
||||
use crate::middle::codegen_fn_attrs::CodegenFnAttrs;
|
||||
use crate::middle::resolve_bound_vars;
|
||||
use crate::middle::stability;
|
||||
|
@ -2459,6 +2460,28 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
self.def_kind(def_id) == DefKind::ImplTraitPlaceholder
|
||||
}
|
||||
}
|
||||
|
||||
/// Named module children from all items except `use` and `extern crate` imports.
|
||||
///
|
||||
/// In addition to regular items this list also includes struct or variant constructors, and
|
||||
/// items inside `extern {}` blocks because all of them introduce names into parent module.
|
||||
/// For non-reexported children every such name is associated with a separate `DefId`.
|
||||
///
|
||||
/// Module here is understood in name resolution sense - it can be a `mod` item,
|
||||
/// or a crate root, or an enum, or a trait.
|
||||
pub fn module_children_non_reexports(self, def_id: LocalDefId) -> &'tcx [LocalDefId] {
|
||||
self.resolutions(()).module_children_non_reexports.get(&def_id).map_or(&[], |v| &v[..])
|
||||
}
|
||||
|
||||
/// Named module children from `use` and `extern crate` imports.
|
||||
///
|
||||
/// Reexported names are not associated with individual `DefId`s,
|
||||
/// e.g. a glob import can introduce a lot of names, all with the same `DefId`.
|
||||
/// That's why the list needs to contain `ModChild` structures describing all the names
|
||||
/// individually instead of `DefId`s.
|
||||
pub fn module_children_reexports(self, def_id: LocalDefId) -> &'tcx [ModChild] {
|
||||
self.resolutions(()).module_children_reexports.get(&def_id).map_or(&[], |v| &v[..])
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> TyCtxtAt<'tcx> {
|
||||
|
@ -2501,8 +2524,6 @@ pub struct DeducedParamAttrs {
|
|||
}
|
||||
|
||||
pub fn provide(providers: &mut ty::query::Providers) {
|
||||
providers.module_reexports =
|
||||
|tcx, id| tcx.resolutions(()).reexport_map.get(&id).map_or(&[], |v| &v[..]);
|
||||
providers.maybe_unused_trait_imports =
|
||||
|tcx, ()| &tcx.resolutions(()).maybe_unused_trait_imports;
|
||||
providers.names_imported_by_glob_use = |tcx, id| {
|
||||
|
|
|
@ -166,7 +166,8 @@ pub struct ResolverGlobalCtxt {
|
|||
pub effective_visibilities: EffectiveVisibilities,
|
||||
pub extern_crate_map: FxHashMap<LocalDefId, CrateNum>,
|
||||
pub maybe_unused_trait_imports: FxIndexSet<LocalDefId>,
|
||||
pub reexport_map: FxHashMap<LocalDefId, Vec<ModChild>>,
|
||||
pub module_children_non_reexports: LocalDefIdMap<Vec<LocalDefId>>,
|
||||
pub module_children_reexports: LocalDefIdMap<Vec<ModChild>>,
|
||||
pub glob_map: FxHashMap<LocalDefId, FxHashSet<Symbol>>,
|
||||
pub main_def: Option<MainDefinition>,
|
||||
pub trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue