Skip to content

Commit 514a60a

Browse files
committed
Auto merge of #709 - LeSeulArtichaut:fallible-folder, r=jackh726
Introduce `Folder::Error` Equivalent to rust-lang/rust#85469, cc rust-lang/compiler-team#432 rust-lang/types-team#16. This compiles, but there are implementations of `Folder` that still use `Fallible<T>` instead of `Result<T, Self::Error>`. I can make that change if it is deemed beneficial. r? `@jackh726`
2 parents 9240a00 + 0a4ba8a commit 514a60a

File tree

14 files changed

+150
-120
lines changed

14 files changed

+150
-120
lines changed

chalk-derive/src/lib.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -299,11 +299,11 @@ fn derive_fold(mut s: synstructure::Structure) -> TokenStream {
299299
quote! {
300300
type Result = #result;
301301

302-
fn fold_with<'i>(
302+
fn fold_with<'i, E>(
303303
self,
304-
folder: &mut dyn ::chalk_ir::fold::Folder < 'i, #interner >,
304+
folder: &mut dyn ::chalk_ir::fold::Folder < 'i, #interner, Error = E >,
305305
outer_binder: ::chalk_ir::DebruijnIndex,
306-
) -> ::chalk_ir::Fallible<Self::Result>
306+
) -> ::std::result::Result<Self::Result, E>
307307
where
308308
#interner: 'i,
309309
{

chalk-engine/src/normalize_deep.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ impl<'i, I: Interner> Folder<'i, I> for DeepNormalizer<'_, 'i, I>
3939
where
4040
I: 'i,
4141
{
42-
fn as_dyn(&mut self) -> &mut dyn Folder<'i, I> {
42+
type Error = NoSolution;
43+
44+
fn as_dyn(&mut self) -> &mut dyn Folder<'i, I, Error = Self::Error> {
4345
self
4446
}
4547

chalk-engine/src/strand.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::fmt::Debug;
55
use chalk_derive::HasInterner;
66
use chalk_ir::fold::{Fold, Folder};
77
use chalk_ir::interner::Interner;
8-
use chalk_ir::{Canonical, DebruijnIndex, Fallible, UniverseMap};
8+
use chalk_ir::{Canonical, DebruijnIndex, UniverseMap};
99

1010
#[derive(Clone, Debug, HasInterner)]
1111
pub(crate) struct Strand<I: Interner> {
@@ -37,11 +37,11 @@ pub(crate) struct SelectedSubgoal {
3737

3838
impl<I: Interner> Fold<I> for Strand<I> {
3939
type Result = Strand<I>;
40-
fn fold_with<'i>(
40+
fn fold_with<'i, E>(
4141
self,
42-
folder: &mut dyn Folder<'i, I>,
42+
folder: &mut dyn Folder<'i, I, Error = E>,
4343
outer_binder: DebruijnIndex,
44-
) -> Fallible<Self::Result>
44+
) -> Result<Self::Result, E>
4545
where
4646
I: 'i,
4747
{

chalk-ir/src/fold.rs

+56-48
Original file line numberDiff line numberDiff line change
@@ -58,20 +58,24 @@ pub trait Folder<'i, I: Interner>
5858
where
5959
I: 'i,
6060
{
61+
/// The type this folder returns when folding fails. This is
62+
/// commonly [`NoSolution`].
63+
type Error;
64+
6165
/// Creates a `dyn` value from this folder. Unfortunately, this
6266
/// must be added manually to each impl of Folder; it permits the
6367
/// default implements below to create a `&mut dyn Folder` from
6468
/// `Self` without knowing what `Self` is (by invoking this
6569
/// method). Effectively, this limits impls of `Folder` to types
6670
/// for which we are able to create a dyn value (i.e., not `[T]`
6771
/// 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>;
6973

7074
/// Top-level callback: invoked for each `Ty<I>` that is
7175
/// encountered when folding. By default, invokes
7276
/// `super_fold_with`, which will in turn invoke the more
7377
/// 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> {
7579
ty.super_fold_with(self.as_dyn(), outer_binder)
7680
}
7781

@@ -83,7 +87,7 @@ where
8387
&mut self,
8488
lifetime: Lifetime<I>,
8589
outer_binder: DebruijnIndex,
86-
) -> Fallible<Lifetime<I>> {
90+
) -> Result<Lifetime<I>, Self::Error> {
8791
lifetime.super_fold_with(self.as_dyn(), outer_binder)
8892
}
8993

@@ -95,7 +99,7 @@ where
9599
&mut self,
96100
constant: Const<I>,
97101
outer_binder: DebruijnIndex,
98-
) -> Fallible<Const<I>> {
102+
) -> Result<Const<I>, Self::Error> {
99103
constant.super_fold_with(self.as_dyn(), outer_binder)
100104
}
101105

@@ -104,12 +108,16 @@ where
104108
&mut self,
105109
clause: ProgramClause<I>,
106110
outer_binder: DebruijnIndex,
107-
) -> Fallible<ProgramClause<I>> {
111+
) -> Result<ProgramClause<I>, Self::Error> {
108112
clause.super_fold_with(self.as_dyn(), outer_binder)
109113
}
110114

