@@ -117,6 +117,7 @@ enum DeriveKind {
117
117
FromInterner ,
118
118
}
119
119
120
+ decl_derive ! ( [ FallibleTypeFolder , attributes( has_interner) ] => derive_fallible_type_folder) ;
120
121
decl_derive ! ( [ HasInterner , attributes( has_interner) ] => derive_has_interner) ;
121
122
decl_derive ! ( [ TypeVisitable , attributes( has_interner) ] => derive_type_visitable) ;
122
123
decl_derive ! ( [ TypeSuperVisitable , attributes( has_interner) ] => derive_type_super_visitable) ;
@@ -295,3 +296,150 @@ fn derive_type_foldable(mut s: synstructure::Structure) -> TokenStream {
295
296
} ,
296
297
)
297
298
}
299
+
300
+ fn derive_fallible_type_folder ( mut s : synstructure:: Structure ) -> TokenStream {
301
+ let ( interner, _) = find_interner ( & mut s) ;
302
+ s. underscore_const ( true ) ;
303
+ s. unbound_impl (
304
+ quote ! ( :: chalk_ir:: fold:: FallibleTypeFolder <#interner>) ,
305
+ quote ! {
306
+ type Error = :: core:: convert:: Infallible ;
307
+
308
+ fn as_dyn( & mut self ) -> & mut dyn :: chalk_ir:: fold:: FallibleTypeFolder <I , Error = Self :: Error > {
309
+ self
310
+ }
311
+
312
+ fn try_fold_ty(
313
+ & mut self ,
314
+ ty: :: chalk_ir:: Ty <#interner>,
315
+ outer_binder: :: chalk_ir:: DebruijnIndex ,
316
+ ) -> :: core:: result:: Result <:: chalk_ir:: Ty <#interner>, Self :: Error > {
317
+ :: core:: result:: Result :: Ok ( :: chalk_ir:: fold:: TypeFolder :: fold_ty( self , ty, outer_binder) )
318
+ }
319
+
320
+ fn try_fold_lifetime(
321
+ & mut self ,
322
+ lifetime: :: chalk_ir:: Lifetime <#interner>,
323
+ outer_binder: :: chalk_ir:: DebruijnIndex ,
324
+ ) -> :: core:: result:: Result <:: chalk_ir:: Lifetime <#interner>, Self :: Error > {
325
+ :: core:: result:: Result :: Ok ( :: chalk_ir:: fold:: TypeFolder :: fold_lifetime( self , lifetime, outer_binder) )
326
+ }
327
+
328
+ fn try_fold_const(
329
+ & mut self ,
330
+ constant: :: chalk_ir:: Const <#interner>,
331
+ outer_binder: :: chalk_ir:: DebruijnIndex ,
332
+ ) -> :: core:: result:: Result <:: chalk_ir:: Const <#interner>, Self :: Error > {
333
+ :: core:: result:: Result :: Ok ( :: chalk_ir:: fold:: TypeFolder :: fold_const( self , constant, outer_binder) )
334
+ }
335
+
336
+ fn try_fold_program_clause(
337
+ & mut self ,
338
+ clause: :: chalk_ir:: ProgramClause <#interner>,
339
+ outer_binder: :: chalk_ir:: DebruijnIndex ,
340
+ ) -> :: core:: result:: Result <:: chalk_ir:: ProgramClause <#interner>, Self :: Error > {
341
+ :: core:: result:: Result :: Ok ( :: chalk_ir:: fold:: TypeFolder :: fold_program_clause( self , clause, outer_binder) )
342
+ }
343
+
344
+ fn try_fold_goal(
345
+ & mut self ,
346
+ goal: :: chalk_ir:: Goal <#interner>,
347
+ outer_binder: :: chalk_ir:: DebruijnIndex ,
348
+ ) -> :: core:: result:: Result <:: chalk_ir:: Goal <#interner>, Self :: Error > {
349
+ :: core:: result:: Result :: Ok ( :: chalk_ir:: fold:: TypeFolder :: fold_goal( self , goal, outer_binder) )
350
+ }
351
+
352
+ fn forbid_free_vars( & self ) -> bool {
353
+ :: chalk_ir:: fold:: TypeFolder :: forbid_free_vars( self )
354
+ }
355
+
356
+ fn try_fold_free_var_ty(
357
+ & mut self ,
358
+ bound_var: :: chalk_ir:: BoundVar ,
359
+ outer_binder: :: chalk_ir:: DebruijnIndex ,
360
+ ) -> :: core:: result:: Result <:: chalk_ir:: Ty <#interner>, Self :: Error > {
361
+ :: core:: result:: Result :: Ok ( :: chalk_ir:: fold:: TypeFolder :: fold_free_var_ty( self , bound_var, outer_binder) )
362
+ }
363
+
364
+ fn try_fold_free_var_lifetime(
365
+ & mut self ,
366
+ bound_var: :: chalk_ir:: BoundVar ,
367
+ outer_binder: :: chalk_ir:: DebruijnIndex ,
368
+ ) -> :: core:: result:: Result <:: chalk_ir:: Lifetime <#interner>, Self :: Error > {
369
+ :: core:: result:: Result :: Ok ( :: chalk_ir:: fold:: TypeFolder :: fold_free_var_lifetime( self , bound_var, outer_binder) )
370
+ }
371
+
372
+ fn try_fold_free_var_const(
373
+ & mut self ,
374
+ ty: :: chalk_ir:: Ty <#interner>,
375
+ bound_var: :: chalk_ir:: BoundVar ,
376
+ outer_binder: :: chalk_ir:: DebruijnIndex ,
377
+ ) -> :: core:: result:: Result <:: chalk_ir:: Const <#interner>, Self :: Error > {
378
+ :: core:: result:: Result :: Ok ( :: chalk_ir:: fold:: TypeFolder :: fold_free_var_const( self , ty, bound_var, outer_binder) )
379
+ }
380
+
381
+ fn forbid_free_placeholders( & self ) -> bool {
382
+ :: chalk_ir:: fold:: TypeFolder :: forbid_free_placeholders( self )
383
+ }
384
+
385
+ fn try_fold_free_placeholder_ty(
386
+ & mut self ,
387
+ universe: :: chalk_ir:: PlaceholderIndex ,
388
+ outer_binder: :: chalk_ir:: DebruijnIndex ,
389
+ ) -> :: core:: result:: Result <:: chalk_ir:: Ty <#interner>, Self :: Error > {
390
+ :: core:: result:: Result :: Ok ( :: chalk_ir:: fold:: TypeFolder :: fold_free_placeholder_ty( self , universe, outer_binder) )
391
+ }
392
+
393
+ fn try_fold_free_placeholder_lifetime(
394
+ & mut self ,
395
+ universe: :: chalk_ir:: PlaceholderIndex ,
396
+ outer_binder: :: chalk_ir:: DebruijnIndex ,
397
+ ) -> :: core:: result:: Result <:: chalk_ir:: Lifetime <#interner>, Self :: Error > {
398
+ :: core:: result:: Result :: Ok ( :: chalk_ir:: fold:: TypeFolder :: fold_free_placeholder_lifetime( self , universe, outer_binder) )
399
+ }
400
+
401
+ fn try_fold_free_placeholder_const(
402
+ & mut self ,
403
+ ty: :: chalk_ir:: Ty <#interner>,
404
+ universe: :: chalk_ir:: PlaceholderIndex ,
405
+ outer_binder: :: chalk_ir:: DebruijnIndex ,
406
+ ) -> :: core:: result:: Result <:: chalk_ir:: Const <#interner>, Self :: Error > {
407
+ :: core:: result:: Result :: Ok ( :: chalk_ir:: fold:: TypeFolder :: fold_free_placeholder_const( self , ty, universe, outer_binder) )
408
+ }
409
+
410
+ fn forbid_inference_vars( & self ) -> bool {
411
+ :: chalk_ir:: fold:: TypeFolder :: forbid_inference_vars( self )
412
+ }
413
+
414
+ fn try_fold_inference_ty(
415
+ & mut self ,
416
+ var: :: chalk_ir:: InferenceVar ,
417
+ kind: :: chalk_ir:: TyVariableKind ,
418
+ outer_binder: :: chalk_ir:: DebruijnIndex ,
419
+ ) -> :: core:: result:: Result <:: chalk_ir:: Ty <#interner>, Self :: Error > {
420
+ :: core:: result:: Result :: Ok ( :: chalk_ir:: fold:: TypeFolder :: fold_inference_ty( self , var, kind, outer_binder) )
421
+ }
422
+
423
+ fn try_fold_inference_lifetime(
424
+ & mut self ,
425
+ var: :: chalk_ir:: InferenceVar ,
426
+ outer_binder: :: chalk_ir:: DebruijnIndex ,
427
+ ) -> :: core:: result:: Result <:: chalk_ir:: Lifetime <#interner>, Self :: Error > {
428
+ :: core:: result:: Result :: Ok ( :: chalk_ir:: fold:: TypeFolder :: fold_inference_lifetime( self , var, outer_binder) )
429
+ }
430
+
431
+ fn try_fold_inference_const(
432
+ & mut self ,
433
+ ty: :: chalk_ir:: Ty <#interner>,
434
+ var: :: chalk_ir:: InferenceVar ,
435
+ outer_binder: :: chalk_ir:: DebruijnIndex ,
436
+ ) -> :: core:: result:: Result <:: chalk_ir:: Const <#interner>, Self :: Error > {
437
+ :: core:: result:: Result :: Ok ( :: chalk_ir:: fold:: TypeFolder :: fold_inference_const( self , ty, var, outer_binder) )
438
+ }
439
+
440
+ fn interner( & self ) -> #interner {
441
+ :: chalk_ir:: fold:: TypeFolder :: interner( self )
442
+ }
443
+ } ,
444
+ )
445
+ }
0 commit comments