Skip to content

Commit d6e34a4

Browse files
Introduce Visitor::BreakTy
1 parent f2e3fd9 commit d6e34a4

File tree

12 files changed

+154
-128
lines changed

12 files changed

+154
-128
lines changed

chalk-derive/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,11 +175,11 @@ fn derive_any_visit(
175175
s.bound_impl(
176176
quote!(::chalk_ir::visit:: #trait_name <#interner>),
177177
quote! {
178-
fn #method_name <'i>(
178+
fn #method_name <'i, B>(
179179
&self,
180-
visitor: &mut dyn ::chalk_ir::visit::Visitor < 'i, #interner >,
180+
visitor: &mut dyn ::chalk_ir::visit::Visitor < 'i, #interner, BreakTy = B >,
181181
outer_binder: ::chalk_ir::DebruijnIndex,
182-
) -> ::chalk_ir::visit::ControlFlow<()>
182+
) -> ::chalk_ir::visit::ControlFlow<B>
183183
where
184184
#interner: 'i
185185
{

chalk-ir/src/visit.rs

Lines changed: 61 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -82,20 +82,23 @@ pub trait Visitor<'i, I: Interner>
8282
where
8383
I: 'i,
8484
{
85+
/// The "break type" of the visitor.
86+
type BreakTy;
87+
8588
/// Creates a `dyn` value from this visitor. Unfortunately, this
8689
/// must be added manually to each impl of visitor; it permits the
8790
/// default implements below to create a `&mut dyn Visitor` from
8891
/// `Self` without knowing what `Self` is (by invoking this
8992
/// method). Effectively, this limits impls of `visitor` to types
9093
/// for which we are able to create a dyn value (i.e., not `[T]`
9194
/// 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>;
9396

9497
/// Top-level callback: invoked for each `Ty<I>` that is
9598
/// encountered when visiting. By default, invokes
9699
/// `super_visit_with`, which will in turn invoke the more
97100
/// 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> {
99102
ty.super_visit_with(self.as_dyn(), outer_binder)
100103
}
101104

@@ -107,15 +110,19 @@ where
107110
&mut self,
108111
lifetime: &Lifetime<I>,
109112
outer_binder: DebruijnIndex,
110-
) -> ControlFlow<()> {
113+
) -> ControlFlow<Self::BreakTy> {
111114
lifetime.super_visit_with(self.as_dyn(), outer_binder)
112115
}
113116

114117
/// Top-level callback: invoked for each `Const<I>` that is
115118
/// encountered when visiting. By default, invokes
116119
/// `super_visit_with`, which will in turn invoke the more
117120
/// 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> {
119126
constant.super_visit_with(self.as_dyn(), outer_binder)
120127
}
121128

@@ -124,12 +131,16 @@ where
124131
&mut self,
125132
clause: &ProgramClause<I>,
126133
outer_binder: DebruijnIndex,
127-
) -> ControlFlow<()> {
134+
) -> ControlFlow<Self::BreakTy> {
128135
clause.super_visit_with(self.as_dyn(), outer_binder)
129136
}
130137

131138
/// 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> {
133144
goal.super_visit_with(self.as_dyn(), outer_binder)
134145
}
135146

@@ -138,7 +149,7 @@ where
138149
&mut self,
139150
domain_goal: &DomainGoal<I>,
140151
outer_binder: DebruijnIndex,
141-
) -> ControlFlow<()> {
152+
) -> ControlFlow<Self::BreakTy> {
142153
domain_goal.super_visit_with(self.as_dyn(), outer_binder)
143154
}
144155

