@@ -82,20 +82,23 @@ pub trait Visitor<'i, I: Interner>
82
82
where
83
83
I : ' i ,
84
84
{
85
+ /// The "break type" of the visitor.
86
+ type BreakTy ;
87
+
85
88
/// Creates a `dyn` value from this visitor. Unfortunately, this
86
89
/// must be added manually to each impl of visitor; it permits the
87
90
/// default implements below to create a `&mut dyn Visitor` from
88
91
/// `Self` without knowing what `Self` is (by invoking this
89
92
/// method). Effectively, this limits impls of `visitor` to types
90
93
/// for which we are able to create a dyn value (i.e., not `[T]`
91
94
/// types).
92
- fn as_dyn ( & mut self ) -> & mut dyn Visitor < ' i , I > ;
95
+ fn as_dyn ( & mut self ) -> & mut dyn Visitor < ' i , I , BreakTy = Self :: BreakTy > ;
93
96
94
97
/// Top-level callback: invoked for each `Ty<I>` that is
95
98
/// encountered when visiting. By default, invokes
96
99
/// `super_visit_with`, which will in turn invoke the more
97
100
/// specialized visiting methods below, like `visit_free_var`.
98
- fn visit_ty ( & mut self , ty : & Ty < I > , outer_binder : DebruijnIndex ) -> ControlFlow < ( ) > {
101
+ fn visit_ty ( & mut self , ty : & Ty < I > , outer_binder : DebruijnIndex ) -> ControlFlow < Self :: BreakTy > {
99
102
ty. super_visit_with ( self . as_dyn ( ) , outer_binder)
100
103
}
101
104
@@ -107,15 +110,19 @@ where
107
110
& mut self ,
108
111
lifetime : & Lifetime < I > ,
109
112
outer_binder : DebruijnIndex ,
110
- ) -> ControlFlow < ( ) > {
113
+ ) -> ControlFlow < Self :: BreakTy > {
111
114
lifetime. super_visit_with ( self . as_dyn ( ) , outer_binder)
112
115
}
113
116
114
117
/// Top-level callback: invoked for each `Const<I>` that is
115
118
/// encountered when visiting. By default, invokes
116
119
/// `super_visit_with`, which will in turn invoke the more
117
120
/// specialized visiting methods below, like `visit_free_var`.
118
- fn visit_const ( & mut self , constant : & Const < I > , outer_binder : DebruijnIndex ) -> ControlFlow < ( ) > {
121
+ fn visit_const (
122
+ & mut self ,
123
+ constant : & Const < I > ,
124
+ outer_binder : DebruijnIndex ,
125
+ ) -> ControlFlow < Self :: BreakTy > {
119
126
constant. super_visit_with ( self . as_dyn ( ) , outer_binder)
120
127
}
121
128
@@ -124,12 +131,16 @@ where
124
131
& mut self ,
125
132
clause : & ProgramClause < I > ,
126
133
outer_binder : DebruijnIndex ,
127
- ) -> ControlFlow < ( ) > {
134
+ ) -> ControlFlow < Self :: BreakTy > {
128
135
clause. super_visit_with ( self . as_dyn ( ) , outer_binder)
129
136
}
130
137
131
138
/// Invoked for every goal. By default, recursively visits the goals contents.
132
- fn visit_goal ( & mut self , goal : & Goal < I > , outer_binder : DebruijnIndex ) -> ControlFlow < ( ) > {
139
+ fn visit_goal (
140
+ & mut self ,
141
+ goal : & Goal < I > ,
142
+ outer_binder : DebruijnIndex ,
143
+ ) -> ControlFlow < Self :: BreakTy > {
133
144
goal. super_visit_with ( self . as_dyn ( ) , outer_binder)
134
145
}
135
146
@@ -138,7 +149,7 @@ where
138
149
& mut self ,
139
150
domain_goal : & DomainGoal < I > ,
140
151
outer_binder : DebruijnIndex ,
141
- ) -> ControlFlow < ( ) > {
152
+ ) -> ControlFlow < Self :: BreakTy > {
142
153
domain_goal. super_visit_with ( self . as_dyn ( ) , outer_binder)
143
154
}
144
155
@@ -155,7 +166,7 @@ where
155
166
& mut self ,
156
167
bound_var : BoundVar ,
157
168
outer_binder : DebruijnIndex ,
158
- ) -> ControlFlow < ( ) > {
169
+ ) -> ControlFlow < Self :: BreakTy > {
159
170
if self . forbid_free_vars ( ) {
160
171
panic ! (
161
172
"unexpected free variable `{:?}` with outer binder {:?}" ,
@@ -178,7 +189,7 @@ where
178
189
& mut self ,
179
190
universe : PlaceholderIndex ,
180
191
_outer_binder : DebruijnIndex ,
181
- ) -> ControlFlow < ( ) > {
192
+ ) -> ControlFlow < Self :: BreakTy > {
182
193
if self . forbid_free_placeholders ( ) {
183
194
panic ! ( "unexpected placeholder type `{:?}`" , universe)
184
195
} else {
@@ -191,7 +202,7 @@ where
191
202
& mut self ,
192
203
where_clause : & WhereClause < I > ,
193
204
outer_binder : DebruijnIndex ,
194
- ) -> ControlFlow < ( ) > {
205
+ ) -> ControlFlow < Self :: BreakTy > {
195
206
where_clause. super_visit_with ( self . as_dyn ( ) , outer_binder)
196
207
}
197
208
@@ -208,7 +219,7 @@ where
208
219
& mut self ,
209
220
var : InferenceVar ,
210
221
_outer_binder : DebruijnIndex ,
211
- ) -> ControlFlow < ( ) > {
222
+ ) -> ControlFlow < Self :: BreakTy > {
212
223
if self . forbid_inference_vars ( ) {
213
224
panic ! ( "unexpected inference type `{:?}`" , var)
214
225
} else {
@@ -228,11 +239,11 @@ pub trait Visit<I: Interner>: Debug {
228
239
/// visitor. Typically `binders` starts as 0, but is adjusted when
229
240
/// we encounter `Binders<T>` in the IR or other similar
230
241
/// constructs.
231
- fn visit_with < ' i > (
242
+ fn visit_with < ' i , B > (
232
243
& self ,
233
- visitor : & mut dyn Visitor < ' i , I > ,
244
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
234
245
outer_binder : DebruijnIndex ,
235
- ) -> ControlFlow < ( ) >
246
+ ) -> ControlFlow < B >
236
247
where
237
248
I : ' i ;
238
249
}
@@ -242,11 +253,11 @@ pub trait Visit<I: Interner>: Debug {
242
253
/// the contents of the type.
243
254
pub trait SuperVisit < I : Interner > : Visit < I > {
244
255
/// Recursively visits the type contents.
245
- fn super_visit_with < ' i > (
256
+ fn super_visit_with < ' i , B > (
246
257
& self ,
247
- visitor : & mut dyn Visitor < ' i , I > ,
258
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
248
259
outer_binder : DebruijnIndex ,
249
- ) -> ControlFlow < ( ) >
260
+ ) -> ControlFlow < B >
250
261
where
251
262
I : ' i ;
252
263
}
@@ -255,11 +266,11 @@ pub trait SuperVisit<I: Interner>: Visit<I> {
255
266
/// usually (in turn) invokes `super_visit_ty` to visit the individual
256
267
/// parts.
257
268
impl < I : Interner > Visit < I > for Ty < I > {
258
- fn visit_with < ' i > (
269
+ fn visit_with < ' i , B > (
259
270
& self ,
260
- visitor : & mut dyn Visitor < ' i , I > ,
271
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
261
272
outer_binder : DebruijnIndex ,
262
- ) -> ControlFlow < ( ) >
273
+ ) -> ControlFlow < B >
263
274
where
264
275
I : ' i ,
265
276
{
@@ -272,11 +283,11 @@ impl<I> SuperVisit<I> for Ty<I>
272
283
where
273
284
I : Interner ,
274
285
{
275
- fn super_visit_with < ' i > (
286
+ fn super_visit_with < ' i , B > (
276
287
& self ,
277
- visitor : & mut dyn Visitor < ' i , I > ,
288
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
278
289
outer_binder : DebruijnIndex ,
279
- ) -> ControlFlow < ( ) >
290
+ ) -> ControlFlow < B >
280
291
where
281
292
I : ' i ,
282
293
{
@@ -346,11 +357,11 @@ where
346
357
}
347
358
348
359
impl < I : Interner > Visit < I > for Lifetime < I > {
349
- fn visit_with < ' i > (
360
+ fn visit_with < ' i , B > (
350
361
& self ,
351
- visitor : & mut dyn Visitor < ' i , I > ,
362
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
352
363
outer_binder : DebruijnIndex ,
353
- ) -> ControlFlow < ( ) >
364
+ ) -> ControlFlow < B >
354
365
where
355
366
I : ' i ,
356
367
{
@@ -359,11 +370,11 @@ impl<I: Interner> Visit<I> for Lifetime<I> {
359
370
}
360
371
361
372
impl < I : Interner > SuperVisit < I > for Lifetime < I > {
362
- fn super_visit_with < ' i > (
373
+ fn super_visit_with < ' i , B > (
363
374
& self ,
364
- visitor : & mut dyn Visitor < ' i , I > ,
375
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
365
376
outer_binder : DebruijnIndex ,
366
- ) -> ControlFlow < ( ) >
377
+ ) -> ControlFlow < B >
367
378
where
368
379
I : ' i ,
369
380
{
@@ -387,11 +398,11 @@ impl<I: Interner> SuperVisit<I> for Lifetime<I> {
387
398
}
388
399
389
400
impl < I : Interner > Visit < I > for Const < I > {
390
- fn visit_with < ' i > (
401
+ fn visit_with < ' i , B > (
391
402
& self ,
392
- visitor : & mut dyn Visitor < ' i , I > ,
403
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
393
404
outer_binder : DebruijnIndex ,
394
- ) -> ControlFlow < ( ) >
405
+ ) -> ControlFlow < B >
395
406
where
396
407
I : ' i ,
397
408
{
@@ -400,11 +411,11 @@ impl<I: Interner> Visit<I> for Const<I> {
400
411
}
401
412
402
413
impl < I : Interner > SuperVisit < I > for Const < I > {
403
- fn super_visit_with < ' i > (
414
+ fn super_visit_with < ' i , B > (
404
415
& self ,
405
- visitor : & mut dyn Visitor < ' i , I > ,
416
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
406
417
outer_binder : DebruijnIndex ,
407
- ) -> ControlFlow < ( ) >
418
+ ) -> ControlFlow < B >
408
419
where
409
420
I : ' i ,
410
421
{
@@ -427,11 +438,11 @@ impl<I: Interner> SuperVisit<I> for Const<I> {
427
438
}
428
439
429
440
impl < I : Interner > Visit < I > for Goal < I > {
430
- fn visit_with < ' i > (
441
+ fn visit_with < ' i , B > (
431
442
& self ,
432
- visitor : & mut dyn Visitor < ' i , I > ,
443
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
433
444
outer_binder : DebruijnIndex ,
434
- ) -> ControlFlow < ( ) >
445
+ ) -> ControlFlow < B >
435
446
where
436
447
I : ' i ,
437
448
{
@@ -440,11 +451,11 @@ impl<I: Interner> Visit<I> for Goal<I> {
440
451
}
441
452
442
453
impl < I : Interner > SuperVisit < I > for Goal < I > {
443
- fn super_visit_with < ' i > (
454
+ fn super_visit_with < ' i , B > (
444
455
& self ,
445
- visitor : & mut dyn Visitor < ' i , I > ,
456
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
446
457
outer_binder : DebruijnIndex ,
447
- ) -> ControlFlow < ( ) >
458
+ ) -> ControlFlow < B >
448
459
where
449
460
I : ' i ,
450
461
{
@@ -454,11 +465,11 @@ impl<I: Interner> SuperVisit<I> for Goal<I> {
454
465
}
455
466
456
467
impl < I : Interner > Visit < I > for ProgramClause < I > {
457
- fn visit_with < ' i > (
468
+ fn visit_with < ' i , B > (
458
469
& self ,
459
- visitor : & mut dyn Visitor < ' i , I > ,
470
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
460
471
outer_binder : DebruijnIndex ,
461
- ) -> ControlFlow < ( ) >
472
+ ) -> ControlFlow < B >
462
473
where
463
474
I : ' i ,
464
475
{
@@ -467,11 +478,11 @@ impl<I: Interner> Visit<I> for ProgramClause<I> {
467
478
}
468
479
469
480
impl < I : Interner > Visit < I > for WhereClause < I > {
470
- fn visit_with < ' i > (
481
+ fn visit_with < ' i , B > (
471
482
& self ,
472
- visitor : & mut dyn Visitor < ' i , I > ,
483
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
473
484
outer_binder : DebruijnIndex ,
474
- ) -> ControlFlow < ( ) >
485
+ ) -> ControlFlow < B >
475
486
where
476
487
I : ' i ,
477
488
{
@@ -480,11 +491,11 @@ impl<I: Interner> Visit<I> for WhereClause<I> {
480
491
}
481
492
482
493
impl < I : Interner > Visit < I > for DomainGoal < I > {
483
- fn visit_with < ' i > (
494
+ fn visit_with < ' i , B > (
484
495
& self ,
485
- visitor : & mut dyn Visitor < ' i , I > ,
496
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
486
497
outer_binder : DebruijnIndex ,
487
- ) -> ControlFlow < ( ) >
498
+ ) -> ControlFlow < B >
488
499
where
489
500
I : ' i ,
490
501
{
0 commit comments