Skip to content

Commit 905c72d

Browse files
Introduce Visitor::BreakTy
1 parent f2e3fd9 commit 905c72d

File tree

12 files changed

+155
-128
lines changed

12 files changed

+155
-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: 62 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -82,20 +82,24 @@ pub trait Visitor<'i, I: Interner>
8282
where
8383
I: 'i,
8484
{
85+
/// The "break type" of the visitor, often `()`. It represents the result
86+
/// the visitor yields when it stops visiting.
87+
type BreakTy;
88+
8589
/// Creates a `dyn` value from this visitor. Unfortunately, this
8690
/// must be added manually to each impl of visitor; it permits the
8791
/// default implements below to create a `&mut dyn Visitor` from
8892
/// `Self` without knowing what `Self` is (by invoking this
8993
/// method). Effectively, this limits impls of `visitor` to types
9094
/// for which we are able to create a dyn value (i.e., not `[T]`
9195
/// 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>;
9397

9498
/// Top-level callback: invoked for each `Ty<I>` that is
9599
/// encountered when visiting. By default, invokes
96100
/// `super_visit_with`, which will in turn invoke the more
97101
/// 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> {
99103
ty.super_visit_with(self.as_dyn(), outer_binder)
100104
}
101105

@@ -107,15 +111,19 @@ where
107111
&mut self,
108112
lifetime: &Lifetime<I>,
109113
outer_binder: DebruijnIndex,
110-
) -> ControlFlow<()> {
114+
) -> ControlFlow<Self::BreakTy> {
111115
lifetime.super_visit_with(self.as_dyn(), outer_binder)
112116
}
113117

114118
/// Top-level callback: invoked for each `Const<I>` that is
115119
/// encountered when visiting. By default, invokes
116120
/// `super_visit_with`, which will in turn invoke the more
117121
/// 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> {
119127
constant.super_visit_with(self.as_dyn(), outer_binder)
120128
}
121129

@@ -124,12 +132,16 @@ where
124132
&mut self,
125133
clause: &ProgramClause<I>,
126134
outer_binder: DebruijnIndex,
127-
) -> ControlFlow<()> {
135+
) -> ControlFlow<Self::BreakTy> {
128136
clause.super_visit_with(self.as_dyn(), outer_binder)
129137
}
130138

131139
/// 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> {
133145
goal.super_visit_with(self.as_dyn(), outer_binder)
134146
}
135147

@@ -138,7 +150,7 @@ where
138150
&mut self,
139151
domain_goal: &DomainGoal<I>,
140152
outer_binder: DebruijnIndex,
141-
) -> ControlFlow<()> {
153+
) -> ControlFlow<Self::BreakTy> {
142154
domain_goal.super_visit_with(self.as_dyn(), outer_binder)
143155
}
144156

