11use chalk_ir:: cast:: { Cast , Caster } ;
2- use chalk_ir:: interner:: ChalkIr ;
2+ use chalk_ir:: interner:: { ChalkIr , HasInterner } ;
33use chalk_ir:: {
4- self , AssocTypeId , BoundVar , DebruijnIndex , ImplId , QuantifiedWhereClauses , StructId ,
5- Substitution , TraitId ,
4+ self , AssocTypeId , BoundVar , DebruijnIndex , ImplId , ParameterKinds , QuantifiedWhereClauses ,
5+ StructId , Substitution , TraitId ,
66} ;
77use chalk_parse:: ast:: * ;
88use chalk_rust_ir as rust_ir;
@@ -165,11 +165,16 @@ impl<'k> Env<'k> {
165165 where
166166 I : IntoIterator < Item = chalk_ir:: ParameterKind < Ident > > ,
167167 I :: IntoIter : ExactSizeIterator ,
168+ T : HasInterner < Interner = ChalkIr > ,
168169 OP : FnOnce ( & Self ) -> LowerResult < T > ,
169170 {
171+ let interner = & ChalkIr ;
170172 let binders: Vec < _ > = binders. into_iter ( ) . collect ( ) ;
171173 let env = self . introduce ( binders. iter ( ) . cloned ( ) ) ?;
172- Ok ( chalk_ir:: Binders :: new ( binders. anonymize ( ) , op ( & env) ?) )
174+ Ok ( chalk_ir:: Binders :: new (
175+ ParameterKinds :: from ( interner, binders. anonymize ( ) ) ,
176+ op ( & env) ?,
177+ ) )
173178 }
174179}
175180
@@ -522,10 +527,14 @@ trait LowerWhereClauses {
522527
523528impl LowerTypeKind for StructDefn {
524529 fn lower_type_kind ( & self ) -> LowerResult < TypeKind > {
530+ let interner = & ChalkIr ;
525531 Ok ( TypeKind {
526532 sort : TypeSort :: Struct ,
527533 name : self . name . str ,
528- binders : chalk_ir:: Binders :: new ( self . all_parameters ( ) . anonymize ( ) , ( ) ) ,
534+ binders : chalk_ir:: Binders :: new (
535+ ParameterKinds :: from ( interner, self . all_parameters ( ) . anonymize ( ) ) ,
536+ crate :: Unit ,
537+ ) ,
529538 } )
530539 }
531540}
@@ -538,14 +547,15 @@ impl LowerWhereClauses for StructDefn {
538547
539548impl LowerTypeKind for TraitDefn {
540549 fn lower_type_kind ( & self ) -> LowerResult < TypeKind > {
550+ let interner = & ChalkIr ;
541551 let binders: Vec < _ > = self . parameter_kinds . iter ( ) . map ( |p| p. lower ( ) ) . collect ( ) ;
542552 Ok ( TypeKind {
543553 sort : TypeSort :: Trait ,
544554 name : self . name . str ,
545555 binders : chalk_ir:: Binders :: new (
546556 // for the purposes of the *type*, ignore `Self`:
547- binders. anonymize ( ) ,
548- ( ) ,
557+ ParameterKinds :: from ( interner , binders. anonymize ( ) ) ,
558+ crate :: Unit ,
549559 ) ,
550560 } )
551561 }
@@ -751,6 +761,7 @@ trait LowerTraitBound {
751761
752762impl LowerTraitBound for TraitBound {
753763 fn lower ( & self , env : & Env ) -> LowerResult < rust_ir:: TraitBound < ChalkIr > > {
764+ let interner = & ChalkIr ;
754765 let trait_id = env. lookup_trait ( self . trait_name ) ?;
755766
756767 let k = env. trait_kind ( trait_id) ;
@@ -764,15 +775,15 @@ impl LowerTraitBound for TraitBound {
764775 . map ( |a| Ok ( a. lower ( env) ?) )
765776 . collect :: < LowerResult < Vec < _ > > > ( ) ?;
766777
767- if parameters. len ( ) != k. binders . len ( ) {
778+ if parameters. len ( ) != k. binders . len ( interner ) {
768779 Err ( RustIrError :: IncorrectNumberOfTypeParameters {
769780 identifier : self . trait_name ,
770- expected : k. binders . len ( ) ,
781+ expected : k. binders . len ( interner ) ,
771782 actual : parameters. len ( ) ,
772783 } ) ?;
773784 }
774785
775- for ( binder, param) in k. binders . binders . iter ( ) . zip ( parameters. iter ( ) ) {
786+ for ( binder, param) in k. binders . binders . iter ( interner ) . zip ( parameters. iter ( ) ) {
776787 if binder. kind ( ) != param. kind ( ) {
777788 Err ( RustIrError :: IncorrectTraitParameterKind {
778789 identifier : self . trait_name ,
@@ -978,10 +989,10 @@ impl LowerTy for Ty {
978989 Ty :: Id { name } => match env. lookup_type ( name) ? {
979990 TypeLookup :: Struct ( id) => {
980991 let k = env. struct_kind ( id) ;
981- if k. binders . len ( ) > 0 {
992+ if k. binders . len ( interner ) > 0 {
982993 Err ( RustIrError :: IncorrectNumberOfTypeParameters {
983994 identifier : name,
984- expected : k. binders . len ( ) ,
995+ expected : k. binders . len ( interner ) ,
985996 actual : 0 ,
986997 } )
987998 } else {
@@ -1025,10 +1036,10 @@ impl LowerTy for Ty {
10251036 } ;
10261037
10271038 let k = env. struct_kind ( id) ;
1028- if k. binders . len ( ) != args. len ( ) {
1039+ if k. binders . len ( interner ) != args. len ( ) {
10291040 Err ( RustIrError :: IncorrectNumberOfTypeParameters {
10301041 identifier : name,
1031- expected : k. binders . len ( ) ,
1042+ expected : k. binders . len ( interner ) ,
10321043 actual : args. len ( ) ,
10331044 } ) ?;
10341045 }
@@ -1038,7 +1049,7 @@ impl LowerTy for Ty {
10381049 args. iter ( ) . map ( |t| Ok ( t. lower ( env) ?) ) ,
10391050 ) ?;
10401051
1041- for ( param, arg) in k. binders . binders . iter ( ) . zip ( args. iter ( ) ) {
1052+ for ( param, arg) in k. binders . binders . iter ( interner ) . zip ( args. iter ( ) ) {
10421053 if param. kind ( ) != arg. kind ( ) {
10431054 Err ( RustIrError :: IncorrectParameterKind {
10441055 identifier : name,
@@ -1267,14 +1278,16 @@ pub trait LowerGoal<A> {
12671278
12681279impl LowerGoal < LoweredProgram > for Goal {
12691280 fn lower ( & self , program : & LoweredProgram ) -> LowerResult < chalk_ir:: Goal < ChalkIr > > {
1281+ let interner = & ChalkIr ;
12701282 let associated_ty_lookups: BTreeMap < _ , _ > = program
12711283 . associated_ty_data
12721284 . iter ( )
12731285 . map ( |( & associated_ty_id, datum) | {
12741286 let trait_datum = & program. trait_data [ & datum. trait_id ] ;
1275- let num_trait_params = trait_datum. binders . len ( ) ;
1276- let num_addl_params = datum. binders . len ( ) - num_trait_params;
1277- let addl_parameter_kinds = datum. binders . binders [ ..num_addl_params] . to_owned ( ) ;
1287+ let num_trait_params = trait_datum. binders . len ( interner) ;
1288+ let num_addl_params = datum. binders . len ( interner) - num_trait_params;
1289+ let addl_parameter_kinds =
1290+ datum. binders . binders . as_slice ( interner) [ ..num_addl_params] . to_owned ( ) ;
12781291 let lookup = AssociatedTyLookup {
12791292 id : associated_ty_id,
12801293 addl_parameter_kinds,
0 commit comments