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.rs112
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![;](trait_item.span()));
-
- 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);