1 use crate::rustc_middle::ty::DefIdTree;
2 use rustc_hir::{self as hir, def::DefKind, def_id::DefId};
3 use rustc_middle::ty::{self, Ty, TyCtxt};
4 use rustc_span::{Span, DUMMY_SP};
6 pub fn provide(providers: &mut ty::query::Providers) {
7 *providers = ty::query::Providers { assumed_wf_types, ..*providers };
10 fn assumed_wf_types(tcx: TyCtxt<'_>, def_id: DefId) -> &[(Ty<'_>, Span)] {
11 match tcx.def_kind(def_id) {
13 let sig = tcx.fn_sig(def_id);
14 let liberated_sig = tcx.liberate_late_bound_regions(def_id, sig);
15 if let Some(node) = tcx.hir().get_if_local(def_id)
16 && let Some(decl) = node.fn_decl()
18 assert_eq!(decl.inputs.len(), liberated_sig.inputs().len());
19 tcx.arena.alloc_from_iter(std::iter::zip(
20 liberated_sig.inputs_and_output,
21 decl.inputs.iter().map(|ty| ty.span).chain([decl.output.span()]),
24 tcx.arena.alloc_from_iter(
25 liberated_sig.inputs_and_output.iter().map(|ty| (ty, DUMMY_SP)),
30 let sig = tcx.fn_sig(def_id);
31 let liberated_sig = tcx.liberate_late_bound_regions(def_id, sig);
32 let assumed_wf_types = tcx.assumed_wf_types(tcx.parent(def_id));
33 if let Some(node) = tcx.hir().get_if_local(def_id)
34 && let Some(decl) = node.fn_decl()
36 assert_eq!(decl.inputs.len(), liberated_sig.inputs().len());
37 tcx.arena.alloc_from_iter(assumed_wf_types.iter().copied().chain(std::iter::zip(
38 liberated_sig.inputs_and_output,
39 decl.inputs.iter().map(|ty| ty.span).chain([decl.output.span()]),
42 tcx.arena.alloc_from_iter(assumed_wf_types.iter().copied().chain(
43 liberated_sig.inputs_and_output.iter().map(|ty| (ty, DUMMY_SP)),
47 DefKind::Impl => match tcx.impl_trait_ref(def_id) {
49 let types: Vec<_> = trait_ref.substs.types().collect();
50 let self_span = if let Some(hir::Node::Item(hir::Item {
51 kind: hir::ItemKind::Impl(impl_),
53 })) = tcx.hir().get_if_local(def_id)
59 tcx.arena.alloc_from_iter(std::iter::zip(
61 // FIXME: reliable way of getting trait ref substs...
62 [self_span].into_iter().chain(std::iter::repeat(DUMMY_SP)),
65 // Only the impl self type
67 let span = if let Some(hir::Node::Item(hir::Item {
68 kind: hir::ItemKind::Impl(impl_),
70 })) = tcx.hir().get_if_local(def_id)
76 tcx.arena.alloc_from_iter([(tcx.type_of(def_id), span)])
79 DefKind::AssocConst | DefKind::AssocTy => tcx.assumed_wf_types(tcx.parent(def_id)),
95 | DefKind::ExternCrate
99 | DefKind::InlineConst
101 | DefKind::ImplTraitPlaceholder
103 | DefKind::LifetimeParam
106 | DefKind::Generator => &[],