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.rs24
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