Remove super_traits_of query, just leave a helper function
This commit is contained in:
parent
a6136d8b83
commit
35bf466a27
3 changed files with 23 additions and 31 deletions
|
@ -436,12 +436,6 @@ rustc_queries! {
|
||||||
desc { |tcx| "computing the super predicates of `{}`", tcx.def_path_str(key) }
|
desc { |tcx| "computing the super predicates of `{}`", tcx.def_path_str(key) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Maps from the `DefId` of a trait to the list of
|
|
||||||
/// all the ancestors super traits.
|
|
||||||
query super_traits_of(key: DefId) -> Lrc<FxHashSet<DefId>> {
|
|
||||||
desc { |tcx| "computing the super traits of `{}`", tcx.def_path_str(key) }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The `Option<Ident>` is the name of an associated type. If it is `None`, then this query
|
/// The `Option<Ident>` is the name of an associated type. If it is `None`, then this query
|
||||||
/// returns the full set of predicates. If `Some<Ident>`, then the query returns only the
|
/// returns the full set of predicates. If `Some<Ident>`, then the query returns only the
|
||||||
/// subset of super-predicates that reference traits that define the given associated type.
|
/// subset of super-predicates that reference traits that define the given associated type.
|
||||||
|
|
|
@ -2095,6 +2095,29 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Computes the def-ids of the transitive super-traits of `trait_def_id`. This (intentionally)
|
||||||
|
/// does not compute the full elaborated super-predicates but just the set of def-ids. It is used
|
||||||
|
/// to identify which traits may define a given associated type to help avoid cycle errors.
|
||||||
|
/// Returns `Lrc<FxHashSet<DefId>>` so that cloning is cheaper.
|
||||||
|
fn super_traits_of(self, trait_def_id: DefId) -> Lrc<FxHashSet<DefId>> {
|
||||||
|
let mut set = FxHashSet::default();
|
||||||
|
let mut stack = vec![trait_def_id];
|
||||||
|
while let Some(trait_did) = stack.pop() {
|
||||||
|
if !set.insert(trait_did) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let generic_predicates = self.super_predicates_of(trait_did);
|
||||||
|
for (predicate, _) in generic_predicates.predicates {
|
||||||
|
if let ty::PredicateAtom::Trait(data, _) = predicate.skip_binders() {
|
||||||
|
stack.push(data.def_id());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Lrc::new(set)
|
||||||
|
}
|
||||||
|
|
||||||
/// Given a closure signature, returns an equivalent fn signature. Detuples
|
/// Given a closure signature, returns an equivalent fn signature. Detuples
|
||||||
/// and so forth -- so e.g., if we have a sig with `Fn<(u32, i32)>` then
|
/// and so forth -- so e.g., if we have a sig with `Fn<(u32, i32)>` then
|
||||||
/// you would get a `fn(u32, i32)`.
|
/// you would get a `fn(u32, i32)`.
|
||||||
|
|
|
@ -26,7 +26,6 @@ use rustc_ast::{MetaItemKind, NestedMetaItem};
|
||||||
use rustc_attr::{list_contains_name, InlineAttr, InstructionSetAttr, OptimizeAttr};
|
use rustc_attr::{list_contains_name, InlineAttr, InstructionSetAttr, OptimizeAttr};
|
||||||
use rustc_data_structures::captures::Captures;
|
use rustc_data_structures::captures::Captures;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexSet};
|
||||||
use rustc_data_structures::sync::Lrc;
|
|
||||||
use rustc_errors::{struct_span_err, Applicability};
|
use rustc_errors::{struct_span_err, Applicability};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{CtorKind, DefKind, Res};
|
use rustc_hir::def::{CtorKind, DefKind, Res};
|
||||||
|
@ -81,7 +80,6 @@ pub fn provide(providers: &mut Providers) {
|
||||||
projection_ty_from_predicates,
|
projection_ty_from_predicates,
|
||||||
explicit_predicates_of,
|
explicit_predicates_of,
|
||||||
super_predicates_of,
|
super_predicates_of,
|
||||||
super_traits_of,
|
|
||||||
super_predicates_that_define_assoc_type,
|
super_predicates_that_define_assoc_type,
|
||||||
trait_explicit_predicates_and_bounds,
|
trait_explicit_predicates_and_bounds,
|
||||||
type_param_predicates,
|
type_param_predicates,
|
||||||
|
@ -1116,29 +1114,6 @@ fn super_predicates_that_define_assoc_type(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Computes the def-ids of the transitive super-traits of `trait_def_id`. This (intentionally)
|
|
||||||
/// does not compute the full elaborated super-predicates but just the set of def-ids. It is used
|
|
||||||
/// to identify which traits may define a given associated type to help avoid cycle errors.
|
|
||||||
/// Returns `Lrc<FxHashSet<DefId>>` so that cloning is cheaper.
|
|
||||||
fn super_traits_of(tcx: TyCtxt<'_>, trait_def_id: DefId) -> Lrc<FxHashSet<DefId>> {
|
|
||||||
let mut set = FxHashSet::default();
|
|
||||||
let mut stack = vec![trait_def_id];
|
|
||||||
while let Some(trait_did) = stack.pop() {
|
|
||||||
if !set.insert(trait_did) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let generic_predicates = tcx.super_predicates_of(trait_did);
|
|
||||||
for (predicate, _) in generic_predicates.predicates {
|
|
||||||
if let ty::PredicateAtom::Trait(data, _) = predicate.skip_binders() {
|
|
||||||
stack.push(data.def_id());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Lrc::new(set)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn trait_def(tcx: TyCtxt<'_>, def_id: DefId) -> ty::TraitDef {
|
fn trait_def(tcx: TyCtxt<'_>, def_id: DefId) -> ty::TraitDef {
|
||||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local());
|
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local());
|
||||||
let item = tcx.hir().expect_item(hir_id);
|
let item = tcx.hir().expect_item(hir_id);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue