Skip to content

Commit bc99ed6

Browse files
committed
Auto merge of #651 - LeSeulArtichaut:visitor-breakty, r=jackh726
Introduce `Visitor::BreakTy` Implements the equivalent of MCP rust-lang/compiler-team#383 in chalk. r? `@jackh726` ~~Should probably be blocked on rust-lang/compiler-team#383.~~
2 parents e9c82ba + 905c72d commit bc99ed6

File tree

12 files changed

+155
-128
lines changed

12 files changed

+155
-128
lines changed

chalk-derive/src/lib.rs

+3-3
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

+62-50
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
{
@@ -389,11 +401,11 @@ impl<I: Interner> SuperVisit<I> for Lifetime<I> {
389401
}
390402

391403
impl<I: Interner> Visit<I> for Const<I> {
392-
fn visit_with<'i>(
404+
fn visit_with<'i, B>(
393405
&self,
394-
visitor: &mut dyn Visitor<'i, I>,
406+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
395407
outer_binder: DebruijnIndex,
396-
) -> ControlFlow<()>
408+
) -> ControlFlow<B>
397409
where
398410
I: 'i,
399411
{
@@ -402,11 +414,11 @@ impl<I: Interner> Visit<I> for Const<I> {
402414
}
403415

404416
impl<I: Interner> SuperVisit<I> for Const<I> {
405-
fn super_visit_with<'i>(
417+
fn super_visit_with<'i, B>(
406418
&self,
407-
visitor: &mut dyn Visitor<'i, I>,
419+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
408420
outer_binder: DebruijnIndex,
409-
) -> ControlFlow<()>
421+
) -> ControlFlow<B>
410422
where
411423
I: 'i,
412424
{
@@ -429,11 +441,11 @@ impl<I: Interner> SuperVisit<I> for Const<I> {
429441
}
430442

431443
impl<I: Interner> Visit<I> for Goal<I> {
432-
fn visit_with<'i>(
444+
fn visit_with<'i, B>(
433445
&self,
434-
visitor: &mut dyn Visitor<'i, I>,
446+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
435447
outer_binder: DebruijnIndex,
436-
) -> ControlFlow<()>
448+
) -> ControlFlow<B>
437449
where
438450
I: 'i,
439451
{
@@ -442,11 +454,11 @@ impl<I: Interner> Visit<I> for Goal<I> {
442454
}
443455

444456
impl<I: Interner> SuperVisit<I> for Goal<I> {
445-
fn super_visit_with<'i>(
457+
fn super_visit_with<'i, B>(
446458
&self,
447-
visitor: &mut dyn Visitor<'i, I>,
459+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
448460
outer_binder: DebruijnIndex,
449-
) -> ControlFlow<()>
461+
) -> ControlFlow<B>
450462
where
451463
I: 'i,
452464
{
@@ -456,11 +468,11 @@ impl<I: Interner> SuperVisit<I> for Goal<I> {
456468
}
457469

458470
impl<I: Interner> Visit<I> for ProgramClause<I> {
459-
fn visit_with<'i>(
471+
fn visit_with<'i, B>(
460472
&self,
461-
visitor: &mut dyn Visitor<'i, I>,
473+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
462474
outer_binder: DebruijnIndex,
463-
) -> ControlFlow<()>
475+
) -> ControlFlow<B>
464476
where
465477
I: 'i,
466478
{
@@ -469,11 +481,11 @@ impl<I: Interner> Visit<I> for ProgramClause<I> {
469481
}
470482

471483
impl<I: Interner> Visit<I> for WhereClause<I> {
472-
fn visit_with<'i>(
484+
fn visit_with<'i, B>(
473485
&self,
474-
visitor: &mut dyn Visitor<'i, I>,
486+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
475487
outer_binder: DebruijnIndex,
476-
) -> ControlFlow<()>
488+
) -> ControlFlow<B>
477489
where
478490
I: 'i,
479491
{
@@ -482,11 +494,11 @@ impl<I: Interner> Visit<I> for WhereClause<I> {
482494
}
483495

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

chalk-ir/src/visit/binder_impls.rs

+9-9
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
{
@@ -24,11 +24,11 @@ impl<T, I: Interner> Visit<I> for Binders<T>
2424
where
2525
T: HasInterner + Visit<I>,
2626
{
27-
fn visit_with<'i>(
27+
fn visit_with<'i, B>(
2828
&self,
29-
visitor: &mut dyn Visitor<'i, I>,
29+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
3030
outer_binder: DebruijnIndex,
31-
) -> ControlFlow<()>
31+
) -> ControlFlow<B>
3232
where
3333
I: 'i,
3434
{
@@ -41,11 +41,11 @@ where
4141
I: Interner,
4242
T: HasInterner<Interner = I> + Visit<I>,
4343
{
44-
fn visit_with<'i>(
44+
fn visit_with<'i, B>(
4545
&self,
46-
visitor: &mut dyn Visitor<'i, I>,
46+
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
4747
outer_binder: DebruijnIndex,
48-
) -> ControlFlow<()>
48+
) -> ControlFlow<B>
4949
where
5050
I: 'i,
5151
{

0 commit comments

Comments
 (0)