From 16eb6c229fecaf89338add5c5b711dc3e3ce2324 Mon Sep 17 00:00:00 2001 From: r0cky Date: Sat, 20 Apr 2024 00:16:16 +0800 Subject: [PATCH] Remove query impl_item_trait_item_ids, fix typo --- compiler/rustc_middle/src/query/mod.rs | 26 --------------------- compiler/rustc_passes/src/dead.rs | 32 ++++++++++++++++++-------- compiler/rustc_ty_utils/src/assoc.rs | 8 ------- 3 files changed, 23 insertions(+), 43 deletions(-) diff --git a/compiler/rustc_middle/src/query/mod.rs b/compiler/rustc_middle/src/query/mod.rs index 66a88f578c3b4..332ebdbdd944c 100644 --- a/compiler/rustc_middle/src/query/mod.rs +++ b/compiler/rustc_middle/src/query/mod.rs @@ -819,32 +819,6 @@ rustc_queries! { desc { |tcx| "comparing impl items against trait for `{}`", tcx.def_path_str(impl_id) } } - /// Maps from associated items on the impl specified by `impl_id` - /// to the corresponding associated item on the trait. - /// - /// For example, with the following code - /// - /// ``` - /// struct Type {} - /// // DefId - /// trait Trait { // trait_id - /// fn f(); // trait_f - /// fn g() {} // trait_g - /// } - /// - /// impl Trait for Type { // impl_id - /// fn f() {} // impl_f - /// fn g() {} // impl_g - /// } - /// ``` - /// - /// The map returned for `tcx.impl_item_trait_item_ids(impl_id)` would be - ///`{ impl_f: trait_f, impl_g: trait_g }` - query impl_item_trait_item_ids(impl_id: DefId) -> &'tcx DefIdMap { - arena_cache - desc { |tcx| "comparing impl items against trait for `{}`", tcx.def_path_str(impl_id) } - } - /// Given `fn_def_id` of a trait or of an impl that implements a given trait: /// if `fn_def_id` is the def id of a function defined inside a trait, then it creates and returns /// the associated items that correspond to each impl trait in return position for that trait. diff --git a/compiler/rustc_passes/src/dead.rs b/compiler/rustc_passes/src/dead.rs index ccfc55f98dc24..3f658af336f7d 100644 --- a/compiler/rustc_passes/src/dead.rs +++ b/compiler/rustc_passes/src/dead.rs @@ -3,7 +3,7 @@ // expectations such as `#[expect(unused)]` and `#[expect(dead_code)]` is live, and everything else // is dead. -use hir::def_id::{LocalDefIdMap, LocalDefIdSet}; +use hir::def_id::{DefIdMap, LocalDefIdMap, LocalDefIdSet}; use hir::ItemKind; use rustc_data_structures::unord::UnordSet; use rustc_errors::MultiSpan; @@ -80,6 +80,7 @@ struct MarkSymbolVisitor<'tcx> { // and the span of their respective impl (i.e., part of the derive // macro) ignored_derived_traits: LocalDefIdMap>, + impl_item_trait_item_ids_cache: DefIdMap>, } impl<'tcx> MarkSymbolVisitor<'tcx> { @@ -490,7 +491,7 @@ impl<'tcx> MarkSymbolVisitor<'tcx> { let mut ready; (ready, unsolved_impl_items) = unsolved_impl_items.into_iter().partition(|&(impl_id, impl_item_id)| { - self.impl_item_with_used_self_and_trait_term(impl_id, impl_item_id) + self.impl_item_with_used_self_and_trait_item(impl_id, impl_item_id) }); while !ready.is_empty() { @@ -500,12 +501,12 @@ impl<'tcx> MarkSymbolVisitor<'tcx> { (ready, unsolved_impl_items) = unsolved_impl_items.into_iter().partition(|&(impl_id, impl_item_id)| { - self.impl_item_with_used_self_and_trait_term(impl_id, impl_item_id) + self.impl_item_with_used_self_and_trait_item(impl_id, impl_item_id) }); } } - fn impl_item_with_used_self_and_trait_term( + fn impl_item_with_used_self_and_trait_item( &mut self, impl_id: hir::ItemId, impl_item_id: LocalDefId, @@ -520,13 +521,18 @@ impl<'tcx> MarkSymbolVisitor<'tcx> { // for the public method, we don't know the trait item is used or not, // so we mark the method live if the self is used return self.live_symbols.contains(&local_def_id); - } else if let Some(trait_item_id) = self - .tcx - .impl_item_trait_item_ids(impl_id.owner_id.to_def_id()) - .get(&impl_item_id.to_def_id()) + } + + let impl_id = impl_id.owner_id.to_def_id(); + let impl_item_trait_item_ids = self + .impl_item_trait_item_ids_cache + .entry(impl_id) + .or_insert_with(|| Self::impl_item_trait_item_ids(self.tcx, impl_id)); + + if let Some(trait_item_id) = impl_item_trait_item_ids.get(&impl_item_id.to_def_id()) && let Some(local_id) = trait_item_id.as_local() { - // for the private method, we can know the trait item is ued or not, + // for the private method, we can know the trait item is used or not, // so we mark the method live if the self is used and the trait item is used return self.live_symbols.contains(&local_id) && self.live_symbols.contains(&local_def_id); @@ -534,6 +540,13 @@ impl<'tcx> MarkSymbolVisitor<'tcx> { } false } + + fn impl_item_trait_item_ids(tcx: TyCtxt<'tcx>, impl_id: DefId) -> DefIdMap { + tcx.associated_items(impl_id) + .in_definition_order() + .filter_map(|item| item.trait_item_def_id.map(|trait_item| (item.def_id, trait_item))) + .collect() + } } impl<'tcx> Visitor<'tcx> for MarkSymbolVisitor<'tcx> { @@ -888,6 +901,7 @@ fn live_symbols_and_ignored_derived_traits( ignore_variant_stack: vec![], struct_constructors, ignored_derived_traits: Default::default(), + impl_item_trait_item_ids_cache: Default::default(), }; symbol_visitor.mark_live_symbols(); symbol_visitor.solve_rest_impl_items(unsolved_impl_items); diff --git a/compiler/rustc_ty_utils/src/assoc.rs b/compiler/rustc_ty_utils/src/assoc.rs index c55dd39779af6..26d3370469a5d 100644 --- a/compiler/rustc_ty_utils/src/assoc.rs +++ b/compiler/rustc_ty_utils/src/assoc.rs @@ -15,7 +15,6 @@ pub(crate) fn provide(providers: &mut Providers) { associated_types_for_impl_traits_in_associated_fn, associated_type_for_impl_trait_in_trait, impl_item_implementor_ids, - impl_item_trait_item_ids, ..*providers }; } @@ -93,13 +92,6 @@ fn impl_item_implementor_ids(tcx: TyCtxt<'_>, impl_id: DefId) -> DefIdMap .collect() } -fn impl_item_trait_item_ids(tcx: TyCtxt<'_>, impl_id: DefId) -> DefIdMap { - tcx.associated_items(impl_id) - .in_definition_order() - .filter_map(|item| item.trait_item_def_id.map(|trait_item| (item.def_id, trait_item))) - .collect() -} - fn associated_item(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::AssocItem { let id = tcx.local_def_id_to_hir_id(def_id); let parent_def_id = tcx.hir().get_parent_item(id);