1
1
use super :: { builder:: ClauseBuilder , generalize} ;
2
2
use crate :: { Interner , RustIrDatabase , TraitRef , WellKnownTrait } ;
3
- use chalk_ir:: { ProjectionTy , Substitution , Ty } ;
3
+ use chalk_ir:: { ProjectionTy , Substitution , Ty , AliasTy } ;
4
4
5
5
mod clone;
6
6
mod copy;
7
- mod fn_ ;
7
+ mod fn_family ;
8
8
mod sized;
9
9
10
10
/// For well known traits we have special hard-coded impls, either as an
@@ -34,7 +34,7 @@ pub fn add_builtin_program_clauses<I: Interner>(
34
34
WellKnownTrait :: Copy => copy:: add_copy_program_clauses ( db, builder, & trait_ref, ty) ,
35
35
WellKnownTrait :: Clone => clone:: add_clone_program_clauses ( db, builder, & trait_ref, ty) ,
36
36
WellKnownTrait :: FnOnce | WellKnownTrait :: FnMut | WellKnownTrait :: Fn => {
37
- fn_ :: add_fn_trait_program_clauses ( db, builder, trait_ref. trait_id , ty, false )
37
+ fn_family :: add_fn_trait_program_clauses ( db, builder, trait_ref. trait_id , ty)
38
38
}
39
39
// Drop impls are provided explicitly
40
40
WellKnownTrait :: Drop => ( ) ,
@@ -53,13 +53,9 @@ pub fn add_builtin_assoc_program_clauses<I: Interner>(
53
53
match well_known {
54
54
WellKnownTrait :: FnOnce => {
55
55
let interner = db. interner ( ) ;
56
- let self_ty = proj
57
- . substitution
58
- . at ( interner, 0 )
59
- . assert_ty_ref ( interner)
60
- . data ( interner) ;
56
+ let self_ty = AliasTy :: Projection ( proj. clone ( ) ) . self_type_parameter ( interner) ;
61
57
let trait_id = db. well_known_trait_id ( well_known) . unwrap ( ) ;
62
- fn_ :: add_fn_trait_program_clauses ( db, builder, trait_id, self_ty, true ) ;
58
+ fn_family :: add_fn_trait_program_clauses ( db, builder, trait_id, self_ty. data ( interner ) ) ;
63
59
}
64
60
_ => { }
65
61
}
0 commit comments