@@ -523,35 +523,36 @@ where
523
523
}
524
524
525
525
pub fn callable_sig_from_fnonce (
526
- self_ty : & Canonical < Ty > ,
526
+ self_ty : & Ty ,
527
527
env : Arc < TraitEnvironment > ,
528
528
db : & dyn HirDatabase ,
529
529
) -> Option < CallableSig > {
530
530
let krate = env. krate ;
531
531
let fn_once_trait = FnTrait :: FnOnce . get_id ( db, krate) ?;
532
532
let output_assoc_type = db. trait_data ( fn_once_trait) . associated_type_by_name ( & name ! [ Output ] ) ?;
533
533
534
- let mut kinds = self_ty. binders . interned ( ) . to_vec ( ) ;
535
534
let b = TyBuilder :: trait_ref ( db, fn_once_trait) ;
536
535
if b. remaining ( ) != 2 {
537
536
return None ;
538
537
}
539
- let fn_once = b
540
- . push ( self_ty. value . clone ( ) )
541
- . fill_with_bound_vars ( DebruijnIndex :: INNERMOST , kinds. len ( ) )
542
- . build ( ) ;
543
- kinds. extend ( fn_once. substitution . iter ( Interner ) . skip ( 1 ) . map ( |x| {
544
- let vk = match x. data ( Interner ) {
545
- chalk_ir:: GenericArgData :: Ty ( _) => {
546
- chalk_ir:: VariableKind :: Ty ( chalk_ir:: TyVariableKind :: General )
547
- }
548
- chalk_ir:: GenericArgData :: Lifetime ( _) => chalk_ir:: VariableKind :: Lifetime ,
549
- chalk_ir:: GenericArgData :: Const ( c) => {
550
- chalk_ir:: VariableKind :: Const ( c. data ( Interner ) . ty . clone ( ) )
551
- }
552
- } ;
553
- chalk_ir:: WithKind :: new ( vk, UniverseIndex :: ROOT )
554
- } ) ) ;
538
+ let fn_once = b. push ( self_ty. clone ( ) ) . fill_with_bound_vars ( DebruijnIndex :: INNERMOST , 0 ) . build ( ) ;
539
+ let kinds = fn_once
540
+ . substitution
541
+ . iter ( Interner )
542
+ . skip ( 1 )
543
+ . map ( |x| {
544
+ let vk = match x. data ( Interner ) {
545
+ chalk_ir:: GenericArgData :: Ty ( _) => {
546
+ chalk_ir:: VariableKind :: Ty ( chalk_ir:: TyVariableKind :: General )
547
+ }
548
+ chalk_ir:: GenericArgData :: Lifetime ( _) => chalk_ir:: VariableKind :: Lifetime ,
549
+ chalk_ir:: GenericArgData :: Const ( c) => {
550
+ chalk_ir:: VariableKind :: Const ( c. data ( Interner ) . ty . clone ( ) )
551
+ }
552
+ } ;
553
+ chalk_ir:: WithKind :: new ( vk, UniverseIndex :: ROOT )
554
+ } )
555
+ . collect :: < Vec < _ > > ( ) ;
555
556
556
557
// FIXME: chalk refuses to solve `<Self as FnOnce<^0.0>>::Output == ^0.1`, so we first solve
557
558
// `<Self as FnOnce<^0.0>>` and then replace `^0.0` with the concrete argument tuple.
@@ -563,21 +564,16 @@ pub fn callable_sig_from_fnonce(
563
564
Some ( Solution :: Unique ( vars) ) => vars. value . subst ,
564
565
_ => return None ,
565
566
} ;
566
- let args = subst. at ( Interner , self_ty . binders . interned ( ) . len ( ) ) . ty ( Interner ) ?;
567
+ let args = subst. at ( Interner , 0 ) . ty ( Interner ) ?;
567
568
let params = match args. kind ( Interner ) {
568
569
chalk_ir:: TyKind :: Tuple ( _, subst) => {
569
570
subst. iter ( Interner ) . filter_map ( |arg| arg. ty ( Interner ) . cloned ( ) ) . collect :: < Vec < _ > > ( )
570
571
}
571
572
_ => return None ,
572
573
} ;
573
- if params. iter ( ) . any ( |ty| ty. is_unknown ( ) ) {
574
- return None ;
575
- }
576
574
577
- let fn_once = TyBuilder :: trait_ref ( db, fn_once_trait)
578
- . push ( self_ty. value . clone ( ) )
579
- . push ( args. clone ( ) )
580
- . build ( ) ;
575
+ let fn_once =
576
+ TyBuilder :: trait_ref ( db, fn_once_trait) . push ( self_ty. clone ( ) ) . push ( args. clone ( ) ) . build ( ) ;
581
577
let projection =
582
578
TyBuilder :: assoc_type_projection ( db, output_assoc_type, Some ( fn_once. substitution . clone ( ) ) )
583
579
. build ( ) ;
0 commit comments