@@ -155,7 +166,7 @@ where
155166
&mut self,
156167
bound_var: BoundVar,
157168
outer_binder: DebruijnIndex,
158-
) -> ControlFlow<()> {
169+
) -> ControlFlow<Self::BreakTy> {
159170
if self.forbid_free_vars() {
160171
panic!(
161172
"unexpected free variable `{:?}` with outer binder {:?}",
@@ -178,7 +189,7 @@ where
178189
&mut self,
179190
universe: PlaceholderIndex,
180191
_outer_binder: DebruijnIndex,
181-
) -> ControlFlow<()> {
192+
) -> ControlFlow<Self::BreakTy> {
182193
if self.forbid_free_placeholders() {
183194
panic!("unexpected placeholder type `{:?}`", universe)
184195
} else {
@@ -191,7 +202,7 @@ where
191202
&mut self,
192203
where_clause: &WhereClause<I>,
193204
outer_binder: DebruijnIndex,
194-
) -> ControlFlow<()> {
205+
) -> ControlFlow<Self::BreakTy> {
195206
where_clause.super_visit_with(self.as_dyn(), outer_binder)
196207
}
197208

@@ -208,7 +219,7 @@ where
208219
&mut self,
209220
var: InferenceVar,
210221
_outer_binder: DebruijnIndex,
211-
) -> ControlFlow<()> {
222+
) -> ControlFlow<Self::BreakTy> {
212223
if self.forbid_inference_vars() {
213224
panic!("unexpected inference type `{:?}`", var)
214225
} else {
@@ -228,11 +239,11 @@ pub trait Visit<I: Interner>: Debug {
228239
/// visitor. Typically `binders` starts as 0, but is adjusted when
229240
/// we encounter `Binders<T>` in the IR or other similar
230241
/// constructs.
231-
fn visit_with<'i>(
242+
fn visit_with<'i, B>(
232243
&self,
233-
visitor: &mut dyn Visitor<'i, I>,
244+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
234245
outer_binder: DebruijnIndex,
235-
) -> ControlFlow<()>
246+
) -> ControlFlow<B>
236247
where
237248
I: 'i;
238249
}
@@ -242,11 +253,11 @@ pub trait Visit<I: Interner>: Debug {
242253
/// the contents of the type.
243254
pub trait SuperVisit<I: Interner>: Visit<I> {
244255
/// Recursively visits the type contents.
245-
fn super_visit_with<'i>(
256+
fn super_visit_with<'i, B>(
246257
&self,
247-
visitor: &mut dyn Visitor<'i, I>,
258+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
248259
outer_binder: DebruijnIndex,
249-
) -> ControlFlow<()>
260+
) -> ControlFlow<B>
250261
where
251262
I: 'i;
252263
}
@@ -255,11 +266,11 @@ pub trait SuperVisit<I: Interner>: Visit<I> {
255266
/// usually (in turn) invokes `super_visit_ty` to visit the individual
256267
/// parts.
257268
impl<I: Interner> Visit<I> for Ty<I> {
258-
fn visit_with<'i>(
269+
fn visit_with<'i, B>(
259270
&self,
260-
visitor: &mut dyn Visitor<'i, I>,
271+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
261272
outer_binder: DebruijnIndex,
262-
) -> ControlFlow<()>
273+
) -> ControlFlow<B>
263274
where
264275
I: 'i,
265276
{
@@ -272,11 +283,11 @@ impl<I> SuperVisit<I> for Ty<I>
272283
where
273284
I: Interner,
274285
{
275-
fn super_visit_with<'i>(
286+
fn super_visit_with<'i, B>(
276287
&self,
277-
visitor: &mut dyn Visitor<'i, I>,
288+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
278289
outer_binder: DebruijnIndex,
279-
) -> ControlFlow<()>
290+
) -> ControlFlow<B>
280291
where
281292
I: 'i,
282293
{
@@ -346,11 +357,11 @@ where
346357
}
347358

348359
impl<I: Interner> Visit<I> for Lifetime<I> {
349-
fn visit_with<'i>(
360+
fn visit_with<'i, B>(
350361
&self,
351-
visitor: &mut dyn Visitor<'i, I>,
362+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
352363
outer_binder: DebruijnIndex,
353-
) -> ControlFlow<()>
364+
) -> ControlFlow<B>
354365
where
355366
I: 'i,
356367
{
@@ -359,11 +370,11 @@ impl<I: Interner> Visit<I> for Lifetime<I> {
359370
}
360371

361372
impl<I: Interner> SuperVisit<I> for Lifetime<I> {
362-
fn super_visit_with<'i>(
373+
fn super_visit_with<'i, B>(
363374
&self,
364-
visitor: &mut dyn Visitor<'i, I>,
375+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
365376
outer_binder: DebruijnIndex,
366-
) -> ControlFlow<()>
377+
) -> ControlFlow<B>
367378
where
368379
I: 'i,
369380
{
@@ -387,11 +398,11 @@ impl<I: Interner> SuperVisit<I> for Lifetime<I> {
387398
}
388399

389400
impl<I: Interner> Visit<I> for Const<I> {
390-
fn visit_with<'i>(
401+
fn visit_with<'i, B>(
391402
&self,
392-
visitor: &mut dyn Visitor<'i, I>,
403+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
393404
outer_binder: DebruijnIndex,
394-
) -> ControlFlow<()>
405+
) -> ControlFlow<B>
395406
where
396407
I: 'i,
397408
{
@@ -400,11 +411,11 @@ impl<I: Interner> Visit<I> for Const<I> {
400411
}
401412

402413
impl<I: Interner> SuperVisit<I> for Const<I> {
403-
fn super_visit_with<'i>(
414+
fn super_visit_with<'i, B>(
404415
&self,
405-
visitor: &mut dyn Visitor<'i, I>,
416+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
406417
outer_binder: DebruijnIndex,
407-
) -> ControlFlow<()>
418+
) -> ControlFlow<B>
408419
where
409420
I: 'i,
410421
{
@@ -427,11 +438,11 @@ impl<I: Interner> SuperVisit<I> for Const<I> {
427438
}
428439

429440
impl<I: Interner> Visit<I> for Goal<I> {
430-
fn visit_with<'i>(
441+
fn visit_with<'i, B>(
431442
&self,
432-
visitor: &mut dyn Visitor<'i, I>,
443+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
433444
outer_binder: DebruijnIndex,
434-
) -> ControlFlow<()>
445+
) -> ControlFlow<B>
435446
where
436447
I: 'i,
437448
{
@@ -440,11 +451,11 @@ impl<I: Interner> Visit<I> for Goal<I> {
440451
}
441452

442453
impl<I: Interner> SuperVisit<I> for Goal<I> {
443-
fn super_visit_with<'i>(
454+
fn super_visit_with<'i, B>(
444455
&self,
445-
visitor: &mut dyn Visitor<'i, I>,
456+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
446457
outer_binder: DebruijnIndex,
447-
) -> ControlFlow<()>
458+
) -> ControlFlow<B>
448459
where
449460
I: 'i,
450461
{
@@ -454,11 +465,11 @@ impl<I: Interner> SuperVisit<I> for Goal<I> {
454465
}
455466

456467
impl<I: Interner> Visit<I> for ProgramClause<I> {
457-
fn visit_with<'i>(
468+
fn visit_with<'i, B>(
458469
&self,
459-
visitor: &mut dyn Visitor<'i, I>,
470+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
460471
outer_binder: DebruijnIndex,
461-
) -> ControlFlow<()>
472+
) -> ControlFlow<B>
462473
where
463474
I: 'i,
464475
{
@@ -467,11 +478,11 @@ impl<I: Interner> Visit<I> for ProgramClause<I> {
467478
}
468479

469480
impl<I: Interner> Visit<I> for WhereClause<I> {
470-
fn visit_with<'i>(
481+
fn visit_with<'i, B>(
471482
&self,
472-
visitor: &mut dyn Visitor<'i, I>,
483+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
473484
outer_binder: DebruijnIndex,
474-
) -> ControlFlow<()>
485+
) -> ControlFlow<B>
475486
where
476487
I: 'i,
477488
{
@@ -480,11 +491,11 @@ impl<I: Interner> Visit<I> for WhereClause<I> {
480491
}
481492

482493
impl<I: Interner> Visit<I> for DomainGoal<I> {
483-
fn visit_with<'i>(
494+
fn visit_with<'i, B>(
484495
&self,
485-
visitor: &mut dyn Visitor<'i, I>,
496+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
486497
outer_binder: DebruijnIndex,
487-
) -> ControlFlow<()>
498+
) -> ControlFlow<B>
488499
where
489500
I: 'i,
490501
{

chalk-ir/src/visit/binder_impls.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ use crate::interner::HasInterner;
77
use crate::{Binders, Canonical, ControlFlow, DebruijnIndex, FnPointer, Interner, Visit, Visitor};
88

99
impl<I: Interner> Visit<I> for FnPointer<I> {
10-
fn visit_with<'i>(
10+
fn visit_with<'i, B>(
1111
&self,
12-
visitor: &mut dyn Visitor<'i, I>,
12+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
1313
outer_binder: DebruijnIndex,
14-
) -> ControlFlow<()>
14+
) -> ControlFlow<B>
1515
where
1616
I: 'i,
1717
{
@@ -26,11 +26,11 @@ impl<T, I: Interner> Visit<I> for Binders<T>
2626
where
2727
T: HasInterner + Visit<I>,
2828
{
29-
fn visit_with<'i>(
29+
fn visit_with<'i, B>(
3030
&self,
31-
visitor: &mut dyn Visitor<'i, I>,
31+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
3232
outer_binder: DebruijnIndex,
33-
) -> ControlFlow<()>
33+
) -> ControlFlow<B>
3434
where
3535
I: 'i,
3636
{
@@ -43,11 +43,11 @@ where
4343
I: Interner,
4444
T: HasInterner<Interner = I> + Visit<I>,
4545
{
46-
fn visit_with<'i>(
46+
fn visit_with<'i, B>(
4747
&self,
48-
visitor: &mut dyn Visitor<'i, I>,
48+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
4949
outer_binder: DebruijnIndex,
50-
) -> ControlFlow<()>
50+
) -> ControlFlow<B>
5151
where
5252
I: 'i,
5353
{

0 commit comments

Comments
 (0)