@@ -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 {
@@ -389,11 +401,11 @@ impl<I: Interner> SuperVisit<I> for Lifetime<I> {
389401}
390402
391403impl < 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
404416impl < 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
431443impl < 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
444456impl < 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
458470impl < 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
471483impl < 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
484496impl < 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 {
0 commit comments