@@ -58,20 +58,24 @@ pub trait Folder<'i, I: Interner>
58
58
where
59
59
I : ' i ,
60
60
{
61
+ /// The type this folder returns when folding fails. This is
62
+ /// commonly [`NoSolution`].
63
+ type Error ;
64
+
61
65
/// Creates a `dyn` value from this folder. Unfortunately, this
62
66
/// must be added manually to each impl of Folder; it permits the
63
67
/// default implements below to create a `&mut dyn Folder` from
64
68
/// `Self` without knowing what `Self` is (by invoking this
65
69
/// method). Effectively, this limits impls of `Folder` to types
66
70
/// for which we are able to create a dyn value (i.e., not `[T]`
67
71
/// types).
68
- fn as_dyn ( & mut self ) -> & mut dyn Folder < ' i , I > ;
72
+ fn as_dyn ( & mut self ) -> & mut dyn Folder < ' i , I , Error = Self :: Error > ;
69
73
70
74
/// Top-level callback: invoked for each `Ty<I>` that is
71
75
/// encountered when folding. By default, invokes
72
76
/// `super_fold_with`, which will in turn invoke the more
73
77
/// specialized folding methods below, like `fold_free_var_ty`.
74
- fn fold_ty ( & mut self , ty : Ty < I > , outer_binder : DebruijnIndex ) -> Fallible < Ty < I > > {
78
+ fn fold_ty ( & mut self , ty : Ty < I > , outer_binder : DebruijnIndex ) -> Result < Ty < I > , Self :: Error > {
75
79
ty. super_fold_with ( self . as_dyn ( ) , outer_binder)
76
80
}
77
81
83
87
& mut self ,
84
88
lifetime : Lifetime < I > ,
85
89
outer_binder : DebruijnIndex ,
86
- ) -> Fallible < Lifetime < I > > {
90
+ ) -> Result < Lifetime < I > , Self :: Error > {
87
91
lifetime. super_fold_with ( self . as_dyn ( ) , outer_binder)
88
92
}
89
93
95
99
& mut self ,
96
100
constant : Const < I > ,
97
101
outer_binder : DebruijnIndex ,
98
- ) -> Fallible < Const < I > > {
102
+ ) -> Result < Const < I > , Self :: Error > {
99
103
constant. super_fold_with ( self . as_dyn ( ) , outer_binder)
100
104
}
101
105
@@ -104,12 +108,16 @@ where
104
108
& mut self ,
105
109
clause : ProgramClause < I > ,
106
110
outer_binder : DebruijnIndex ,
107
- ) -> Fallible < ProgramClause < I > > {
111
+ ) -> Result < ProgramClause < I > , Self :: Error > {
108
112
clause. super_fold_with ( self . as_dyn ( ) , outer_binder)
109
113
}
110
114
111
115
/// Invoked for every goal. By default, recursively folds the goals contents.
112
- fn fold_goal ( & mut self , goal : Goal < I > , outer_binder : DebruijnIndex ) -> Fallible < Goal < I > > {
116
+ fn fold_goal (
117
+ & mut self ,
118
+ goal : Goal < I > ,
119
+ outer_binder : DebruijnIndex ,
120
+ ) -> Result < Goal < I > , Self :: Error > {
113
121
goal. super_fold_with ( self . as_dyn ( ) , outer_binder)
114
122
}
115
123
@@ -133,7 +141,7 @@ where
133
141
& mut self ,
134
142
bound_var : BoundVar ,
135
143
outer_binder : DebruijnIndex ,
136
- ) -> Fallible < Ty < I > > {
144
+ ) -> Result < Ty < I > , Self :: Error > {
137
145
if self . forbid_free_vars ( ) {
138
146
panic ! (
139
147
"unexpected free variable with depth `{:?}` with outer binder {:?}" ,
@@ -150,7 +158,7 @@ where
150
158
& mut self ,
151
159
bound_var : BoundVar ,
152
160
outer_binder : DebruijnIndex ,
153
- ) -> Fallible < Lifetime < I > > {
161
+ ) -> Result < Lifetime < I > , Self :: Error > {
154
162
if self . forbid_free_vars ( ) {
155
163
panic ! (
156
164
"unexpected free variable with depth `{:?}` with outer binder {:?}" ,
@@ -168,7 +176,7 @@ where
168
176
ty : Ty < I > ,
169
177
bound_var : BoundVar ,
170
178
outer_binder : DebruijnIndex ,
171
- ) -> Fallible < Const < I > > {
179
+ ) -> Result < Const < I > , Self :: Error > {
172
180
if self . forbid_free_vars ( ) {
173
181
panic ! (
174
182
"unexpected free variable with depth `{:?}` with outer binder {:?}" ,
@@ -202,7 +210,7 @@ where
202
210
& mut self ,
203
211
universe : PlaceholderIndex ,
204
212
outer_binder : DebruijnIndex ,
205
- ) -> Fallible < Ty < I > > {
213
+ ) -> Result < Ty < I > , Self :: Error > {
206
214
if self . forbid_free_placeholders ( ) {
207
215
panic ! ( "unexpected placeholder type `{:?}`" , universe)
208
216
} else {
@@ -216,7 +224,7 @@ where
216
224
& mut self ,
217
225
universe : PlaceholderIndex ,
218
226
outer_binder : DebruijnIndex ,
219
- ) -> Fallible < Lifetime < I > > {
227
+ ) -> Result < Lifetime < I > , Self :: Error > {
220
228
if self . forbid_free_placeholders ( ) {
221
229
panic ! ( "unexpected placeholder lifetime `{:?}`" , universe)
222
230
} else {
@@ -231,7 +239,7 @@ where
231
239
ty : Ty < I > ,
232
240
universe : PlaceholderIndex ,
233
241
outer_binder : DebruijnIndex ,
234
- ) -> Fallible < Const < I > > {
242
+ ) -> Result < Const < I > , Self :: Error > {
235
243
if self . forbid_free_placeholders ( ) {
236
244
panic ! ( "unexpected placeholder const `{:?}`" , universe)
237
245
} else {
@@ -259,7 +267,7 @@ where
259
267
var : InferenceVar ,
260
268
kind : TyVariableKind ,
261
269
outer_binder : DebruijnIndex ,
262
- ) -> Fallible < Ty < I > > {
270
+ ) -> Result < Ty < I > , Self :: Error > {
263
271
if self . forbid_inference_vars ( ) {
264
272
panic ! ( "unexpected inference type `{:?}`" , var)
265
273
} else {
@@ -273,7 +281,7 @@ where
273
281
& mut self ,
274
282
var : InferenceVar ,
275
283
outer_binder : DebruijnIndex ,
276
- ) -> Fallible < Lifetime < I > > {
284
+ ) -> Result < Lifetime < I > , Self :: Error > {
277
285
if self . forbid_inference_vars ( ) {
278
286
panic ! ( "unexpected inference lifetime `'{:?}`" , var)
279
287
} else {
@@ -288,7 +296,7 @@ where
288
296
ty : Ty < I > ,
289
297
var : InferenceVar ,
290
298
outer_binder : DebruijnIndex ,
291
- ) -> Fallible < Const < I > > {
299
+ ) -> Result < Const < I > , Self :: Error > {
292
300
if self . forbid_inference_vars ( ) {
293
301
panic ! ( "unexpected inference const `{:?}`" , var)
294
302
} else {
@@ -318,11 +326,11 @@ pub trait Fold<I: Interner>: Debug {
318
326
/// folder. Typically `binders` starts as 0, but is adjusted when
319
327
/// we encounter `Binders<T>` in the IR or other similar
320
328
/// constructs.
321
- fn fold_with < ' i > (
329
+ fn fold_with < ' i , E > (
322
330
self ,
323
- folder : & mut dyn Folder < ' i , I > ,
331
+ folder : & mut dyn Folder < ' i , I , Error = E > ,
324
332
outer_binder : DebruijnIndex ,
325
- ) -> Fallible < Self :: Result >
333
+ ) -> Result < Self :: Result , E >
326
334
where
327
335
I : ' i ;
328
336
}
@@ -332,11 +340,11 @@ pub trait Fold<I: Interner>: Debug {
332
340
/// the contents of the type.
333
341
pub trait SuperFold < I : Interner > : Fold < I > {
334
342
/// Recursively folds the value.
335
- fn super_fold_with < ' i > (
343
+ fn super_fold_with < ' i , E > (
336
344
self ,
337
- folder : & mut dyn Folder < ' i , I > ,
345
+ folder : & mut dyn Folder < ' i , I , Error = E > ,
338
346
outer_binder : DebruijnIndex ,
339
- ) -> Fallible < Self :: Result >
347
+ ) -> Result < Self :: Result , E >
340
348
where
341
349
I : ' i ;
342
350
}
@@ -347,11 +355,11 @@ pub trait SuperFold<I: Interner>: Fold<I> {
347
355
impl < I : Interner > Fold < I > for Ty < I > {
348
356
type Result = Ty < I > ;
349
357
350
- fn fold_with < ' i > (
358
+ fn fold_with < ' i , E > (
351
359
self ,
352
- folder : & mut dyn Folder < ' i , I > ,
360
+ folder : & mut dyn Folder < ' i , I , Error = E > ,
353
361
outer_binder : DebruijnIndex ,
354
- ) -> Fallible < Self :: Result >
362
+ ) -> Result < Self :: Result , E >
355
363
where
356
364
I : ' i ,
357
365
{
@@ -364,11 +372,11 @@ impl<I> SuperFold<I> for Ty<I>
364
372
where
365
373
I : Interner ,
366
374
{
367
- fn super_fold_with < ' i > (
375
+ fn super_fold_with < ' i , E > (
368
376
self ,
369
- folder : & mut dyn Folder < ' i , I > ,
377
+ folder : & mut dyn Folder < ' i , I , Error = E > ,
370
378
outer_binder : DebruijnIndex ,
371
- ) -> Fallible < Ty < I > >
379
+ ) -> Result < Ty < I > , E >
372
380
where
373
381
I : ' i ,
374
382
{
@@ -477,11 +485,11 @@ where
477
485
impl < I : Interner > Fold < I > for Lifetime < I > {
478
486
type Result = Lifetime < I > ;
479
487
480
- fn fold_with < ' i > (
488
+ fn fold_with < ' i , E > (
481
489
self ,
482
- folder : & mut dyn Folder < ' i , I > ,
490
+ folder : & mut dyn Folder < ' i , I , Error = E > ,
483
491
outer_binder : DebruijnIndex ,
484
- ) -> Fallible < Self :: Result >
492
+ ) -> Result < Self :: Result , E >
485
493
where
486
494
I : ' i ,
487
495
{
@@ -493,11 +501,11 @@ impl<I> SuperFold<I> for Lifetime<I>
493
501
where
494
502
I : Interner ,
495
503
{
496
- fn super_fold_with < ' i > (
504
+ fn super_fold_with < ' i , E > (
497
505
self ,
498
- folder : & mut dyn Folder < ' i , I > ,
506
+ folder : & mut dyn Folder < ' i , I , Error = E > ,
499
507
outer_binder : DebruijnIndex ,
500
- ) -> Fallible < Lifetime < I > >
508
+ ) -> Result < Lifetime < I > , E >
501
509
where
502
510
I : ' i ,
503
511
{
@@ -535,11 +543,11 @@ where
535
543
impl < I : Interner > Fold < I > for Const < I > {
536
544
type Result = Const < I > ;
537
545
538
- fn fold_with < ' i > (
546
+ fn fold_with < ' i , E > (
539
547
self ,
540
- folder : & mut dyn Folder < ' i , I > ,
548
+ folder : & mut dyn Folder < ' i , I , Error = E > ,
541
549
outer_binder : DebruijnIndex ,
542
- ) -> Fallible < Self :: Result >
550
+ ) -> Result < Self :: Result , E >
543
551
where
544
552
I : ' i ,
545
553
{
@@ -551,11 +559,11 @@ impl<I> SuperFold<I> for Const<I>
551
559
where
552
560
I : Interner ,
553
561
{
554
- fn super_fold_with < ' i > (
562
+ fn super_fold_with < ' i , E > (
555
563
self ,
556
- folder : & mut dyn Folder < ' i , I > ,
564
+ folder : & mut dyn Folder < ' i , I , Error = E > ,
557
565
outer_binder : DebruijnIndex ,
558
- ) -> Fallible < Const < I > >
566
+ ) -> Result < Const < I > , E >
559
567
where
560
568
I : ' i ,
561
569
{
@@ -592,11 +600,11 @@ where
592
600
impl < I : Interner > Fold < I > for Goal < I > {
593
601
type Result = Goal < I > ;
594
602
595
- fn fold_with < ' i > (
603
+ fn fold_with < ' i , E > (
596
604
self ,
597
- folder : & mut dyn Folder < ' i , I > ,
605
+ folder : & mut dyn Folder < ' i , I , Error = E > ,
598
606
outer_binder : DebruijnIndex ,
599
- ) -> Fallible < Self :: Result >
607
+ ) -> Result < Self :: Result , E >
600
608
where
601
609
I : ' i ,
602
610
{
@@ -606,11 +614,11 @@ impl<I: Interner> Fold<I> for Goal<I> {
606
614
607
615
/// Superfold folds recursively.
608
616
impl < I : Interner > SuperFold < I > for Goal < I > {
609
- fn super_fold_with < ' i > (
617
+ fn super_fold_with < ' i , E > (
610
618
self ,
611
- folder : & mut dyn Folder < ' i , I > ,
619
+ folder : & mut dyn Folder < ' i , I , Error = E > ,
612
620
outer_binder : DebruijnIndex ,
613
- ) -> Fallible < Self :: Result >
621
+ ) -> Result < Self :: Result , E >
614
622
where
615
623
I : ' i ,
616
624
{
@@ -630,11 +638,11 @@ impl<I: Interner> SuperFold<I> for Goal<I> {
630
638
impl < I : Interner > Fold < I > for ProgramClause < I > {
631
639
type Result = ProgramClause < I > ;
632
640
633
- fn fold_with < ' i > (
641
+ fn fold_with < ' i , E > (
634
642
self ,
635
- folder : & mut dyn Folder < ' i , I > ,
643
+ folder : & mut dyn Folder < ' i , I , Error = E > ,
636
644
outer_binder : DebruijnIndex ,
637
- ) -> Fallible < Self :: Result >
645
+ ) -> Result < Self :: Result , E >
638
646
where
639
647
I : ' i ,
640
648
{
0 commit comments