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 ,
5
- QuantifiedWhereClauses , StructId , Substitution , TraitId ,
4
+ self , AssocTypeId , BoundVar , ClausePriority , DebruijnIndex , ImplId , OpaqueTyId , ParameterKinds , QuantifiedWhereClauses ,
5
+ StructId , Substitution , TraitId ,
6
6
} ;
7
7
use chalk_parse:: ast:: * ;
8
8
use chalk_rust_ir as rust_ir;
@@ -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,14 +619,15 @@ 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
}
@@ -835,6 +845,7 @@ trait LowerTraitBound {
835
845
836
846
impl LowerTraitBound for TraitBound {
837
847
fn lower ( & self , env : & Env ) -> LowerResult < rust_ir:: TraitBound < ChalkIr > > {
848
+ let interner = & ChalkIr ;
838
849
let trait_id = env. lookup_trait ( self . trait_name ) ?;
839
850
840
851
let k = env. trait_kind ( trait_id) ;
@@ -848,15 +859,15 @@ impl LowerTraitBound for TraitBound {
848
859
. map ( |a| Ok ( a. lower ( env) ?) )
849
860
. collect :: < LowerResult < Vec < _ > > > ( ) ?;
850
861
851
- if parameters. len ( ) != k. binders . len ( ) {
862
+ if parameters. len ( ) != k. binders . len ( interner ) {
852
863
Err ( RustIrError :: IncorrectNumberOfTypeParameters {
853
864
identifier : self . trait_name ,
854
- expected : k. binders . len ( ) ,
865
+ expected : k. binders . len ( interner ) ,
855
866
actual : parameters. len ( ) ,
856
867
} ) ?;
857
868
}
858
869
859
- for ( binder, param) in k. binders . binders . iter ( ) . zip ( parameters. iter ( ) ) {
870
+ for ( binder, param) in k. binders . binders . iter ( interner ) . zip ( parameters. iter ( ) ) {
860
871
if binder. kind ( ) != param. kind ( ) {
861
872
Err ( RustIrError :: IncorrectTraitParameterKind {
862
873
identifier : self . trait_name ,
@@ -1062,10 +1073,10 @@ impl LowerTy for Ty {
1062
1073
Ty :: Id { name } => match env. lookup_type ( name) ? {
1063
1074
TypeLookup :: Struct ( id) => {
1064
1075
let k = env. struct_kind ( id) ;
1065
- if k. binders . len ( ) > 0 {
1076
+ if k. binders . len ( interner ) > 0 {
1066
1077
Err ( RustIrError :: IncorrectNumberOfTypeParameters {
1067
1078
identifier : name,
1068
- expected : k. binders . len ( ) ,
1079
+ expected : k. binders . len ( interner ) ,
1069
1080
actual : 0 ,
1070
1081
} )
1071
1082
} else {
@@ -1118,10 +1129,10 @@ impl LowerTy for Ty {
1118
1129
} ;
1119
1130
1120
1131
let k = env. struct_kind ( id) ;
1121
- if k. binders . len ( ) != args. len ( ) {
1132
+ if k. binders . len ( interner ) != args. len ( ) {
1122
1133
Err ( RustIrError :: IncorrectNumberOfTypeParameters {
1123
1134
identifier : name,
1124
- expected : k. binders . len ( ) ,
1135
+ expected : k. binders . len ( interner ) ,
1125
1136
actual : args. len ( ) ,
1126
1137
} ) ?;
1127
1138
}
@@ -1131,7 +1142,7 @@ impl LowerTy for Ty {
1131
1142
args. iter ( ) . map ( |t| Ok ( t. lower ( env) ?) ) ,
1132
1143
) ?;
1133
1144
1134
- for ( param, arg) in k. binders . binders . iter ( ) . zip ( args. iter ( ) ) {
1145
+ for ( param, arg) in k. binders . binders . iter ( interner ) . zip ( args. iter ( ) ) {
1135
1146
if param. kind ( ) != arg. kind ( ) {
1136
1147
Err ( RustIrError :: IncorrectParameterKind {
1137
1148
identifier : name,
@@ -1362,14 +1373,16 @@ pub trait LowerGoal<A> {
1362
1373
1363
1374
impl LowerGoal < LoweredProgram > for Goal {
1364
1375
fn lower ( & self , program : & LoweredProgram ) -> LowerResult < chalk_ir:: Goal < ChalkIr > > {
1376
+ let interner = & ChalkIr ;
1365
1377
let associated_ty_lookups: BTreeMap < _ , _ > = program
1366
1378
. associated_ty_data
1367
1379
. iter ( )
1368
1380
. map ( |( & associated_ty_id, datum) | {
1369
1381
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 ( ) ;
1382
+ let num_trait_params = trait_datum. binders . len ( interner) ;
1383
+ let num_addl_params = datum. binders . len ( interner) - num_trait_params;
1384
+ let addl_parameter_kinds =
1385
+ datum. binders . binders . as_slice ( interner) [ ..num_addl_params] . to_owned ( ) ;
1373
1386
let lookup = AssociatedTyLookup {
1374
1387
id : associated_ty_id,
1375
1388
addl_parameter_kinds,
0 commit comments