1
1
use chalk_ir:: cast:: { Cast , Caster } ;
2
- use chalk_ir:: interner:: ChalkIr ;
2
+ use chalk_ir:: interner:: { ChalkIr , HasInterner } ;
3
3
use chalk_ir:: {
4
- self , AssocTypeId , BoundVar , ClausePriority , DebruijnIndex , ImplId , OpaqueTyId ,
4
+ self , AssocTypeId , BoundVar , ClausePriority , DebruijnIndex , ImplId , OpaqueTyId , ParameterKinds ,
5
5
QuantifiedWhereClauses , StructId , Substitution , TraitId ,
6
6
} ;
7
7
use chalk_parse:: ast:: * ;
@@ -174,11 +174,16 @@ impl<'k> Env<'k> {
174
174
where
175
175
I : IntoIterator < Item = chalk_ir:: ParameterKind < Ident > > ,
176
176
I :: IntoIter : ExactSizeIterator ,
177
+ T : HasInterner < Interner = ChalkIr > ,
177
178
OP : FnOnce ( & Self ) -> LowerResult < T > ,
178
179
{
180
+ let interner = & ChalkIr ;
179
181
let binders: Vec < _ > = binders. into_iter ( ) . collect ( ) ;
180
182
let env = self . introduce ( binders. iter ( ) . cloned ( ) ) ?;
181
- Ok ( chalk_ir:: Binders :: new ( binders. anonymize ( ) , op ( & env) ?) )
183
+ Ok ( chalk_ir:: Binders :: new (
184
+ ParameterKinds :: from ( interner, binders. anonymize ( ) ) ,
185
+ op ( & env) ?,
186
+ ) )
182
187
}
183
188
}
184
189
@@ -594,10 +599,14 @@ trait LowerWhereClauses {
594
599
595
600
impl LowerTypeKind for StructDefn {
596
601
fn lower_type_kind ( & self ) -> LowerResult < TypeKind > {
602
+ let interner = & ChalkIr ;
597
603
Ok ( TypeKind {
598
604
sort : TypeSort :: Struct ,
599
605
name : self . name . str ,
600
- binders : chalk_ir:: Binders :: new ( self . all_parameters ( ) . anonymize ( ) , ( ) ) ,
606
+ binders : chalk_ir:: Binders :: new (
607
+ ParameterKinds :: from ( interner, self . all_parameters ( ) . anonymize ( ) ) ,
608
+ crate :: Unit ,
609
+ ) ,
601
610
} )
602
611
}
603
612
}
@@ -610,26 +619,31 @@ impl LowerWhereClauses for StructDefn {
610
619
611
620
impl LowerTypeKind for TraitDefn {
612
621
fn lower_type_kind ( & self ) -> LowerResult < TypeKind > {
622
+ let interner = & ChalkIr ;
613
623
let binders: Vec < _ > = self . parameter_kinds . iter ( ) . map ( |p| p. lower ( ) ) . collect ( ) ;
614
624
Ok ( TypeKind {
615
625
sort : TypeSort :: Trait ,
616
626
name : self . name . str ,
617
627
binders : chalk_ir:: Binders :: new (
618
628
// for the purposes of the *type*, ignore `Self`:
619
- binders. anonymize ( ) ,
620
- ( ) ,
629
+ ParameterKinds :: from ( interner , binders. anonymize ( ) ) ,
630
+ crate :: Unit ,
621
631
) ,
622
632
} )
623
633
}
624
634
}
625
635
626
636
impl LowerTypeKind for OpaqueTyDefn {
627
637
fn lower_type_kind ( & self ) -> LowerResult < TypeKind > {
638
+ let interner = & ChalkIr ;
628
639
let binders: Vec < _ > = self . parameter_kinds . iter ( ) . map ( |p| p. lower ( ) ) . collect ( ) ;
629
640
Ok ( TypeKind {
630
641
sort : TypeSort :: Opaque ,
631
642
name : self . identifier . str ,
632
- binders : chalk_ir:: Binders :: new ( binders. anonymize ( ) , ( ) ) ,
643
+ binders : chalk_ir:: Binders :: new (
644
+ ParameterKinds :: from ( interner, binders. anonymize ( ) ) ,
645
+ crate :: Unit ,
646
+ ) ,
633
647
} )
634
648
}
635
649
}
@@ -835,6 +849,7 @@ trait LowerTraitBound {
835
849
836
850
impl LowerTraitBound for TraitBound {
837
851
fn lower ( & self , env : & Env ) -> LowerResult < rust_ir:: TraitBound < ChalkIr > > {
852
+ let interner = & ChalkIr ;
838
853
let trait_id = env. lookup_trait ( self . trait_name ) ?;
839
854
840
855
let k = env. trait_kind ( trait_id) ;
@@ -848,15 +863,15 @@ impl LowerTraitBound for TraitBound {
848
863
. map ( |a| Ok ( a. lower ( env) ?) )
849
864
. collect :: < LowerResult < Vec < _ > > > ( ) ?;
850
865
851
- if parameters. len ( ) != k. binders . len ( ) {
866
+ if parameters. len ( ) != k. binders . len ( interner ) {
852
867
Err ( RustIrError :: IncorrectNumberOfTypeParameters {
853
868
identifier : self . trait_name ,
854
- expected : k. binders . len ( ) ,
869
+ expected : k. binders . len ( interner ) ,
855
870
actual : parameters. len ( ) ,
856
871
} ) ?;
857
872
}
858
873
859
- for ( binder, param) in k. binders . binders . iter ( ) . zip ( parameters. iter ( ) ) {
874
+ for ( binder, param) in k. binders . binders . iter ( interner ) . zip ( parameters. iter ( ) ) {
860
875
if binder. kind ( ) != param. kind ( ) {
861
876
Err ( RustIrError :: IncorrectTraitParameterKind {
862
877
identifier : self . trait_name ,
@@ -1062,10 +1077,10 @@ impl LowerTy for Ty {
1062
1077
Ty :: Id { name } => match env. lookup_type ( name) ? {
1063
1078
TypeLookup :: Struct ( id) => {
1064
1079
let k = env. struct_kind ( id) ;
1065
- if k. binders . len ( ) > 0 {
1080
+ if k. binders . len ( interner ) > 0 {
1066
1081
Err ( RustIrError :: IncorrectNumberOfTypeParameters {
1067
1082
identifier : name,
1068
- expected : k. binders . len ( ) ,
1083
+ expected : k. binders . len ( interner ) ,
1069
1084
actual : 0 ,
1070
1085
} )
1071
1086
} else {
@@ -1118,10 +1133,10 @@ impl LowerTy for Ty {
1118
1133
} ;
1119
1134
1120
1135
let k = env. struct_kind ( id) ;
1121
- if k. binders . len ( ) != args. len ( ) {
1136
+ if k. binders . len ( interner ) != args. len ( ) {
1122
1137
Err ( RustIrError :: IncorrectNumberOfTypeParameters {
1123
1138
identifier : name,
1124
- expected : k. binders . len ( ) ,
1139
+ expected : k. binders . len ( interner ) ,
1125
1140
actual : args. len ( ) ,
1126
1141
} ) ?;
1127
1142
}
@@ -1131,7 +1146,7 @@ impl LowerTy for Ty {
1131
1146
args. iter ( ) . map ( |t| Ok ( t. lower ( env) ?) ) ,
1132
1147
) ?;
1133
1148
1134
- for ( param, arg) in k. binders . binders . iter ( ) . zip ( args. iter ( ) ) {
1149
+ for ( param, arg) in k. binders . binders . iter ( interner ) . zip ( args. iter ( ) ) {
1135
1150
if param. kind ( ) != arg. kind ( ) {
1136
1151
Err ( RustIrError :: IncorrectParameterKind {
1137
1152
identifier : name,
@@ -1362,14 +1377,16 @@ pub trait LowerGoal<A> {
1362
1377
1363
1378
impl LowerGoal < LoweredProgram > for Goal {
1364
1379
fn lower ( & self , program : & LoweredProgram ) -> LowerResult < chalk_ir:: Goal < ChalkIr > > {
1380
+ let interner = & ChalkIr ;
1365
1381
let associated_ty_lookups: BTreeMap < _ , _ > = program
1366
1382
. associated_ty_data
1367
1383
. iter ( )
1368
1384
. map ( |( & associated_ty_id, datum) | {
1369
1385
let trait_datum = & program. trait_data [ & datum. trait_id ] ;
1370
- let num_trait_params = trait_datum. binders . len ( ) ;
1371
- let num_addl_params = datum. binders . len ( ) - num_trait_params;
1372
- let addl_parameter_kinds = datum. binders . binders [ ..num_addl_params] . to_owned ( ) ;
1386
+ let num_trait_params = trait_datum. binders . len ( interner) ;
1387
+ let num_addl_params = datum. binders . len ( interner) - num_trait_params;
1388
+ let addl_parameter_kinds =
1389
+ datum. binders . binders . as_slice ( interner) [ ..num_addl_params] . to_owned ( ) ;
1373
1390
let lookup = AssociatedTyLookup {
1374
1391
id : associated_ty_id,
1375
1392
addl_parameter_kinds,
0 commit comments