Rollup merge of #110908 - petrochenkov:notagain4, r=compiler-errors
resolve: One more attempt to simplify `module_children` If the next step is performed and `fn module_children_local` is merged with the `module_children` query, then it causes perf regressions, regardless of whether query result feeding is [used](https://perf.rust-lang.org/compare.html?start=43a78029b4f4d92978b8fde0a677ea300b113c41&end=2eb5bcc5068b9d92f74bcb1797da664865d6981d&stat=instructions:u) or [not](https://perf.rust-lang.org/compare.html?start=2fce2290865f012391b8f3e581c3852a248031fa&end=2a33d6cd99481d1712037a79e7d66a8aefadbf72&stat=instructions:u).
This commit is contained in:
commit
0228994cdf
10 changed files with 45 additions and 53 deletions
|
@ -1261,14 +1261,11 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||
*module.globs.borrow_mut() = Vec::new();
|
||||
|
||||
if let Some(def_id) = module.opt_def_id() {
|
||||
let mut non_reexports = Vec::new();
|
||||
let mut reexports = Vec::new();
|
||||
let mut children = Vec::new();
|
||||
|
||||
module.for_each_child(self, |this, ident, _, binding| {
|
||||
let res = binding.res().expect_non_local();
|
||||
if !binding.is_import() {
|
||||
non_reexports.push(res.def_id().expect_local());
|
||||
} else if res != def::Res::Err && !binding.is_ambiguity() {
|
||||
if res != def::Res::Err && !binding.is_ambiguity() {
|
||||
let mut reexport_chain = SmallVec::new();
|
||||
let mut next_binding = binding;
|
||||
while let NameBindingKind::Import { binding, import, .. } = next_binding.kind {
|
||||
|
@ -1276,17 +1273,13 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||
next_binding = binding;
|
||||
}
|
||||
|
||||
reexports.push(ModChild { ident, res, vis: binding.vis, reexport_chain });
|
||||
children.push(ModChild { ident, res, vis: binding.vis, reexport_chain });
|
||||
}
|
||||
});
|
||||
|
||||
// Should be fine because this code is only called for local modules.
|
||||
let def_id = def_id.expect_local();
|
||||
if !non_reexports.is_empty() {
|
||||
self.module_children_non_reexports.insert(def_id, non_reexports);
|
||||
}
|
||||
if !reexports.is_empty() {
|
||||
self.module_children_reexports.insert(def_id, reexports);
|
||||
if !children.is_empty() {
|
||||
// Should be fine because this code is only called for local modules.
|
||||
self.module_children.insert(def_id.expect_local(), children);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -909,8 +909,7 @@ pub struct Resolver<'a, 'tcx> {
|
|||
|
||||
/// `CrateNum` resolutions of `extern crate` items.
|
||||
extern_crate_map: FxHashMap<LocalDefId, CrateNum>,
|
||||
module_children_non_reexports: LocalDefIdMap<Vec<LocalDefId>>,
|
||||
module_children_reexports: LocalDefIdMap<Vec<ModChild>>,
|
||||
module_children: LocalDefIdMap<Vec<ModChild>>,
|
||||
trait_map: NodeMap<Vec<TraitCandidate>>,
|
||||
|
||||
/// A map from nodes to anonymous modules.
|
||||
|
@ -1260,8 +1259,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||
lifetimes_res_map: Default::default(),
|
||||
extra_lifetime_params_map: Default::default(),
|
||||
extern_crate_map: Default::default(),
|
||||
module_children_non_reexports: Default::default(),
|
||||
module_children_reexports: Default::default(),
|
||||
module_children: Default::default(),
|
||||
trait_map: NodeMap::default(),
|
||||
underscore_disambiguator: 0,
|
||||
empty_module,
|
||||
|
@ -1399,8 +1397,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||
has_pub_restricted,
|
||||
effective_visibilities,
|
||||
extern_crate_map,
|
||||
module_children_non_reexports: self.module_children_non_reexports,
|
||||
module_children_reexports: self.module_children_reexports,
|
||||
module_children: self.module_children,
|
||||
glob_map,
|
||||
maybe_unused_trait_imports,
|
||||
main_def,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue