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