111115
/// 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> {
113121
goal.super_fold_with(self.as_dyn(), outer_binder)
114122
}
115123

@@ -133,7 +141,7 @@ where
133141
&mut self,
134142
bound_var: BoundVar,
135143
outer_binder: DebruijnIndex,
136-
) -> Fallible<Ty<I>> {
144+
) -> Result<Ty<I>, Self::Error> {
137145
if self.forbid_free_vars() {
138146
panic!(
139147
"unexpected free variable with depth `{:?}` with outer binder {:?}",
@@ -150,7 +158,7 @@ where
150158
&mut self,
151159
bound_var: BoundVar,
152160
outer_binder: DebruijnIndex,
153-
) -> Fallible<Lifetime<I>> {
161+
) -> Result<Lifetime<I>, Self::Error> {
154162
if self.forbid_free_vars() {
155163
panic!(
156164
"unexpected free variable with depth `{:?}` with outer binder {:?}",
@@ -168,7 +176,7 @@ where
168176
ty: Ty<I>,
169177
bound_var: BoundVar,
170178
outer_binder: DebruijnIndex,
171-
) -> Fallible<Const<I>> {
179+
) -> Result<Const<I>, Self::Error> {
172180
if self.forbid_free_vars() {
173181
panic!(
174182
"unexpected free variable with depth `{:?}` with outer binder {:?}",
@@ -202,7 +210,7 @@ where
202210
&mut self,
203211
universe: PlaceholderIndex,
204212
outer_binder: DebruijnIndex,
205-
) -> Fallible<Ty<I>> {
213+
) -> Result<Ty<I>, Self::Error> {
206214
if self.forbid_free_placeholders() {
207215
panic!("unexpected placeholder type `{:?}`", universe)
208216
} else {
@@ -216,7 +224,7 @@ where
216224
&mut self,
217225
universe: PlaceholderIndex,
218226
outer_binder: DebruijnIndex,
219-
) -> Fallible<Lifetime<I>> {
227+
) -> Result<Lifetime<I>, Self::Error> {
220228
if self.forbid_free_placeholders() {
221229
panic!("unexpected placeholder lifetime `{:?}`", universe)
222230
} else {
@@ -231,7 +239,7 @@ where
231239
ty: Ty<I>,
232240
universe: PlaceholderIndex,
233241
outer_binder: DebruijnIndex,
234-
) -> Fallible<Const<I>> {
242+
) -> Result<Const<I>, Self::Error> {
235243
if self.forbid_free_placeholders() {
236244
panic!("unexpected placeholder const `{:?}`", universe)
237245
} else {
@@ -259,7 +267,7 @@ where
259267
var: InferenceVar,
260268
kind: TyVariableKind,
261269
outer_binder: DebruijnIndex,
262-
) -> Fallible<Ty<I>> {
270+
) -> Result<Ty<I>, Self::Error> {
263271
if self.forbid_inference_vars() {
264272
panic!("unexpected inference type `{:?}`", var)
265273
} else {
@@ -273,7 +281,7 @@ where
273281
&mut self,
274282
var: InferenceVar,
275283
outer_binder: DebruijnIndex,
276-
) -> Fallible<Lifetime<I>> {
284+
) -> Result<Lifetime<I>, Self::Error> {
277285
if self.forbid_inference_vars() {
278286
panic!("unexpected inference lifetime `'{:?}`", var)
279287
} else {
@@ -288,7 +296,7 @@ where
288296
ty: Ty<I>,
289297
var: InferenceVar,
290298
outer_binder: DebruijnIndex,
291-
) -> Fallible<Const<I>> {
299+
) -> Result<Const<I>, Self::Error> {
292300
if self.forbid_inference_vars() {
293301
panic!("unexpected inference const `{:?}`", var)
294302
} else {
@@ -318,11 +326,11 @@ pub trait Fold<I: Interner>: Debug {
318326
/// folder. Typically `binders` starts as 0, but is adjusted when
319327
/// we encounter `Binders<T>` in the IR or other similar
320328
/// constructs.
321-
fn fold_with<'i>(
329+
fn fold_with<'i, E>(
322330
self,
323-
folder: &mut dyn Folder<'i, I>,
331+
folder: &mut dyn Folder<'i, I, Error = E>,
324332
outer_binder: DebruijnIndex,
325-
) -> Fallible<Self::Result>
333+
) -> Result<Self::Result, E>
326334
where
327335
I: 'i;
328336
}
@@ -332,11 +340,11 @@ pub trait Fold<I: Interner>: Debug {
332340
/// the contents of the type.
333341
pub trait SuperFold<I: Interner>: Fold<I> {
334342
/// Recursively folds the value.
335-
fn super_fold_with<'i>(
343+
fn super_fold_with<'i, E>(
336344
self,
337-
folder: &mut dyn Folder<'i, I>,
345+
folder: &mut dyn Folder<'i, I, Error = E>,
338346
outer_binder: DebruijnIndex,
339-
) -> Fallible<Self::Result>
347+
) -> Result<Self::Result, E>
340348
where
341349
I: 'i;
342350
}
@@ -347,11 +355,11 @@ pub trait SuperFold<I: Interner>: Fold<I> {
347355
impl<I: Interner> Fold<I> for Ty<I> {
348356
type Result = Ty<I>;
349357

350-
fn fold_with<'i>(
358+
fn fold_with<'i, E>(
351359
self,
352-
folder: &mut dyn Folder<'i, I>,
360+
folder: &mut dyn Folder<'i, I, Error = E>,
353361
outer_binder: DebruijnIndex,
354-
) -> Fallible<Self::Result>
362+
) -> Result<Self::Result, E>
355363
where
356364
I: 'i,
357365
{
@@ -364,11 +372,11 @@ impl<I> SuperFold<I> for Ty<I>
364372
where
365373
I: Interner,
366374
{
367-
fn super_fold_with<'i>(
375+
fn super_fold_with<'i, E>(
368376
self,
369-
folder: &mut dyn Folder<'i, I>,
377+
folder: &mut dyn Folder<'i, I, Error = E>,
370378
outer_binder: DebruijnIndex,
371-
) -> Fallible<Ty<I>>
379+
) -> Result<Ty<I>, E>
372380
where
373381
I: 'i,
374382
{
@@ -477,11 +485,11 @@ where
477485
impl<I: Interner> Fold<I> for Lifetime<I> {
478486
type Result = Lifetime<I>;
479487

480-
fn fold_with<'i>(
488+
fn fold_with<'i, E>(
481489
self,
482-
folder: &mut dyn Folder<'i, I>,
490+
folder: &mut dyn Folder<'i, I, Error = E>,
483491
outer_binder: DebruijnIndex,
484-
) -> Fallible<Self::Result>
492+
) -> Result<Self::Result, E>
485493
where
486494
I: 'i,
487495
{
@@ -493,11 +501,11 @@ impl<I> SuperFold<I> for Lifetime<I>
493501
where
494502
I: Interner,
495503
{
496-
fn super_fold_with<'i>(
504+
fn super_fold_with<'i, E>(
497505
self,
498-
folder: &mut dyn Folder<'i, I>,
506+
folder: &mut dyn Folder<'i, I, Error = E>,
499507
outer_binder: DebruijnIndex,
500-
) -> Fallible<Lifetime<I>>
508+
) -> Result<Lifetime<I>, E>
501509
where
502510
I: 'i,
503511
{
@@ -535,11 +543,11 @@ where
535543
impl<I: Interner> Fold<I> for Const<I> {
536544
type Result = Const<I>;
537545

538-
fn fold_with<'i>(
546+
fn fold_with<'i, E>(
539547
self,
540-
folder: &mut dyn Folder<'i, I>,
548+
folder: &mut dyn Folder<'i, I, Error = E>,
541549
outer_binder: DebruijnIndex,
542-
) -> Fallible<Self::Result>
550+
) -> Result<Self::Result, E>
543551
where
544552
I: 'i,
545553
{
@@ -551,11 +559,11 @@ impl<I> SuperFold<I> for Const<I>
551559
where
552560
I: Interner,
553561
{
554-
fn super_fold_with<'i>(
562+
fn super_fold_with<'i, E>(
555563
self,
556-
folder: &mut dyn Folder<'i, I>,
564+
folder: &mut dyn Folder<'i, I, Error = E>,
557565
outer_binder: DebruijnIndex,
558-
) -> Fallible<Const<I>>
566+
) -> Result<Const<I>, E>
559567
where
560568
I: 'i,
561569
{
@@ -592,11 +600,11 @@ where
592600
impl<I: Interner> Fold<I> for Goal<I> {
593601
type Result = Goal<I>;
594602

595-
fn fold_with<'i>(
603+
fn fold_with<'i, E>(
596604
self,
597-
folder: &mut dyn Folder<'i, I>,
605+
folder: &mut dyn Folder<'i, I, Error = E>,
598606
outer_binder: DebruijnIndex,
599-
) -> Fallible<Self::Result>
607+
) -> Result<Self::Result, E>
600608
where
601609
I: 'i,
602610
{
@@ -606,11 +614,11 @@ impl<I: Interner> Fold<I> for Goal<I> {
606614

607615
/// Superfold folds recursively.
608616
impl<I: Interner> SuperFold<I> for Goal<I> {
609-
fn super_fold_with<'i>(
617+
fn super_fold_with<'i, E>(
610618
self,
611-
folder: &mut dyn Folder<'i, I>,
619+
folder: &mut dyn Folder<'i, I, Error = E>,
612620
outer_binder: DebruijnIndex,
613-
) -> Fallible<Self::Result>
621+
) -> Result<Self::Result, E>
614622
where
615623
I: 'i,
616624
{
@@ -630,11 +638,11 @@ impl<I: Interner> SuperFold<I> for Goal<I> {
630638
impl<I: Interner> Fold<I> for ProgramClause<I> {
631639
type Result = ProgramClause<I>;
632640

633-
fn fold_with<'i>(
641+
fn fold_with<'i, E>(
634642
self,
635-
folder: &mut dyn Folder<'i, I>,
643+
folder: &mut dyn Folder<'i, I, Error = E>,
636644
outer_binder: DebruijnIndex,
637-
) -> Fallible<Self::Result>
645+
) -> Result<Self::Result, E>
638646
where
639647
I: 'i,
640648
{

0 commit comments

Comments
 (0)