1 use crate::clauses
::builtin_traits
::needs_impl_for_tys
;
2 use crate::clauses
::ClauseBuilder
;
3 use crate::{Interner, RustIrDatabase, TraitRef}
;
5 ApplicationTy
, CanonicalVarKinds
, Substitution
, TyData
, TyKind
, TypeName
, VariableKind
,
8 use tracing
::instrument
;
10 fn push_tuple_copy_conditions
<I
: Interner
>(
11 db
: &dyn RustIrDatabase
<I
>,
12 builder
: &mut ClauseBuilder
<'_
, I
>,
13 trait_ref
: &TraitRef
<I
>,
15 substitution
: &Substitution
<I
>,
17 // Empty tuples are always Copy
19 builder
.push_fact(trait_ref
.clone());
23 let interner
= db
.interner();
31 .map(|param
| param
.assert_ty_ref(interner
).clone()),
35 #[instrument(skip(db, builder))]
36 pub fn add_copy_program_clauses
<I
: Interner
>(
37 db
: &dyn RustIrDatabase
<I
>,
38 builder
: &mut ClauseBuilder
<'_
, I
>,
39 trait_ref
: &TraitRef
<I
>,
41 binders
: &CanonicalVarKinds
<I
>,
44 TyData
::Apply(ApplicationTy { name, substitution }
) => match name
{
45 TypeName
::Tuple(arity
) => {
46 push_tuple_copy_conditions(db
, builder
, trait_ref
, *arity
, substitution
)
49 let interner
= db
.interner();
54 iter
::once(substitution
.at(interner
, 0).assert_ty_ref(interner
).clone()),
57 TypeName
::FnDef(_
) => {
58 builder
.push_fact(trait_ref
.clone());
60 TypeName
::Closure(closure_id
) => {
61 let closure_fn_substitution
= db
.closure_fn_substitution(*closure_id
, substitution
);
62 let upvars
= db
.closure_upvars(*closure_id
, substitution
);
63 let upvars
= upvars
.substitute(db
.interner(), &closure_fn_substitution
);
64 needs_impl_for_tys(db
, builder
, trait_ref
, Some(upvars
).into_iter());
67 // these impls are in libcore
75 | TypeName
::AssociatedType(_
)
77 | TypeName
::OpaqueType(_
)
78 | TypeName
::Error
=> {}
81 TyData
::Function(_
) => builder
.push_fact(trait_ref
.clone()),
83 TyData
::InferenceVar(_
, kind
) => match kind
{
84 TyKind
::Integer
| TyKind
::Float
=> builder
.push_fact(trait_ref
.clone()),
88 TyData
::BoundVar(bound_var
) => {
89 let var_kind
= &binders
.at(db
.interner(), bound_var
.index
).kind
;
91 VariableKind
::Ty(TyKind
::Integer
) | VariableKind
::Ty(TyKind
::Float
) => {
92 builder
.push_fact(trait_ref
.clone())
94 VariableKind
::Ty(_
) | VariableKind
::Const(_
) | VariableKind
::Lifetime
=> {}
98 TyData
::Alias(_
) | TyData
::Dyn(_
) | TyData
::Placeholder(_
) => {}