@@ -155,7 +167,7 @@ where
155167
&mut self,
156168
bound_var: BoundVar,
157169
outer_binder: DebruijnIndex,
158-
) -> ControlFlow<()> {
170+
) -> ControlFlow<Self::BreakTy> {
159171
if self.forbid_free_vars() {
160172
panic!(
161173
"unexpected free variable `{:?}` with outer binder {:?}",
@@ -178,7 +190,7 @@ where
178190
&mut self,
179191
universe: PlaceholderIndex,
180192
_outer_binder: DebruijnIndex,
181-
) -> ControlFlow<()> {
193+
) -> ControlFlow<Self::BreakTy> {
182194
if self.forbid_free_placeholders() {
183195
panic!("unexpected placeholder type `{:?}`", universe)
184196
} else {
@@ -191,7 +203,7 @@ where
191203
&mut self,
192204
where_clause: &WhereClause<I>,
193205
outer_binder: DebruijnIndex,
194-
) -> ControlFlow<()> {
206+
) -> ControlFlow<Self::BreakTy> {
195207
where_clause.super_visit_with(self.as_dyn(), outer_binder)
196208
}
197209

@@ -208,7 +220,7 @@ where
208220
&mut self,
209221
var: InferenceVar,
210222
_outer_binder: DebruijnIndex,
211-
) -> ControlFlow<()> {
223+
) -> ControlFlow<Self::BreakTy> {
212224
if self.forbid_inference_vars() {
213225
panic!("unexpected inference type `{:?}`", var)
214226
} else {
@@ -228,11 +240,11 @@ pub trait Visit<I: Interner>: Debug {
228240
/// visitor. Typically `binders` starts as 0, but is adjusted when
229241
/// we encounter `Binders<T>` in the IR or other similar
230242
/// constructs.
231-
fn visit_with<'i>(
243+
fn visit_with<'i, B>(
232244
&self,
233-
visitor: &mut dyn Visitor<'i, I>,
245+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
234246
outer_binder: DebruijnIndex,
235-
) -> ControlFlow<()>
247+
) -> ControlFlow<B>
236248
where
237249
I: 'i;
238250
}
@@ -242,11 +254,11 @@ pub trait Visit<I: Interner>: Debug {
242254
/// the contents of the type.
243255
pub trait SuperVisit<I: Interner>: Visit<I> {
244256
/// Recursively visits the type contents.
245-
fn super_visit_with<'i>(
257+
fn super_visit_with<'i, B>(
246258
&self,
247-
visitor: &mut dyn Visitor<'i, I>,
259+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
248260
outer_binder: DebruijnIndex,
249-
) -> ControlFlow<()>
261+
) -> ControlFlow<B>
250262
where
251263
I: 'i;
252264
}
@@ -255,11 +267,11 @@ pub trait SuperVisit<I: Interner>: Visit<I> {
255267
/// usually (in turn) invokes `super_visit_ty` to visit the individual
256268
/// parts.
257269
impl<I: Interner> Visit<I> for Ty<I> {
258-
fn visit_with<'i>(
270+
fn visit_with<'i, B>(
259271
&self,
260-
visitor: &mut dyn Visitor<'i, I>,
272+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
261273
outer_binder: DebruijnIndex,
262-
) -> ControlFlow<()>
274+
) -> ControlFlow<B>
263275
where
264276
I: 'i,
265277
{
@@ -272,11 +284,11 @@ impl<I> SuperVisit<I> for Ty<I>
272284
where
273285
I: Interner,
274286
{
275-
fn super_visit_with<'i>(
287+
fn super_visit_with<'i, B>(
276288
&self,
277-
visitor: &mut dyn Visitor<'i, I>,
289+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
278290
outer_binder: DebruijnIndex,
279-
) -> ControlFlow<()>
291+
) -> ControlFlow<B>
280292
where
281293
I: 'i,
282294
{
@@ -346,11 +358,11 @@ where
346358
}
347359

348360
impl<I: Interner> Visit<I> for Lifetime<I> {
349-
fn visit_with<'i>(
361+
fn visit_with<'i, B>(
350362
&self,
351-
visitor: &mut dyn Visitor<'i, I>,
363+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
352364
outer_binder: DebruijnIndex,
353-
) -> ControlFlow<()>
365+
) -> ControlFlow<B>
354366
where
355367
I: 'i,
356368
{
@@ -359,11 +371,11 @@ impl<I: Interner> Visit<I> for Lifetime<I> {
359371
}
360372

361373
impl<I: Interner> SuperVisit<I> for Lifetime<I> {
362-
fn super_visit_with<'i>(
374+
fn super_visit_with<'i, B>(
363375
&self,
364-
visitor: &mut dyn Visitor<'i, I>,
376+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
365377
outer_binder: DebruijnIndex,
366-
) -> ControlFlow<()>
378+
) -> ControlFlow<B>
367379
where
368380
I: 'i,
369381
{
@@ -387,11 +399,11 @@ impl<I: Interner> SuperVisit<I> for Lifetime<I> {
387399
}
388400

389401
impl<I: Interner> Visit<I> for Const<I> {
390-
fn visit_with<'i>(
402+
fn visit_with<'i, B>(
391403
&self,
392-
visitor: &mut dyn Visitor<'i, I>,
404+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
393405
outer_binder: DebruijnIndex,
394-
) -> ControlFlow<()>
406+
) -> ControlFlow<B>
395407
where
396408
I: 'i,
397409
{
@@ -400,11 +412,11 @@ impl<I: Interner> Visit<I> for Const<I> {
400412
}
401413

402414
impl<I: Interner> SuperVisit<I> for Const<I> {
403-
fn super_visit_with<'i>(
415+
fn super_visit_with<'i, B>(
404416
&self,
405-
visitor: &mut dyn Visitor<'i, I>,
417+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
406418
outer_binder: DebruijnIndex,
407-
) -> ControlFlow<()>
419+
) -> ControlFlow<B>
408420
where
409421
I: 'i,
410422
{
@@ -427,11 +439,11 @@ impl<I: Interner> SuperVisit<I> for Const<I> {
427439
}
428440

429441
impl<I: Interner> Visit<I> for Goal<I> {
430-
fn visit_with<'i>(
442+
fn visit_with<'i, B>(
431443
&self,
432-
visitor: &mut dyn Visitor<'i, I>,
444+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
433445
outer_binder: DebruijnIndex,
434-
) -> ControlFlow<()>
446+
) -> ControlFlow<B>
435447
where
436448
I: 'i,
437449
{
@@ -440,11 +452,11 @@ impl<I: Interner> Visit<I> for Goal<I> {
440452
}
441453

442454
impl<I: Interner> SuperVisit<I> for Goal<I> {
443-
fn super_visit_with<'i>(
455+
fn super_visit_with<'i, B>(
444456
&self,
445-
visitor: &mut dyn Visitor<'i, I>,
457+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
446458
outer_binder: DebruijnIndex,
447-
) -> ControlFlow<()>
459+
) -> ControlFlow<B>
448460
where
449461
I: 'i,
450462
{
@@ -454,11 +466,11 @@ impl<I: Interner> SuperVisit<I> for Goal<I> {
454466
}
455467

456468
impl<I: Interner> Visit<I> for ProgramClause<I> {
457-
fn visit_with<'i>(
469+
fn visit_with<'i, B>(
458470
&self,
459-
visitor: &mut dyn Visitor<'i, I>,
471+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
460472
outer_binder: DebruijnIndex,
461-
) -> ControlFlow<()>
473+
) -> ControlFlow<B>
462474
where
463475
I: 'i,
464476
{
@@ -467,11 +479,11 @@ impl<I: Interner> Visit<I> for ProgramClause<I> {
467479
}
468480

469481
impl<I: Interner> Visit<I> for WhereClause<I> {
470-
fn visit_with<'i>(
482+
fn visit_with<'i, B>(
471483
&self,
472-
visitor: &mut dyn Visitor<'i, I>,
484+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
473485
outer_binder: DebruijnIndex,
474-
) -> ControlFlow<()>
486+
) -> ControlFlow<B>
475487
where
476488
I: 'i,
477489
{
@@ -480,11 +492,11 @@ impl<I: Interner> Visit<I> for WhereClause<I> {
480492
}
481493

482494
impl<I: Interner> Visit<I> for DomainGoal<I> {
483-
fn visit_with<'i>(
495+
fn visit_with<'i, B>(
484496
&self,
485-
visitor: &mut dyn Visitor<'i, I>,
497+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
486498
outer_binder: DebruijnIndex,
487-
) -> ControlFlow<()>
499+
) -> ControlFlow<B>
488500
where
489501
I: 'i,
490502
{

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)