Add tcx.visible_traits()
and use it for producing diagnostics
Add an alternative to `tcx.all_traits()` that only shows traits that the user might be able to use, for diagnostic purposes. With this available, make use of it for diagnostics including associated type errors, which is part of the problem with [1]. Includes a few comment updates for related API. [1]: https://github.com/rust-lang/rust/issues/135232
This commit is contained in:
parent
9c34253762
commit
2da9accab9
5 changed files with 23 additions and 4 deletions
|
@ -179,7 +179,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
// all visible traits. If there's one clear winner, just suggest that.
|
||||
|
||||
let visible_traits: Vec<_> = tcx
|
||||
.all_traits()
|
||||
.visible_traits()
|
||||
.filter(|trait_def_id| {
|
||||
let viz = tcx.visibility(*trait_def_id);
|
||||
let def_id = self.item_def_id();
|
||||
|
|
|
@ -2128,6 +2128,8 @@ rustc_queries! {
|
|||
eval_always
|
||||
desc { "calculating the stability index for the local crate" }
|
||||
}
|
||||
/// All available crates in the graph, including those that should not be user-facing
|
||||
/// (such as private crates).
|
||||
query crates(_: ()) -> &'tcx [CrateNum] {
|
||||
eval_always
|
||||
desc { "fetching all foreign CrateNum instances" }
|
||||
|
|
|
@ -2078,12 +2078,23 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
self.limits(()).move_size_limit
|
||||
}
|
||||
|
||||
/// All traits in the crate graph, including those not visible to the user.
|
||||
pub fn all_traits(self) -> impl Iterator<Item = DefId> + 'tcx {
|
||||
iter::once(LOCAL_CRATE)
|
||||
.chain(self.crates(()).iter().copied())
|
||||
.flat_map(move |cnum| self.traits(cnum).iter().copied())
|
||||
}
|
||||
|
||||
/// All traits that are visible within the crate graph (i.e. excluding private dependencies).
|
||||
pub fn visible_traits(self) -> impl Iterator<Item = DefId> + 'tcx {
|
||||
let visible_crates =
|
||||
self.crates(()).iter().copied().filter(move |cnum| self.is_user_visible_dep(*cnum));
|
||||
|
||||
iter::once(LOCAL_CRATE)
|
||||
.chain(visible_crates)
|
||||
.flat_map(move |cnum| self.traits(cnum).iter().copied())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn local_visibility(self, def_id: LocalDefId) -> Visibility {
|
||||
self.visibility(def_id).expect_local()
|
||||
|
|
|
@ -79,8 +79,14 @@ fn all_diagnostic_items(tcx: TyCtxt<'_>, (): ()) -> DiagnosticItems {
|
|||
// Initialize the collector.
|
||||
let mut items = DiagnosticItems::default();
|
||||
|
||||
// Collect diagnostic items in other crates.
|
||||
for &cnum in tcx.crates(()).iter().chain(std::iter::once(&LOCAL_CRATE)) {
|
||||
// Collect diagnostic items in visible crates.
|
||||
for cnum in tcx
|
||||
.crates(())
|
||||
.iter()
|
||||
.copied()
|
||||
.filter(|cnum| tcx.is_user_visible_dep(*cnum))
|
||||
.chain(std::iter::once(LOCAL_CRATE))
|
||||
{
|
||||
for (&name, &def_id) in &tcx.diagnostic_items(cnum).name_to_id {
|
||||
collect_item(tcx, &mut items, name, def_id);
|
||||
}
|
||||
|
|
|
@ -2189,7 +2189,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
let required_trait_path = self.tcx.def_path_str(trait_ref.def_id());
|
||||
let traits_with_same_path: UnordSet<_> = self
|
||||
.tcx
|
||||
.all_traits()
|
||||
.visible_traits()
|
||||
.filter(|trait_def_id| *trait_def_id != trait_ref.def_id())
|
||||
.map(|trait_def_id| (self.tcx.def_path_str(trait_def_id), trait_def_id))
|
||||
.filter(|(p, _)| *p == required_trait_path)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue