Deduplicate supertrait_def_ids code
This commit is contained in:
parent
dd9c8cc467
commit
95e073234f
@ -12,7 +12,6 @@
|
|||||||
use rustc_middle::ty::{self, TyCtxt, TypeVisitableExt};
|
use rustc_middle::ty::{self, TyCtxt, TypeVisitableExt};
|
||||||
use rustc_session::parse::feature_err;
|
use rustc_session::parse::feature_err;
|
||||||
use rustc_span::{sym, ErrorGuaranteed};
|
use rustc_span::{sym, ErrorGuaranteed};
|
||||||
use rustc_trait_selection::traits;
|
|
||||||
|
|
||||||
mod builtin;
|
mod builtin;
|
||||||
mod inherent_impls;
|
mod inherent_impls;
|
||||||
@ -199,7 +198,7 @@ fn check_object_overlap<'tcx>(
|
|||||||
// With the feature enabled, the trait is not implemented automatically,
|
// With the feature enabled, the trait is not implemented automatically,
|
||||||
// so this is valid.
|
// so this is valid.
|
||||||
} else {
|
} else {
|
||||||
let mut supertrait_def_ids = traits::supertrait_def_ids(tcx, component_def_id);
|
let mut supertrait_def_ids = tcx.supertrait_def_ids(component_def_id);
|
||||||
if supertrait_def_ids.any(|d| d == trait_def_id) {
|
if supertrait_def_ids.any(|d| d == trait_def_id) {
|
||||||
let span = tcx.def_span(impl_def_id);
|
let span = tcx.def_span(impl_def_id);
|
||||||
return Err(struct_span_code_err!(
|
return Err(struct_span_code_err!(
|
||||||
|
@ -42,28 +42,26 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|||||||
impl<'tcx> TyCtxt<'tcx> {
|
impl<'tcx> TyCtxt<'tcx> {
|
||||||
pub const COMMON_VTABLE_ENTRIES: &'tcx [VtblEntry<'tcx>] =
|
pub const COMMON_VTABLE_ENTRIES: &'tcx [VtblEntry<'tcx>] =
|
||||||
&[VtblEntry::MetadataDropInPlace, VtblEntry::MetadataSize, VtblEntry::MetadataAlign];
|
&[VtblEntry::MetadataDropInPlace, VtblEntry::MetadataSize, VtblEntry::MetadataAlign];
|
||||||
|
|
||||||
|
pub fn supertrait_def_ids(self, trait_def_id: DefId) -> SupertraitDefIds<'tcx> {
|
||||||
|
SupertraitDefIds {
|
||||||
|
tcx: self,
|
||||||
|
stack: vec![trait_def_id],
|
||||||
|
visited: Some(trait_def_id).into_iter().collect(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const COMMON_VTABLE_ENTRIES_DROPINPLACE: usize = 0;
|
pub const COMMON_VTABLE_ENTRIES_DROPINPLACE: usize = 0;
|
||||||
pub const COMMON_VTABLE_ENTRIES_SIZE: usize = 1;
|
pub const COMMON_VTABLE_ENTRIES_SIZE: usize = 1;
|
||||||
pub const COMMON_VTABLE_ENTRIES_ALIGN: usize = 2;
|
pub const COMMON_VTABLE_ENTRIES_ALIGN: usize = 2;
|
||||||
|
|
||||||
// FIXME: This is duplicating equivalent code in compiler/rustc_trait_selection/src/traits/util.rs
|
pub struct SupertraitDefIds<'tcx> {
|
||||||
// But that is a downstream crate, and this code is pretty simple. Probably OK for now.
|
|
||||||
struct SupertraitDefIds<'tcx> {
|
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
stack: Vec<DefId>,
|
stack: Vec<DefId>,
|
||||||
visited: FxHashSet<DefId>,
|
visited: FxHashSet<DefId>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn supertrait_def_ids(tcx: TyCtxt<'_>, trait_def_id: DefId) -> SupertraitDefIds<'_> {
|
|
||||||
SupertraitDefIds {
|
|
||||||
tcx,
|
|
||||||
stack: vec![trait_def_id],
|
|
||||||
visited: Some(trait_def_id).into_iter().collect(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Iterator for SupertraitDefIds<'_> {
|
impl Iterator for SupertraitDefIds<'_> {
|
||||||
type Item = DefId;
|
type Item = DefId;
|
||||||
|
|
||||||
@ -100,7 +98,7 @@ pub(crate) fn vtable_min_entries<'tcx>(
|
|||||||
};
|
};
|
||||||
|
|
||||||
// This includes self in supertraits.
|
// This includes self in supertraits.
|
||||||
for def_id in supertrait_def_ids(tcx, trait_ref.def_id()) {
|
for def_id in tcx.supertrait_def_ids(trait_ref.def_id()) {
|
||||||
count += tcx.own_existential_vtable_entries(def_id).len();
|
count += tcx.own_existential_vtable_entries(def_id).len();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
//! Dealing with trait goals, i.e. `T: Trait<'a, U>`.
|
//! Dealing with trait goals, i.e. `T: Trait<'a, U>`.
|
||||||
|
|
||||||
use crate::traits::supertrait_def_ids;
|
|
||||||
|
|
||||||
use super::assembly::structural_traits::AsyncCallableRelevantTypes;
|
use super::assembly::structural_traits::AsyncCallableRelevantTypes;
|
||||||
use super::assembly::{self, structural_traits, Candidate};
|
use super::assembly::{self, structural_traits, Candidate};
|
||||||
use super::{EvalCtxt, GoalSource, SolverMode};
|
use super::{EvalCtxt, GoalSource, SolverMode};
|
||||||
@ -837,7 +835,8 @@ fn consider_builtin_upcast_to_principal(
|
|||||||
let a_auto_traits: FxIndexSet<DefId> = a_data
|
let a_auto_traits: FxIndexSet<DefId> = a_data
|
||||||
.auto_traits()
|
.auto_traits()
|
||||||
.chain(a_data.principal_def_id().into_iter().flat_map(|principal_def_id| {
|
.chain(a_data.principal_def_id().into_iter().flat_map(|principal_def_id| {
|
||||||
supertrait_def_ids(self.interner(), principal_def_id)
|
self.interner()
|
||||||
|
.supertrait_def_ids(principal_def_id)
|
||||||
.filter(|def_id| self.interner().trait_is_auto(*def_id))
|
.filter(|def_id| self.interner().trait_is_auto(*def_id))
|
||||||
}))
|
}))
|
||||||
.collect();
|
.collect();
|
||||||
|
@ -65,10 +65,7 @@
|
|||||||
pub use self::util::elaborate;
|
pub use self::util::elaborate;
|
||||||
pub use self::util::{expand_trait_aliases, TraitAliasExpander, TraitAliasExpansionInfo};
|
pub use self::util::{expand_trait_aliases, TraitAliasExpander, TraitAliasExpansionInfo};
|
||||||
pub use self::util::{get_vtable_index_of_object_method, impl_item_is_final, upcast_choices};
|
pub use self::util::{get_vtable_index_of_object_method, impl_item_is_final, upcast_choices};
|
||||||
pub use self::util::{
|
pub use self::util::{supertraits, transitive_bounds, transitive_bounds_that_define_assoc_item};
|
||||||
supertrait_def_ids, supertraits, transitive_bounds, transitive_bounds_that_define_assoc_item,
|
|
||||||
SupertraitDefIds,
|
|
||||||
};
|
|
||||||
pub use self::util::{with_replaced_escaping_bound_vars, BoundVarReplacer, PlaceholderReplacer};
|
pub use self::util::{with_replaced_escaping_bound_vars, BoundVarReplacer, PlaceholderReplacer};
|
||||||
|
|
||||||
pub use rustc_infer::traits::*;
|
pub use rustc_infer::traits::*;
|
||||||
|
@ -45,7 +45,8 @@ pub fn hir_ty_lowering_object_safety_violations(
|
|||||||
trait_def_id: DefId,
|
trait_def_id: DefId,
|
||||||
) -> Vec<ObjectSafetyViolation> {
|
) -> Vec<ObjectSafetyViolation> {
|
||||||
debug_assert!(tcx.generics_of(trait_def_id).has_self);
|
debug_assert!(tcx.generics_of(trait_def_id).has_self);
|
||||||
let violations = traits::supertrait_def_ids(tcx, trait_def_id)
|
let violations = tcx
|
||||||
|
.supertrait_def_ids(trait_def_id)
|
||||||
.map(|def_id| predicates_reference_self(tcx, def_id, true))
|
.map(|def_id| predicates_reference_self(tcx, def_id, true))
|
||||||
.filter(|spans| !spans.is_empty())
|
.filter(|spans| !spans.is_empty())
|
||||||
.map(ObjectSafetyViolation::SupertraitSelf)
|
.map(ObjectSafetyViolation::SupertraitSelf)
|
||||||
@ -59,7 +60,7 @@ fn object_safety_violations(tcx: TyCtxt<'_>, trait_def_id: DefId) -> &'_ [Object
|
|||||||
debug!("object_safety_violations: {:?}", trait_def_id);
|
debug!("object_safety_violations: {:?}", trait_def_id);
|
||||||
|
|
||||||
tcx.arena.alloc_from_iter(
|
tcx.arena.alloc_from_iter(
|
||||||
traits::supertrait_def_ids(tcx, trait_def_id)
|
tcx.supertrait_def_ids(trait_def_id)
|
||||||
.flat_map(|def_id| object_safety_violations_for_trait(tcx, def_id)),
|
.flat_map(|def_id| object_safety_violations_for_trait(tcx, def_id)),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -1004,7 +1004,8 @@ fn assemble_candidates_for_unsizing(
|
|||||||
let a_auto_traits: FxIndexSet<DefId> = a_data
|
let a_auto_traits: FxIndexSet<DefId> = a_data
|
||||||
.auto_traits()
|
.auto_traits()
|
||||||
.chain(principal_def_id_a.into_iter().flat_map(|principal_def_id| {
|
.chain(principal_def_id_a.into_iter().flat_map(|principal_def_id| {
|
||||||
util::supertrait_def_ids(self.tcx(), principal_def_id)
|
self.tcx()
|
||||||
|
.supertrait_def_ids(principal_def_id)
|
||||||
.filter(|def_id| self.tcx().trait_is_auto(*def_id))
|
.filter(|def_id| self.tcx().trait_is_auto(*def_id))
|
||||||
}))
|
}))
|
||||||
.collect();
|
.collect();
|
||||||
|
@ -2591,8 +2591,7 @@ fn match_upcast_principal(
|
|||||||
let a_auto_traits: FxIndexSet<DefId> = a_data
|
let a_auto_traits: FxIndexSet<DefId> = a_data
|
||||||
.auto_traits()
|
.auto_traits()
|
||||||
.chain(a_data.principal_def_id().into_iter().flat_map(|principal_def_id| {
|
.chain(a_data.principal_def_id().into_iter().flat_map(|principal_def_id| {
|
||||||
util::supertrait_def_ids(tcx, principal_def_id)
|
tcx.supertrait_def_ids(principal_def_id).filter(|def_id| tcx.trait_is_auto(*def_id))
|
||||||
.filter(|def_id| tcx.trait_is_auto(*def_id))
|
|
||||||
}))
|
}))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
use super::NormalizeExt;
|
use super::NormalizeExt;
|
||||||
use super::{ObligationCause, PredicateObligation, SelectionContext};
|
use super::{ObligationCause, PredicateObligation, SelectionContext};
|
||||||
use rustc_data_structures::fx::{FxHashSet, FxIndexMap};
|
use rustc_data_structures::fx::FxIndexMap;
|
||||||
use rustc_errors::Diag;
|
use rustc_errors::Diag;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_infer::infer::{InferCtxt, InferOk};
|
use rustc_infer::infer::{InferCtxt, InferOk};
|
||||||
@ -161,43 +161,6 @@ fn next(&mut self) -> Option<TraitAliasExpansionInfo<'tcx>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
|
||||||
// Iterator over def-IDs of supertraits
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
pub struct SupertraitDefIds<'tcx> {
|
|
||||||
tcx: TyCtxt<'tcx>,
|
|
||||||
stack: Vec<DefId>,
|
|
||||||
visited: FxHashSet<DefId>,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn supertrait_def_ids(tcx: TyCtxt<'_>, trait_def_id: DefId) -> SupertraitDefIds<'_> {
|
|
||||||
SupertraitDefIds {
|
|
||||||
tcx,
|
|
||||||
stack: vec![trait_def_id],
|
|
||||||
visited: Some(trait_def_id).into_iter().collect(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Iterator for SupertraitDefIds<'_> {
|
|
||||||
type Item = DefId;
|
|
||||||
|
|
||||||
fn next(&mut self) -> Option<DefId> {
|
|
||||||
let def_id = self.stack.pop()?;
|
|
||||||
let predicates = self.tcx.super_predicates_of(def_id);
|
|
||||||
let visited = &mut self.visited;
|
|
||||||
self.stack.extend(
|
|
||||||
predicates
|
|
||||||
.predicates
|
|
||||||
.iter()
|
|
||||||
.filter_map(|(pred, _)| pred.as_trait_clause())
|
|
||||||
.map(|trait_ref| trait_ref.def_id())
|
|
||||||
.filter(|&super_def_id| visited.insert(super_def_id)),
|
|
||||||
);
|
|
||||||
Some(def_id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// Other
|
// Other
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -253,7 +253,7 @@ fn is_named_self(cx: &LateContext<'_>, item: &TraitItemRef, name: Symbol) -> boo
|
|||||||
// fill the set with current and super traits
|
// fill the set with current and super traits
|
||||||
fn fill_trait_set(traitt: DefId, set: &mut DefIdSet, cx: &LateContext<'_>) {
|
fn fill_trait_set(traitt: DefId, set: &mut DefIdSet, cx: &LateContext<'_>) {
|
||||||
if set.insert(traitt) {
|
if set.insert(traitt) {
|
||||||
for supertrait in rustc_trait_selection::traits::supertrait_def_ids(cx.tcx, traitt) {
|
for supertrait in cx.tcx.supertrait_def_ids(traitt) {
|
||||||
fill_trait_set(supertrait, set, cx);
|
fill_trait_set(supertrait, set, cx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user