@@ -82,20 +82,24 @@ pub trait Visitor<'i, I: Interner>
8282where
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.
243255pub 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.
257269impl < 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>
272284where
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
348360impl < 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
361373impl < 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
389401impl < 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
402414impl < 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
429441impl < 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
442454impl < 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
456468impl < 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
469481impl < 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
482494impl < 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 {
0 commit comments