Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/query-group-macro/src/lib.rs')
| -rw-r--r-- | crates/query-group-macro/src/lib.rs | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/crates/query-group-macro/src/lib.rs b/crates/query-group-macro/src/lib.rs index 8507ad07d1..958723790c 100644 --- a/crates/query-group-macro/src/lib.rs +++ b/crates/query-group-macro/src/lib.rs @@ -12,7 +12,9 @@ use queries::{ use quote::{ToTokens, format_ident, quote}; use syn::spanned::Spanned; use syn::visit_mut::VisitMut; -use syn::{Attribute, FnArg, ItemTrait, Path, TraitItem, TraitItemFn, parse_quote}; +use syn::{ + Attribute, FnArg, ItemTrait, Path, TraitItem, TraitItemFn, parse_quote, parse_quote_spanned, +}; mod queries; @@ -127,12 +129,12 @@ pub(crate) fn query_group_impl( let mut lookup_signatures = vec![]; let mut lookup_methods = vec![]; - for item in item_trait.clone().items { + for item in &mut item_trait.items { if let syn::TraitItem::Fn(method) = item { let method_name = &method.sig.ident; - let signature = &method.sig.clone(); + let signature = &method.sig; - let (_attrs, salsa_attrs) = filter_attrs(method.attrs); + let (_attrs, salsa_attrs) = filter_attrs(method.attrs.clone()); let mut query_kind = QueryKind::Tracked; let mut invoke = None; @@ -190,6 +192,9 @@ pub(crate) fn query_group_impl( invoke = Some(path.0.clone()); query_kind = QueryKind::TrackedWithSalsaStruct; } + "tracked" if method.default.is_some() => { + query_kind = QueryKind::TrackedWithSalsaStruct; + } "lru" => { let lru_count = syn::parse::<Parenthesized<syn::LitInt>>(tts)?; let lru_count = lru_count.0.base10_parse::<u32>()?; @@ -218,6 +223,10 @@ pub(crate) fn query_group_impl( } } + if let Some(block) = &mut method.default { + SelfToDbRewriter.visit_block_mut(block); + } + match (query_kind, invoke) { // input (QueryKind::Input, None) => { @@ -277,31 +286,35 @@ pub(crate) fn query_group_impl( invoke, cycle, lru, + default: method.default.take(), }; trait_methods.push(Queries::TrackedQuery(method)); } - (QueryKind::TrackedWithSalsaStruct, Some(invoke)) => { + (QueryKind::TrackedWithSalsaStruct, invoke) => { + // while it is possible to make this reachable, it's not really worthwhile for a migration aid. + // doing this would require attaching an attribute to the salsa struct parameter + // in the query. + assert_ne!(invoke.is_none(), method.default.is_none()); let method = TrackedQuery { trait_name: trait_name_ident.clone(), generated_struct: None, signature: signature.clone(), pat_and_tys: pat_and_tys.clone(), - invoke: Some(invoke), + invoke, cycle, lru, + default: method.default.take(), }; trait_methods.push(Queries::TrackedQuery(method)) } - // while it is possible to make this reachable, it's not really worthwhile for a migration aid. - // doing this would require attaching an attribute to the salsa struct parameter in the query. - (QueryKind::TrackedWithSalsaStruct, None) => unreachable!(), (QueryKind::Transparent, invoke) => { let method = Transparent { signature: method.sig.clone(), pat_and_tys: pat_and_tys.clone(), invoke, + default: method.default.take(), }; trait_methods.push(Queries::Transparent(method)); } @@ -435,3 +448,13 @@ pub(crate) fn token_stream_with_error(mut tokens: TokenStream, error: syn::Error tokens.extend(TokenStream::from(error.into_compile_error())); tokens } + +struct SelfToDbRewriter; + +impl VisitMut for SelfToDbRewriter { + fn visit_expr_path_mut(&mut self, i: &mut syn::ExprPath) { + if i.path.is_ident("self") { + i.path = parse_quote_spanned!(i.path.span() => db); + } + } +} |