salsa/components/salsa-macro-rules/src/setup_method_body.rs
Niko Matsakis 812923ab0c wip
2024-07-18 07:49:06 -04:00

40 lines
1.3 KiB
Rust

#[macro_export]
macro_rules! setup_method_body {
(
salsa_tracked_attr: #[$salsa_tracked_attr:meta],
self: $self:ident,
self_ty: $self_ty:ty,
db_lt: $($db_lt:lifetime)?,
db: $db:ident,
db_ty: ($($db_ty:tt)*),
input_ids: [$($input_id:ident),*],
input_tys: [$($input_ty:ty),*],
output_ty: $output_ty:ty,
inner_fn_name: $inner_fn_name:ident,
inner_fn: $inner_fn:item,
// Annoyingly macro-rules hygiene does not extend to items defined in the macro.
// We have the procedural macro generate names for those items that are
// not used elsewhere in the user's code.
unused_names: [
$InnerTrait:ident,
]
) => {
{
trait $InnerTrait<$($db_lt)?> {
fn $inner_fn_name($self, db: $($db_ty)*, $($input_id: $input_ty),*) -> $output_ty;
}
impl<$($db_lt)?> $InnerTrait<$($db_lt)?> for $self_ty {
$inner_fn
}
#[$salsa_tracked_attr]
fn $inner_fn_name<$($db_lt)?>(db: $($db_ty)*, this: $self_ty, $($input_id: $input_ty),*) -> $output_ty {
<$self_ty as $InnerTrait>::$inner_fn_name(this, db, $($input_id),*)
}
$inner_fn_name($db, $self, $($input_id),*)
}
};
}