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 | 112 |
1 files changed, 4 insertions, 108 deletions
diff --git a/crates/query-group-macro/src/lib.rs b/crates/query-group-macro/src/lib.rs index 6e89e0875e..a2cac3688c 100644 --- a/crates/query-group-macro/src/lib.rs +++ b/crates/query-group-macro/src/lib.rs @@ -1,14 +1,10 @@ //! A macro that mimics the old Salsa-style `#[query_group]` macro. -use core::fmt; use std::vec; use proc_macro::TokenStream; use proc_macro2::Span; -use queries::{ - GeneratedInputStruct, InputQuery, InputSetter, InputSetterWithDurability, Queries, SetterKind, - TrackedQuery, Transparent, -}; +use queries::{GeneratedInputStruct, Queries, TrackedQuery, Transparent}; use quote::{ToTokens, format_ident, quote}; use syn::parse::{Parse, ParseStream}; use syn::punctuated::Punctuated; @@ -26,18 +22,6 @@ pub fn query_group(args: TokenStream, input: TokenStream) -> TokenStream { } } -#[derive(Debug)] -struct InputStructField { - name: proc_macro2::TokenStream, - ty: proc_macro2::TokenStream, -} - -impl fmt::Display for InputStructField { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.name) - } -} - struct SalsaAttr { name: String, tts: TokenStream, @@ -99,7 +83,6 @@ fn filter_attrs(attrs: Vec<Attribute>) -> (Vec<Attribute>, Vec<SalsaAttr>) { #[derive(Debug, Clone, PartialEq, Eq)] enum QueryKind { - Input, Tracked, TrackedWithSalsaStruct, Transparent, @@ -182,14 +165,10 @@ pub(crate) fn query_group_impl( let input_struct_name = format_ident!("{}Data", trait_name_ident); let create_data_ident = format_ident!("create_data_{}", trait_name_ident); - let mut input_struct_fields: Vec<InputStructField> = vec![]; let mut trait_methods = vec![]; - let mut setter_trait_methods = vec![]; - let mut lookup_signatures = vec![]; for item in &mut item_trait.items { if let syn::TraitItem::Fn(method) = item { - let method_name = &method.sig.ident; let signature = &method.sig; let (_attrs, salsa_attrs) = filter_attrs(method.attrs.clone()); @@ -215,15 +194,6 @@ pub(crate) fn query_group_impl( let c = syn::parse::<Parenthesized<Cycle>>(tts)?; cycle = Some(c.0); } - "input" => { - if !pat_and_tys.is_empty() { - return Err(syn::Error::new( - span, - "input methods cannot have a parameter", - )); - } - query_kind = QueryKind::Input; - } "invoke_interned" => { let path = syn::parse::<Parenthesized<Path>>(tts)?; invoke = Some(path.0.clone()); @@ -252,49 +222,15 @@ pub(crate) fn query_group_impl( } } - let syn::ReturnType::Type(_, return_ty) = signature.output.clone() else { + let syn::ReturnType::Type(_, _) = signature.output.clone() else { return Err(syn::Error::new(signature.span(), "Queries must have a return type")); }; - if let syn::Type::Path(ref ty_path) = *return_ty - && matches!(query_kind, QueryKind::Input) - { - let field = InputStructField { - name: method_name.to_token_stream(), - ty: ty_path.path.to_token_stream(), - }; - - input_struct_fields.push(field); - } - if let Some(block) = &mut method.default { SelfToDbRewriter.visit_block_mut(block); } match (query_kind, invoke) { - // input - (QueryKind::Input, None) => { - let query = InputQuery { - signature: method.sig.clone(), - create_data_ident: create_data_ident.clone(), - }; - let value = Queries::InputQuery(query); - trait_methods.push(value); - - let setter = InputSetter { - signature: method.sig.clone(), - return_type: *return_ty.clone(), - create_data_ident: create_data_ident.clone(), - }; - setter_trait_methods.push(SetterKind::Plain(setter)); - - let setter = InputSetterWithDurability { - signature: method.sig.clone(), - return_type: *return_ty.clone(), - create_data_ident: create_data_ident.clone(), - }; - setter_trait_methods.push(SetterKind::WithDurability(setter)); - } // tracked function. it might have an invoke, or might not. (QueryKind::Tracked, invoke) => { let method = TrackedQuery { @@ -336,61 +272,23 @@ pub(crate) fn query_group_impl( }; trait_methods.push(Queries::Transparent(method)); } - (QueryKind::Input, Some(path)) => { - return Err(syn::Error::new( - path.span(), - "Inputs cannot be used with an `#[invoke]`".to_string(), - )); - } } } } - let fields = input_struct_fields - .into_iter() - .map(|input| { - let name = input.name; - let ret = input.ty; - quote! { #name: Option<#ret> } - }) - .collect::<Vec<proc_macro2::TokenStream>>(); - let input_struct = quote! { #[salsa_macros::input] - pub(crate) struct #input_struct_name { - #(#fields),* - } + pub(crate) struct #input_struct_name {} }; - let field_params = std::iter::repeat_n(quote! { None }, fields.len()) - .collect::<Vec<proc_macro2::TokenStream>>(); - let create_data_method = quote! { #[allow(non_snake_case)] #[salsa_macros::tracked] fn #create_data_ident(db: &dyn #trait_name_ident) -> #input_struct_name { - #input_struct_name::new(db, #(#field_params),*) + #input_struct_name::new(db) } }; - let mut setter_signatures = vec![]; - let mut setter_methods = vec![]; - for trait_item in setter_trait_methods - .iter() - .map(|method| method.to_token_stream()) - .map(|tokens| syn::parse2::<syn::TraitItemFn>(tokens).unwrap()) - { - let mut methods_sans_body = trait_item.clone(); - methods_sans_body.default = None; - methods_sans_body.semi_token = Some(syn::Token)); - - setter_signatures.push(TraitItem::Fn(methods_sans_body)); - setter_methods.push(TraitItem::Fn(trait_item)); - } - - item_trait.items.append(&mut setter_signatures); - item_trait.items.append(&mut lookup_signatures); - let trait_impl = quote! { #[salsa_macros::db] impl<DB> #trait_name_ident for DB @@ -398,8 +296,6 @@ pub(crate) fn query_group_impl( DB: #supertraits, { #(#trait_methods)* - - #(#setter_methods)* } }; RemoveAttrsFromTraitMethods.visit_item_trait_mut(&mut item_trait); |