@@ -82,20 +82,23 @@ pub trait Visitor<'i, I: Interner>
8282where
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.
243254pub 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.
257268impl < 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>
272283where
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
348359impl < 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
361372impl < 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
389400impl < 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
402413impl < 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
429440impl < 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
442453impl < 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
456467impl < 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
469480impl < 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
482493impl < 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 {
0 commit comments