Skip to content

Commit fbc3dff

Browse files
Deduplicate supertrait_def_ids code
1 parent 781a090 commit fbc3dff

File tree

9 files changed

+22
-65
lines changed

9 files changed

+22
-65
lines changed

compiler/rustc_hir_analysis/src/coherence/mod.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ use rustc_middle::query::Providers;
1212
use rustc_middle::ty::{self, TyCtxt, TypeVisitableExt};
1313
use rustc_session::parse::feature_err;
1414
use rustc_span::{sym, ErrorGuaranteed};
15-
use rustc_trait_selection::traits;
1615

1716
mod builtin;
1817
mod inherent_impls;
@@ -199,7 +198,7 @@ fn check_object_overlap<'tcx>(
199198
// With the feature enabled, the trait is not implemented automatically,
200199
// so this is valid.
201200
} else {
202-
let mut supertrait_def_ids = traits::supertrait_def_ids(tcx, component_def_id);
201+
let mut supertrait_def_ids = tcx.supertrait_def_ids(component_def_id);
203202
if supertrait_def_ids.any(|d| d == trait_def_id) {
204203
let span = tcx.def_span(impl_def_id);
205204
return Err(struct_span_code_err!(

compiler/rustc_middle/src/ty/vtable.rs

+10-12
Original file line numberDiff line numberDiff line change
@@ -42,28 +42,26 @@ impl<'tcx> fmt::Debug for VtblEntry<'tcx> {
4242
impl<'tcx> TyCtxt<'tcx> {
4343
pub const COMMON_VTABLE_ENTRIES: &'tcx [VtblEntry<'tcx>] =
4444
&[VtblEntry::MetadataDropInPlace, VtblEntry::MetadataSize, VtblEntry::MetadataAlign];
45+
46+
pub fn supertrait_def_ids(self, trait_def_id: DefId) -> SupertraitDefIds<'tcx> {
47+
SupertraitDefIds {
48+
tcx: self,
49+
stack: vec![trait_def_id],
50+
visited: Some(trait_def_id).into_iter().collect(),
51+
}
52+
}
4553
}
4654

4755
pub const COMMON_VTABLE_ENTRIES_DROPINPLACE: usize = 0;
4856
pub const COMMON_VTABLE_ENTRIES_SIZE: usize = 1;
4957
pub const COMMON_VTABLE_ENTRIES_ALIGN: usize = 2;
5058

51-
// FIXME: This is duplicating equivalent code in compiler/rustc_trait_selection/src/traits/util.rs
52-
// But that is a downstream crate, and this code is pretty simple. Probably OK for now.
53-
struct SupertraitDefIds<'tcx> {
59+
pub struct SupertraitDefIds<'tcx> {
5460
tcx: TyCtxt<'tcx>,
5561
stack: Vec<DefId>,
5662
visited: FxHashSet<DefId>,
5763
}
5864

59-
fn supertrait_def_ids(tcx: TyCtxt<'_>, trait_def_id: DefId) -> SupertraitDefIds<'_> {
60-
SupertraitDefIds {
61-
tcx,
62-
stack: vec![trait_def_id],
63-
visited: Some(trait_def_id).into_iter().collect(),
64-
}
65-
}
66-
6765
impl Iterator for SupertraitDefIds<'_> {
6866
type Item = DefId;
6967

@@ -100,7 +98,7 @@ pub(crate) fn vtable_min_entries<'tcx>(
10098
};
10199

102100
// This includes self in supertraits.
103-
for def_id in supertrait_def_ids(tcx, trait_ref.def_id()) {
101+
for def_id in tcx.supertrait_def_ids(trait_ref.def_id()) {
104102
count += tcx.own_existential_vtable_entries(def_id).len();
105103
}
106104

compiler/rustc_trait_selection/src/solve/trait_goals.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
//! Dealing with trait goals, i.e. `T: Trait<'a, U>`.
22
3-
use crate::traits::supertrait_def_ids;
4-
53
use super::assembly::structural_traits::AsyncCallableRelevantTypes;
64
use super::assembly::{self, structural_traits, Candidate};
75
use super::{EvalCtxt, GoalSource, SolverMode};
@@ -830,7 +828,8 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
830828
let a_auto_traits: FxIndexSet<DefId> = a_data
831829
.auto_traits()
832830
.chain(a_data.principal_def_id().into_iter().flat_map(|principal_def_id| {
833-
supertrait_def_ids(self.tcx(), principal_def_id)
831+
self.tcx()
832+
.supertrait_def_ids(principal_def_id)
834833
.filter(|def_id| self.tcx().trait_is_auto(*def_id))
835834
}))
836835
.collect();

compiler/rustc_trait_selection/src/traits/mod.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,7 @@ pub use self::structural_normalize::StructurallyNormalizeExt;
6464
pub use self::util::elaborate;
6565
pub use self::util::{expand_trait_aliases, TraitAliasExpander, TraitAliasExpansionInfo};
6666
pub use self::util::{get_vtable_index_of_object_method, impl_item_is_final, upcast_choices};
67-
pub use self::util::{
68-
supertrait_def_ids, supertraits, transitive_bounds, transitive_bounds_that_define_assoc_item,
69-
SupertraitDefIds,
70-
};
67+
pub use self::util::{supertraits, transitive_bounds, transitive_bounds_that_define_assoc_item};
7168
pub use self::util::{with_replaced_escaping_bound_vars, BoundVarReplacer, PlaceholderReplacer};
7269

7370
pub use rustc_infer::traits::*;

compiler/rustc_trait_selection/src/traits/object_safety.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ pub fn hir_ty_lowering_object_safety_violations(
4444
trait_def_id: DefId,
4545
) -> Vec<ObjectSafetyViolation> {
4646
debug_assert!(tcx.generics_of(trait_def_id).has_self);
47-
let violations = traits::supertrait_def_ids(tcx, trait_def_id)
47+
let violations = tcx
48+
.supertrait_def_ids(trait_def_id)
4849
.map(|def_id| predicates_reference_self(tcx, def_id, true))
4950
.filter(|spans| !spans.is_empty())
5051
.map(ObjectSafetyViolation::SupertraitSelf)
@@ -58,7 +59,7 @@ fn object_safety_violations(tcx: TyCtxt<'_>, trait_def_id: DefId) -> &'_ [Object
5859
debug!("object_safety_violations: {:?}", trait_def_id);
5960

6061
tcx.arena.alloc_from_iter(
61-
traits::supertrait_def_ids(tcx, trait_def_id)
62+
tcx.supertrait_def_ids(trait_def_id)
6263
.flat_map(|def_id| object_safety_violations_for_trait(tcx, def_id)),
6364
)
6465
}

compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1012,7 +1012,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
10121012
let a_auto_traits: FxIndexSet<DefId> = a_data
10131013
.auto_traits()
10141014
.chain(principal_def_id_a.into_iter().flat_map(|principal_def_id| {
1015-
util::supertrait_def_ids(self.tcx(), principal_def_id)
1015+
self.tcx()
1016+
.supertrait_def_ids(principal_def_id)
10161017
.filter(|def_id| self.tcx().trait_is_auto(*def_id))
10171018
}))
10181019
.collect();

compiler/rustc_trait_selection/src/traits/select/mod.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -2560,8 +2560,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
25602560
let a_auto_traits: FxIndexSet<DefId> = a_data
25612561
.auto_traits()
25622562
.chain(a_data.principal_def_id().into_iter().flat_map(|principal_def_id| {
2563-
util::supertrait_def_ids(tcx, principal_def_id)
2564-
.filter(|def_id| tcx.trait_is_auto(*def_id))
2563+
tcx.supertrait_def_ids(principal_def_id).filter(|def_id| tcx.trait_is_auto(*def_id))
25652564
}))
25662565
.collect();
25672566

compiler/rustc_trait_selection/src/traits/util.rs

+1-38
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::collections::BTreeMap;
22

33
use super::NormalizeExt;
44
use super::{ObligationCause, PredicateObligation, SelectionContext};
5-
use rustc_data_structures::fx::{FxHashSet, FxIndexMap};
5+
use rustc_data_structures::fx::FxIndexMap;
66
use rustc_errors::Diag;
77
use rustc_hir::def_id::DefId;
88
use rustc_infer::infer::{InferCtxt, InferOk};
@@ -160,43 +160,6 @@ impl<'tcx> Iterator for TraitAliasExpander<'tcx> {
160160
}
161161
}
162162

163-
///////////////////////////////////////////////////////////////////////////
164-
// Iterator over def-IDs of supertraits
165-
///////////////////////////////////////////////////////////////////////////
166-
167-
pub struct SupertraitDefIds<'tcx> {
168-
tcx: TyCtxt<'tcx>,
169-
stack: Vec<DefId>,
170-
visited: FxHashSet<DefId>,
171-
}
172-
173-
pub fn supertrait_def_ids(tcx: TyCtxt<'_>, trait_def_id: DefId) -> SupertraitDefIds<'_> {
174-
SupertraitDefIds {
175-
tcx,
176-
stack: vec![trait_def_id],
177-
visited: Some(trait_def_id).into_iter().collect(),
178-
}
179-
}
180-
181-
impl Iterator for SupertraitDefIds<'_> {
182-
type Item = DefId;
183-
184-
fn next(&mut self) -> Option<DefId> {
185-
let def_id = self.stack.pop()?;
186-
let predicates = self.tcx.super_predicates_of(def_id);
187-
let visited = &mut self.visited;
188-
self.stack.extend(
189-
predicates
190-
.predicates
191-
.iter()
192-
.filter_map(|(pred, _)| pred.as_trait_clause())
193-
.map(|trait_ref| trait_ref.def_id())
194-
.filter(|&super_def_id| visited.insert(super_def_id)),
195-
);
196-
Some(def_id)
197-
}
198-
}
199-
200163
///////////////////////////////////////////////////////////////////////////
201164
// Other
202165
///////////////////////////////////////////////////////////////////////////

src/tools/clippy/clippy_lints/src/len_zero.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ fn check_trait_items(cx: &LateContext<'_>, visited_trait: &Item<'_>, trait_items
253253
// fill the set with current and super traits
254254
fn fill_trait_set(traitt: DefId, set: &mut DefIdSet, cx: &LateContext<'_>) {
255255
if set.insert(traitt) {
256-
for supertrait in rustc_trait_selection::traits::supertrait_def_ids(cx.tcx, traitt) {
256+
for supertrait in cx.tcx.supertrait_def_ids(traitt) {
257257
fill_trait_set(supertrait, set, cx);
258258
}
259259
}

0 commit comments

Comments
 (0)