privacy: visit trait def id of projections
A refactoring in #117076 changed the `DefIdVisitorSkeleton` to avoid calling `visit_projection_ty` for `ty::Projection` aliases, and instead just iterate over the args - this makes sense, as `visit_projection_ty` will indirectly visit all of the same args, but in doing so, will also create a `TraitRef` containing the trait's `DefId`, which also gets visited. The trait's `DefId` isn't visited when we only visit the arguments without separating them into `TraitRef` and own args first. Signed-off-by: David Wood <david@davidtw.co>
This commit is contained in:
parent
5ea62560f2
commit
5d97724002
5 changed files with 89 additions and 19 deletions
|
@ -218,20 +218,21 @@ where
|
|||
return ControlFlow::Continue(());
|
||||
}
|
||||
|
||||
let kind = match kind {
|
||||
ty::Inherent | ty::Projection => "associated type",
|
||||
ty::Weak => "type alias",
|
||||
ty::Opaque => unreachable!(),
|
||||
};
|
||||
self.def_id_visitor.visit_def_id(
|
||||
data.def_id,
|
||||
kind,
|
||||
match kind {
|
||||
ty::Inherent | ty::Projection => "associated type",
|
||||
ty::Weak => "type alias",
|
||||
ty::Opaque => unreachable!(),
|
||||
},
|
||||
&LazyDefPathStr { def_id: data.def_id, tcx },
|
||||
)?;
|
||||
|
||||
// This will also visit args if necessary, so we don't need to recurse.
|
||||
return if V::SHALLOW {
|
||||
ControlFlow::Continue(())
|
||||
} else if kind == ty::Projection {
|
||||
self.visit_projection_ty(data)
|
||||
} else {
|
||||
data.args.iter().try_for_each(|subst| subst.visit_with(self))
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue