Clean up inherent_impls
This commit is contained in:
parent
765eebf064
commit
8d6b1d10d4
@ -7,7 +7,6 @@
|
|||||||
//! `tcx.inherent_impls(def_id)`). That value, however,
|
//! `tcx.inherent_impls(def_id)`). That value, however,
|
||||||
//! is computed by selecting an idea from this table.
|
//! is computed by selecting an idea from this table.
|
||||||
|
|
||||||
use rustc::dep_graph::DepKind;
|
|
||||||
use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
|
use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
|
||||||
use rustc::hir;
|
use rustc::hir;
|
||||||
use rustc::hir::itemlikevisit::ItemLikeVisitor;
|
use rustc::hir::itemlikevisit::ItemLikeVisitor;
|
||||||
@ -36,35 +35,11 @@ pub fn crate_inherent_impls<'tcx>(
|
|||||||
pub fn inherent_impls<'tcx>(tcx: TyCtxt<'tcx>, ty_def_id: DefId) -> &'tcx [DefId] {
|
pub fn inherent_impls<'tcx>(tcx: TyCtxt<'tcx>, ty_def_id: DefId) -> &'tcx [DefId] {
|
||||||
assert!(ty_def_id.is_local());
|
assert!(ty_def_id.is_local());
|
||||||
|
|
||||||
// NB. Until we adopt the red-green dep-tracking algorithm (see
|
let crate_map = tcx.crate_inherent_impls(ty_def_id.krate);
|
||||||
// [the plan] for details on that), we do some hackery here to get
|
match crate_map.inherent_impls.get(&ty_def_id) {
|
||||||
// the dependencies correct. Basically, we use a `with_ignore` to
|
Some(v) => &v[..],
|
||||||
// read the result we want. If we didn't have the `with_ignore`,
|
None => &[],
|
||||||
// we would wind up with a dependency on the entire crate, which
|
|
||||||
// we don't want. Then we go and add dependencies on all the impls
|
|
||||||
// in the result (which is what we wanted).
|
|
||||||
//
|
|
||||||
// The result is a graph with an edge from `Hir(I)` for every impl
|
|
||||||
// `I` defined on some type `T` to `CoherentInherentImpls(T)`,
|
|
||||||
// thus ensuring that if any of those impls change, the set of
|
|
||||||
// inherent impls is considered dirty.
|
|
||||||
//
|
|
||||||
// [the plan]: https://github.com/rust-lang/rust-roadmap/issues/4
|
|
||||||
|
|
||||||
let result = tcx.dep_graph.with_ignore(|| {
|
|
||||||
let crate_map = tcx.crate_inherent_impls(ty_def_id.krate);
|
|
||||||
match crate_map.inherent_impls.get(&ty_def_id) {
|
|
||||||
Some(v) => &v[..],
|
|
||||||
None => &[],
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
for &impl_def_id in &result[..] {
|
|
||||||
let def_path_hash = tcx.def_path_hash(impl_def_id);
|
|
||||||
tcx.dep_graph.read(def_path_hash.to_dep_node(DepKind::Hir));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct InherentCollect<'tcx> {
|
struct InherentCollect<'tcx> {
|
||||||
|
Loading…
Reference in New Issue
Block a user