mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			62 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use crate::rustc_middle::ty::DefIdTree;
 | |
| use rustc_hir::{def::DefKind, def_id::DefId};
 | |
| use rustc_middle::ty::{self, Ty, TyCtxt};
 | |
| 
 | |
| pub fn provide(providers: &mut ty::query::Providers) {
 | |
|     *providers = ty::query::Providers { assumed_wf_types, ..*providers };
 | |
| }
 | |
| 
 | |
| fn assumed_wf_types<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx ty::List<Ty<'tcx>> {
 | |
|     match tcx.def_kind(def_id) {
 | |
|         DefKind::Fn => {
 | |
|             let sig = tcx.fn_sig(def_id);
 | |
|             let liberated_sig = tcx.liberate_late_bound_regions(def_id, sig);
 | |
|             liberated_sig.inputs_and_output
 | |
|         }
 | |
|         DefKind::AssocFn => {
 | |
|             let sig = tcx.fn_sig(def_id);
 | |
|             let liberated_sig = tcx.liberate_late_bound_regions(def_id, sig);
 | |
|             let mut assumed_wf_types: Vec<_> =
 | |
|                 tcx.assumed_wf_types(tcx.parent(def_id)).as_slice().into();
 | |
|             assumed_wf_types.extend(liberated_sig.inputs_and_output);
 | |
|             tcx.intern_type_list(&assumed_wf_types)
 | |
|         }
 | |
|         DefKind::Impl => match tcx.impl_trait_ref(def_id) {
 | |
|             Some(trait_ref) => {
 | |
|                 let types: Vec<_> = trait_ref.substs.types().collect();
 | |
|                 tcx.intern_type_list(&types)
 | |
|             }
 | |
|             // Only the impl self type
 | |
|             None => tcx.intern_type_list(&[tcx.type_of(def_id)]),
 | |
|         },
 | |
|         DefKind::AssocConst | DefKind::AssocTy => tcx.assumed_wf_types(tcx.parent(def_id)),
 | |
|         DefKind::Mod
 | |
|         | DefKind::Struct
 | |
|         | DefKind::Union
 | |
|         | DefKind::Enum
 | |
|         | DefKind::Variant
 | |
|         | DefKind::Trait
 | |
|         | DefKind::TyAlias
 | |
|         | DefKind::ForeignTy
 | |
|         | DefKind::TraitAlias
 | |
|         | DefKind::TyParam
 | |
|         | DefKind::Const
 | |
|         | DefKind::ConstParam
 | |
|         | DefKind::Static(_)
 | |
|         | DefKind::Ctor(_, _)
 | |
|         | DefKind::Macro(_)
 | |
|         | DefKind::ExternCrate
 | |
|         | DefKind::Use
 | |
|         | DefKind::ForeignMod
 | |
|         | DefKind::AnonConst
 | |
|         | DefKind::InlineConst
 | |
|         | DefKind::OpaqueTy
 | |
|         | DefKind::ImplTraitPlaceholder
 | |
|         | DefKind::Field
 | |
|         | DefKind::LifetimeParam
 | |
|         | DefKind::GlobalAsm
 | |
|         | DefKind::Closure
 | |
|         | DefKind::Generator => ty::List::empty(),
 | |
|     }
 | |
| }
 | 
