Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/query-group-macro/src/queries.rs')
| -rw-r--r-- | crates/query-group-macro/src/queries.rs | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/crates/query-group-macro/src/queries.rs b/crates/query-group-macro/src/queries.rs index 20458acd55..edbb645bf4 100644 --- a/crates/query-group-macro/src/queries.rs +++ b/crates/query-group-macro/src/queries.rs @@ -3,13 +3,15 @@ use quote::{ToTokens, format_ident, quote, quote_spanned}; use syn::{FnArg, Ident, PatType, Path, Receiver, ReturnType, Type, parse_quote, spanned::Spanned}; +use crate::Cycle; + pub(crate) struct TrackedQuery { pub(crate) trait_name: Ident, pub(crate) signature: syn::Signature, pub(crate) pat_and_tys: Vec<PatType>, pub(crate) invoke: Option<Path>, pub(crate) default: Option<syn::Block>, - pub(crate) cycle: Option<Path>, + pub(crate) cycle: Option<Cycle>, pub(crate) lru: Option<u32>, pub(crate) generated_struct: Option<GeneratedInputStruct>, } @@ -34,12 +36,20 @@ impl ToTokens for TrackedQuery { let fn_ident = &sig.ident; let shim: Ident = format_ident!("{}_shim", fn_ident); - let annotation = match (self.cycle.clone(), self.lru) { - (Some(cycle), Some(lru)) => quote!(#[salsa::tracked(lru = #lru, recovery_fn = #cycle)]), - (Some(cycle), None) => quote!(#[salsa::tracked(recovery_fn = #cycle)]), - (None, Some(lru)) => quote!(#[salsa::tracked(lru = #lru)]), - (None, None) => quote!(#[salsa::tracked]), - }; + let options = self + .cycle + .as_ref() + .map(|Cycle { cycle_fn, cycle_initial, cycle_result }| { + let cycle_fn = cycle_fn.as_ref().map(|(ident, path)| quote!(#ident=#path)); + let cycle_initial = + cycle_initial.as_ref().map(|(ident, path)| quote!(#ident=#path)); + let cycle_result = cycle_result.as_ref().map(|(ident, path)| quote!(#ident=#path)); + let options = cycle_fn.into_iter().chain(cycle_initial).chain(cycle_result); + quote!(#(#options),*) + }) + .into_iter() + .chain(self.lru.map(|lru| quote!(lru = #lru))); + let annotation = quote!(#[salsa::tracked( #(#options),* )]); let pat_and_tys = &self.pat_and_tys; let params = self |