@@ -4,6 +4,7 @@ use std::iter;
4
4
5
5
use chalk_ir:: {
6
6
cast:: { Cast , CastTo , Caster } ,
7
+ fold:: Fold ,
7
8
interner:: HasInterner ,
8
9
AdtId , BoundVar , DebruijnIndex , Safety , Scalar ,
9
10
} ;
@@ -32,8 +33,7 @@ impl<D> TyBuilder<D> {
32
33
33
34
fn build_internal ( self ) -> ( D , Substitution ) {
34
35
assert_eq ! ( self . vec. len( ) , self . param_count) ;
35
- // FIXME: would be good to have a way to construct a chalk_ir::Substitution from the interned form
36
- let subst = Substitution :: intern ( self . vec ) ;
36
+ let subst = Substitution :: from_iter ( & Interner , self . vec ) ;
37
37
( self . data , subst)
38
38
}
39
39
@@ -141,7 +141,7 @@ impl TyBuilder<hir_def::AdtId> {
141
141
self . vec . push ( fallback ( ) . cast ( & Interner ) ) ;
142
142
} else {
143
143
// each default can depend on the previous parameters
144
- let subst_so_far = Substitution :: intern ( self . vec . clone ( ) ) ;
144
+ let subst_so_far = Substitution :: from_iter ( & Interner , self . vec . clone ( ) ) ;
145
145
self . vec
146
146
. push ( default_ty. clone ( ) . substitute ( & Interner , & subst_so_far) . cast ( & Interner ) ) ;
147
147
}
@@ -196,13 +196,13 @@ impl TyBuilder<TypeAliasId> {
196
196
}
197
197
}
198
198
199
- impl < T : TypeWalk + HasInterner < Interner = Interner > > TyBuilder < Binders < T > > {
199
+ impl < T : HasInterner < Interner = Interner > + Fold < Interner > > TyBuilder < Binders < T > > {
200
200
fn subst_binders ( b : Binders < T > ) -> Self {
201
201
let param_count = b. binders . len ( & Interner ) ;
202
202
TyBuilder :: new ( b, param_count)
203
203
}
204
204
205
- pub fn build ( self ) -> T {
205
+ pub fn build ( self ) -> < T as Fold < Interner > > :: Result {
206
206
let ( b, subst) = self . build_internal ( ) ;
207
207
b. substitute ( & Interner , & subst)
208
208
}
0 commit comments