Skip to content

Commit 48f1cfc

Browse files
committed
derive(FallibleTypeFolder) for infallible folders
1 parent bbcdc79 commit 48f1cfc

File tree

1 file changed

+148
-0
lines changed

1 file changed

+148
-0
lines changed

chalk-derive/src/lib.rs

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ enum DeriveKind {
117117
FromInterner,
118118
}
119119

120+
decl_derive!([FallibleTypeFolder, attributes(has_interner)] => derive_fallible_type_folder);
120121
decl_derive!([HasInterner, attributes(has_interner)] => derive_has_interner);
121122
decl_derive!([TypeVisitable, attributes(has_interner)] => derive_type_visitable);
122123
decl_derive!([TypeSuperVisitable, attributes(has_interner)] => derive_type_super_visitable);
@@ -295,3 +296,150 @@ fn derive_type_foldable(mut s: synstructure::Structure) -> TokenStream {
295296
},
296297
)
297298
}
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

Comments
 (0)