@@ -80,30 +80,34 @@ where
80
80
/// encountered when folding. By default, invokes
81
81
/// `super_fold_with`, which will in turn invoke the more
82
82
/// specialized folding methods below, like `fold_free_var_ty`.
83
- fn fold_ty ( & mut self , ty : & Ty < I > , binders : usize ) -> Fallible < Ty < TI > > {
84
- ty. super_fold_with ( self . as_dyn ( ) , binders )
83
+ fn fold_ty ( & mut self , ty : & Ty < I > , outer_binder : DebruijnIndex ) -> Fallible < Ty < TI > > {
84
+ ty. super_fold_with ( self . as_dyn ( ) , outer_binder )
85
85
}
86
86
87
87
/// Top-level callback: invoked for each `Lifetime<I>` that is
88
88
/// encountered when folding. By default, invokes
89
89
/// `super_fold_with`, which will in turn invoke the more
90
90
/// specialized folding methods below, like `fold_free_lifetime_ty`.
91
- fn fold_lifetime ( & mut self , lifetime : & Lifetime < I > , binders : usize ) -> Fallible < Lifetime < TI > > {
92
- lifetime. super_fold_with ( self . as_dyn ( ) , binders)
91
+ fn fold_lifetime (
92
+ & mut self ,
93
+ lifetime : & Lifetime < I > ,
94
+ outer_binder : DebruijnIndex ,
95
+ ) -> Fallible < Lifetime < TI > > {
96
+ lifetime. super_fold_with ( self . as_dyn ( ) , outer_binder)
93
97
}
94
98
95
99
/// Invoked for every program clause. By default, recursively folds the goals contents.
96
100
fn fold_program_clause (
97
101
& mut self ,
98
102
clause : & ProgramClause < I > ,
99
- binders : usize ,
103
+ outer_binder : DebruijnIndex ,
100
104
) -> Fallible < ProgramClause < TI > > {
101
- clause. super_fold_with ( self . as_dyn ( ) , binders )
105
+ clause. super_fold_with ( self . as_dyn ( ) , outer_binder )
102
106
}
103
107
104
108
/// Invoked for every goal. By default, recursively folds the goals contents.
105
- fn fold_goal ( & mut self , goal : & Goal < I > , binders : usize ) -> Fallible < Goal < TI > > {
106
- goal. super_fold_with ( self . as_dyn ( ) , binders )
109
+ fn fold_goal ( & mut self , goal : & Goal < I > , outer_binder : DebruijnIndex ) -> Fallible < Goal < TI > > {
110
+ goal. super_fold_with ( self . as_dyn ( ) , outer_binder )
107
111
}
108
112
109
113
/// If overridden to return true, then folding will panic if a
@@ -122,14 +126,18 @@ where
122
126
///
123
127
/// This should return a type suitable for a context with
124
128
/// `binders` in scope.
125
- fn fold_free_var_ty ( & mut self , bound_var : BoundVar , binders : usize ) -> Fallible < Ty < TI > > {
129
+ fn fold_free_var_ty (
130
+ & mut self ,
131
+ bound_var : BoundVar ,
132
+ outer_binder : DebruijnIndex ,
133
+ ) -> Fallible < Ty < TI > > {
126
134
if self . forbid_free_vars ( ) {
127
135
panic ! (
128
- "unexpected free variable with depth `{:?}` in {} binders " ,
129
- bound_var, binders
136
+ "unexpected free variable with depth `{:?}` with outer binder {:?} " ,
137
+ bound_var, outer_binder
130
138
)
131
139
} else {
132
- let bound_var = bound_var. shifted_in_by ( binders ) ;
140
+ let bound_var = bound_var. shifted_in_from ( outer_binder ) ;
133
141
Ok ( TyData :: < TI > :: BoundVar ( bound_var) . intern ( self . target_interner ( ) ) )
134
142
}
135
143
}
@@ -138,15 +146,15 @@ where
138
146
fn fold_free_var_lifetime (
139
147
& mut self ,
140
148
bound_var : BoundVar ,
141
- binders : usize ,
149
+ outer_binder : DebruijnIndex ,
142
150
) -> Fallible < Lifetime < TI > > {
143
151
if self . forbid_free_vars ( ) {
144
152
panic ! (
145
- "unexpected free variable with depth `{:?}` in {} binders " ,
146
- bound_var, binders
153
+ "unexpected free variable with depth `{:?}` with outer binder {:?} " ,
154
+ bound_var, outer_binder
147
155
)
148
156
} else {
149
- let bound_var = bound_var. shifted_in_by ( binders ) ;
157
+ let bound_var = bound_var. shifted_in_from ( outer_binder ) ;
150
158
Ok ( LifetimeData :: < TI > :: BoundVar ( bound_var) . intern ( self . target_interner ( ) ) )
151
159
}
152
160
}
@@ -164,10 +172,11 @@ where
164
172
///
165
173
/// - `universe` is the universe of the `TypeName::ForAll` that was found
166
174
/// - `binders` is the number of binders in scope
175
+ #[ allow( unused_variables) ]
167
176
fn fold_free_placeholder_ty (
168
177
& mut self ,
169
178
universe : PlaceholderIndex ,
170
- _binders : usize ,
179
+ outer_binder : DebruijnIndex ,
171
180
) -> Fallible < Ty < TI > > {
172
181
if self . forbid_free_placeholders ( ) {
173
182
panic ! ( "unexpected placeholder type `{:?}`" , universe)
@@ -177,10 +186,11 @@ where
177
186
}
178
187
179
188
/// As with `fold_free_placeholder_ty`, but for lifetimes.
189
+ #[ allow( unused_variables) ]
180
190
fn fold_free_placeholder_lifetime (
181
191
& mut self ,
182
192
universe : PlaceholderIndex ,
183
- _binders : usize ,
193
+ outer_binder : DebruijnIndex ,
184
194
) -> Fallible < Lifetime < TI > > {
185
195
if self . forbid_free_placeholders ( ) {
186
196
panic ! ( "unexpected placeholder lifetime `{:?}`" , universe)
@@ -203,7 +213,12 @@ where
203
213
///
204
214
/// - `universe` is the universe of the `TypeName::ForAll` that was found
205
215
/// - `binders` is the number of binders in scope
206
- fn fold_inference_ty ( & mut self , var : InferenceVar , _binders : usize ) -> Fallible < Ty < TI > > {
216
+ #[ allow( unused_variables) ]
217
+ fn fold_inference_ty (
218
+ & mut self ,
219
+ var : InferenceVar ,
220
+ outer_binder : DebruijnIndex ,
221
+ ) -> Fallible < Ty < TI > > {
207
222
if self . forbid_inference_vars ( ) {
208
223
panic ! ( "unexpected inference type `{:?}`" , var)
209
224
} else {
@@ -212,10 +227,11 @@ where
212
227
}
213
228
214
229
/// As with `fold_free_inference_ty`, but for lifetimes.
230
+ #[ allow( unused_variables) ]
215
231
fn fold_inference_lifetime (
216
232
& mut self ,
217
233
var : InferenceVar ,
218
- _binders : usize ,
234
+ outer_binder : DebruijnIndex ,
219
235
) -> Fallible < Lifetime < TI > > {
220
236
if self . forbid_inference_vars ( ) {
221
237
panic ! ( "unexpected inference lifetime `'{:?}`" , var)
@@ -260,7 +276,7 @@ pub trait Fold<I: Interner, TI: TargetInterner<I> = I>: Debug {
260
276
fn fold_with < ' i > (
261
277
& self ,
262
278
folder : & mut dyn Folder < ' i , I , TI > ,
263
- binders : usize ,
279
+ outer_binder : DebruijnIndex ,
264
280
) -> Fallible < Self :: Result >
265
281
where
266
282
I : ' i ,
@@ -274,7 +290,7 @@ pub trait SuperFold<I: Interner, TI: TargetInterner<I> = I>: Fold<I, TI> {
274
290
fn super_fold_with < ' i > (
275
291
& self ,
276
292
folder : & mut dyn Folder < ' i , I , TI > ,
277
- binders : usize ,
293
+ outer_binder : DebruijnIndex ,
278
294
) -> Fallible < Self :: Result >
279
295
where
280
296
I : ' i ,
@@ -290,13 +306,13 @@ impl<I: Interner, TI: TargetInterner<I>> Fold<I, TI> for Ty<I> {
290
306
fn fold_with < ' i > (
291
307
& self ,
292
308
folder : & mut dyn Folder < ' i , I , TI > ,
293
- binders : usize ,
309
+ outer_binder : DebruijnIndex ,
294
310
) -> Fallible < Self :: Result >
295
311
where
296
312
I : ' i ,
297
313
TI : ' i ,
298
314
{
299
- folder. fold_ty ( self , binders )
315
+ folder. fold_ty ( self , outer_binder )
300
316
}
301
317
}
302
318
@@ -309,7 +325,7 @@ where
309
325
fn super_fold_with < ' i > (
310
326
& self ,
311
327
folder : & mut dyn Folder < ' i , I , TI > ,
312
- binders : usize ,
328
+ outer_binder : DebruijnIndex ,
313
329
) -> Fallible < Ty < TI > >
314
330
where
315
331
I : ' i ,
@@ -318,36 +334,29 @@ where
318
334
let interner = folder. interner ( ) ;
319
335
match self . data ( interner) {
320
336
TyData :: BoundVar ( bound_var) => {
321
- if let Some ( bound_var1) = bound_var. shifted_out_by ( binders ) {
337
+ if let Some ( bound_var1) = bound_var. shifted_out_to ( outer_binder ) {
322
338
// This variable was bound outside of the binders
323
339
// that we have traversed during folding;
324
340
// therefore, it is free. Let the folder have a
325
341
// crack at it.
326
- folder. fold_free_var_ty ( bound_var1, binders )
342
+ folder. fold_free_var_ty ( bound_var1, outer_binder )
327
343
} else {
328
344
// This variable was bound within the binders that
329
345
// we folded over, so just return a bound
330
346
// variable.
331
347
Ok ( TyData :: < TI > :: BoundVar ( * bound_var) . intern ( folder. target_interner ( ) ) )
332
348
}
333
349
}
334
- TyData :: Dyn ( clauses) => {
335
- Ok ( TyData :: Dyn ( clauses. fold_with ( folder, binders) ?)
336
- . intern ( folder. target_interner ( ) ) )
337
- }
338
- TyData :: InferenceVar ( var) => folder. fold_inference_ty ( * var, binders) ,
339
- TyData :: Apply ( apply) => {
340
- Ok ( TyData :: Apply ( apply. fold_with ( folder, binders) ?)
341
- . intern ( folder. target_interner ( ) ) )
342
- }
343
- TyData :: Placeholder ( ui) => Ok ( folder. fold_free_placeholder_ty ( * ui, binders) ?) ,
344
- TyData :: Alias ( proj) => Ok (
345
- TyData :: Alias ( proj. fold_with ( folder, binders) ?) . intern ( folder. target_interner ( ) )
346
- ) ,
347
- TyData :: Function ( fun) => {
348
- Ok ( TyData :: Function ( fun. fold_with ( folder, binders) ?)
349
- . intern ( folder. target_interner ( ) ) )
350
- }
350
+ TyData :: Dyn ( clauses) => Ok ( TyData :: Dyn ( clauses. fold_with ( folder, outer_binder) ?)
351
+ . intern ( folder. target_interner ( ) ) ) ,
352
+ TyData :: InferenceVar ( var) => folder. fold_inference_ty ( * var, outer_binder) ,
353
+ TyData :: Apply ( apply) => Ok ( TyData :: Apply ( apply. fold_with ( folder, outer_binder) ?)
354
+ . intern ( folder. target_interner ( ) ) ) ,
355
+ TyData :: Placeholder ( ui) => Ok ( folder. fold_free_placeholder_ty ( * ui, outer_binder) ?) ,
356
+ TyData :: Alias ( proj) => Ok ( TyData :: Alias ( proj. fold_with ( folder, outer_binder) ?)
357
+ . intern ( folder. target_interner ( ) ) ) ,
358
+ TyData :: Function ( fun) => Ok ( TyData :: Function ( fun. fold_with ( folder, outer_binder) ?)
359
+ . intern ( folder. target_interner ( ) ) ) ,
351
360
}
352
361
}
353
362
}
@@ -361,13 +370,13 @@ impl<I: Interner, TI: TargetInterner<I>> Fold<I, TI> for Lifetime<I> {
361
370
fn fold_with < ' i > (
362
371
& self ,
363
372
folder : & mut dyn Folder < ' i , I , TI > ,
364
- binders : usize ,
373
+ outer_binder : DebruijnIndex ,
365
374
) -> Fallible < Self :: Result >
366
375
where
367
376
I : ' i ,
368
377
TI : ' i ,
369
378
{
370
- folder. fold_lifetime ( self , binders )
379
+ folder. fold_lifetime ( self , outer_binder )
371
380
}
372
381
}
373
382
@@ -379,7 +388,7 @@ where
379
388
fn super_fold_with < ' i > (
380
389
& self ,
381
390
folder : & mut dyn Folder < ' i , I , TI > ,
382
- binders : usize ,
391
+ outer_binder : DebruijnIndex ,
383
392
) -> Fallible < Lifetime < TI > >
384
393
where
385
394
I : ' i ,
@@ -388,22 +397,22 @@ where
388
397
let interner = folder. interner ( ) ;
389
398
match self . data ( interner) {
390
399
LifetimeData :: BoundVar ( bound_var) => {
391
- if let Some ( bound_var1) = bound_var. shifted_out_by ( binders ) {
400
+ if let Some ( bound_var1) = bound_var. shifted_out_to ( outer_binder ) {
392
401
// This variable was bound outside of the binders
393
402
// that we have traversed during folding;
394
403
// therefore, it is free. Let the folder have a
395
404
// crack at it.
396
- folder. fold_free_var_lifetime ( bound_var1, binders )
405
+ folder. fold_free_var_lifetime ( bound_var1, outer_binder )
397
406
} else {
398
407
// This variable was bound within the binders that
399
408
// we folded over, so just return a bound
400
409
// variable.
401
410
Ok ( LifetimeData :: < TI > :: BoundVar ( * bound_var) . intern ( folder. target_interner ( ) ) )
402
411
}
403
412
}
404
- LifetimeData :: InferenceVar ( var) => folder. fold_inference_lifetime ( * var, binders ) ,
413
+ LifetimeData :: InferenceVar ( var) => folder. fold_inference_lifetime ( * var, outer_binder ) ,
405
414
LifetimeData :: Placeholder ( universe) => {
406
- folder. fold_free_placeholder_lifetime ( * universe, binders )
415
+ folder. fold_free_placeholder_lifetime ( * universe, outer_binder )
407
416
}
408
417
LifetimeData :: Phantom ( ..) => unreachable ! ( ) ,
409
418
}
@@ -418,13 +427,13 @@ impl<I: Interner, TI: TargetInterner<I>> Fold<I, TI> for Goal<I> {
418
427
fn fold_with < ' i > (
419
428
& self ,
420
429
folder : & mut dyn Folder < ' i , I , TI > ,
421
- binders : usize ,
430
+ outer_binder : DebruijnIndex ,
422
431
) -> Fallible < Self :: Result >
423
432
where
424
433
I : ' i ,
425
434
TI : ' i ,
426
435
{
427
- folder. fold_goal ( self , binders )
436
+ folder. fold_goal ( self , outer_binder )
428
437
}
429
438
}
430
439
@@ -433,7 +442,7 @@ impl<I: Interner, TI: TargetInterner<I>> SuperFold<I, TI> for Goal<I> {
433
442
fn super_fold_with < ' i > (
434
443
& self ,
435
444
folder : & mut dyn Folder < ' i , I , TI > ,
436
- binders : usize ,
445
+ outer_binder : DebruijnIndex ,
437
446
) -> Fallible < Self :: Result >
438
447
where
439
448
I : ' i ,
@@ -443,7 +452,7 @@ impl<I: Interner, TI: TargetInterner<I>> SuperFold<I, TI> for Goal<I> {
443
452
let target_interner = folder. target_interner ( ) ;
444
453
Ok ( Goal :: new (
445
454
target_interner,
446
- self . data ( interner) . fold_with ( folder, binders ) ?,
455
+ self . data ( interner) . fold_with ( folder, outer_binder ) ?,
447
456
) )
448
457
}
449
458
}
@@ -457,12 +466,12 @@ impl<I: Interner, TI: TargetInterner<I>> Fold<I, TI> for ProgramClause<I> {
457
466
fn fold_with < ' i > (
458
467
& self ,
459
468
folder : & mut dyn Folder < ' i , I , TI > ,
460
- binders : usize ,
469
+ outer_binder : DebruijnIndex ,
461
470
) -> Fallible < Self :: Result >
462
471
where
463
472
I : ' i ,
464
473
TI : ' i ,
465
474
{
466
- folder. fold_program_clause ( self , binders )
475
+ folder. fold_program_clause ( self , outer_binder )
467
476
}
468
477
}
0 commit comments