@@ -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
{
@@ -389,11 +401,11 @@ impl<I: Interner> SuperVisit<I> for Lifetime<I> {
389
401
}
390
402
391
403
impl < I : Interner > Visit < I > for Const < I > {
392
- fn visit_with < ' i > (
404
+ fn visit_with < ' i , B > (
393
405
& self ,
394
- visitor : & mut dyn Visitor < ' i , I > ,
406
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
395
407
outer_binder : DebruijnIndex ,
396
- ) -> ControlFlow < ( ) >
408
+ ) -> ControlFlow < B >
397
409
where
398
410
I : ' i ,
399
411
{
@@ -402,11 +414,11 @@ impl<I: Interner> Visit<I> for Const<I> {
402
414
}
403
415
404
416
impl < I : Interner > SuperVisit < I > for Const < I > {
405
- fn super_visit_with < ' i > (
417
+ fn super_visit_with < ' i , B > (
406
418
& self ,
407
- visitor : & mut dyn Visitor < ' i , I > ,
419
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
408
420
outer_binder : DebruijnIndex ,
409
- ) -> ControlFlow < ( ) >
421
+ ) -> ControlFlow < B >
410
422
where
411
423
I : ' i ,
412
424
{
@@ -429,11 +441,11 @@ impl<I: Interner> SuperVisit<I> for Const<I> {
429
441
}
430
442
431
443
impl < I : Interner > Visit < I > for Goal < I > {
432
- fn visit_with < ' i > (
444
+ fn visit_with < ' i , B > (
433
445
& self ,
434
- visitor : & mut dyn Visitor < ' i , I > ,
446
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
435
447
outer_binder : DebruijnIndex ,
436
- ) -> ControlFlow < ( ) >
448
+ ) -> ControlFlow < B >
437
449
where
438
450
I : ' i ,
439
451
{
@@ -442,11 +454,11 @@ impl<I: Interner> Visit<I> for Goal<I> {
442
454
}
443
455
444
456
impl < I : Interner > SuperVisit < I > for Goal < I > {
445
- fn super_visit_with < ' i > (
457
+ fn super_visit_with < ' i , B > (
446
458
& self ,
447
- visitor : & mut dyn Visitor < ' i , I > ,
459
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
448
460
outer_binder : DebruijnIndex ,
449
- ) -> ControlFlow < ( ) >
461
+ ) -> ControlFlow < B >
450
462
where
451
463
I : ' i ,
452
464
{
@@ -456,11 +468,11 @@ impl<I: Interner> SuperVisit<I> for Goal<I> {
456
468
}
457
469
458
470
impl < I : Interner > Visit < I > for ProgramClause < I > {
459
- fn visit_with < ' i > (
471
+ fn visit_with < ' i , B > (
460
472
& self ,
461
- visitor : & mut dyn Visitor < ' i , I > ,
473
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
462
474
outer_binder : DebruijnIndex ,
463
- ) -> ControlFlow < ( ) >
475
+ ) -> ControlFlow < B >
464
476
where
465
477
I : ' i ,
466
478
{
@@ -469,11 +481,11 @@ impl<I: Interner> Visit<I> for ProgramClause<I> {
469
481
}
470
482
471
483
impl < I : Interner > Visit < I > for WhereClause < I > {
472
- fn visit_with < ' i > (
484
+ fn visit_with < ' i , B > (
473
485
& self ,
474
- visitor : & mut dyn Visitor < ' i , I > ,
486
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
475
487
outer_binder : DebruijnIndex ,
476
- ) -> ControlFlow < ( ) >
488
+ ) -> ControlFlow < B >
477
489
where
478
490
I : ' i ,
479
491
{
@@ -482,11 +494,11 @@ impl<I: Interner> Visit<I> for WhereClause<I> {
482
494
}
483
495
484
496
impl < I : Interner > Visit < I > for DomainGoal < I > {
485
- fn visit_with < ' i > (
497
+ fn visit_with < ' i , B > (
486
498
& self ,
487
- visitor : & mut dyn Visitor < ' i , I > ,
499
+ visitor : & mut dyn Visitor < ' i , I , BreakTy = B > ,
488
500
outer_binder : DebruijnIndex ,
489
- ) -> ControlFlow < ( ) >
501
+ ) -> ControlFlow < B >
490
502
where
491
503
I : ' i ,
492
504
{
0 commit comments