Skip to content

Commit 5834f7a

Browse files
committed
remove #[salsa::input] support in #[query_group]
1 parent c6a5073 commit 5834f7a

7 files changed

Lines changed: 74 additions & 327 deletions

File tree

crates/query-group-macro/src/lib.rs

Lines changed: 4 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
//! A macro that mimics the old Salsa-style `#[query_group]` macro.
22
3-
use core::fmt;
43
use std::vec;
54

65
use proc_macro::TokenStream;
76
use proc_macro2::Span;
8-
use queries::{
9-
GeneratedInputStruct, InputQuery, InputSetter, InputSetterWithDurability, Queries, SetterKind,
10-
TrackedQuery, Transparent,
11-
};
7+
use queries::{GeneratedInputStruct, Queries, TrackedQuery, Transparent};
128
use quote::{ToTokens, format_ident, quote};
139
use syn::parse::{Parse, ParseStream};
1410
use syn::punctuated::Punctuated;
@@ -26,18 +22,6 @@ pub fn query_group(args: TokenStream, input: TokenStream) -> TokenStream {
2622
}
2723
}
2824

29-
#[derive(Debug)]
30-
struct InputStructField {
31-
name: proc_macro2::TokenStream,
32-
ty: proc_macro2::TokenStream,
33-
}
34-
35-
impl fmt::Display for InputStructField {
36-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
37-
write!(f, "{}", self.name)
38-
}
39-
}
40-
4125
struct SalsaAttr {
4226
name: String,
4327
tts: TokenStream,
@@ -99,7 +83,6 @@ fn filter_attrs(attrs: Vec<Attribute>) -> (Vec<Attribute>, Vec<SalsaAttr>) {
9983

10084
#[derive(Debug, Clone, PartialEq, Eq)]
10185
enum QueryKind {
102-
Input,
10386
Tracked,
10487
TrackedWithSalsaStruct,
10588
Transparent,
@@ -182,14 +165,10 @@ pub(crate) fn query_group_impl(
182165
let input_struct_name = format_ident!("{}Data", trait_name_ident);
183166
let create_data_ident = format_ident!("create_data_{}", trait_name_ident);
184167

185-
let mut input_struct_fields: Vec<InputStructField> = vec![];
186168
let mut trait_methods = vec![];
187-
let mut setter_trait_methods = vec![];
188-
let mut lookup_signatures = vec![];
189169

190170
for item in &mut item_trait.items {
191171
if let syn::TraitItem::Fn(method) = item {
192-
let method_name = &method.sig.ident;
193172
let signature = &method.sig;
194173

195174
let (_attrs, salsa_attrs) = filter_attrs(method.attrs.clone());
@@ -215,15 +194,6 @@ pub(crate) fn query_group_impl(
215194
let c = syn::parse::<Parenthesized<Cycle>>(tts)?;
216195
cycle = Some(c.0);
217196
}
218-
"input" => {
219-
if !pat_and_tys.is_empty() {
220-
return Err(syn::Error::new(
221-
span,
222-
"input methods cannot have a parameter",
223-
));
224-
}
225-
query_kind = QueryKind::Input;
226-
}
227197
"invoke_interned" => {
228198
let path = syn::parse::<Parenthesized<Path>>(tts)?;
229199
invoke = Some(path.0.clone());
@@ -252,49 +222,15 @@ pub(crate) fn query_group_impl(
252222
}
253223
}
254224

255-
let syn::ReturnType::Type(_, return_ty) = signature.output.clone() else {
225+
let syn::ReturnType::Type(_, _) = signature.output.clone() else {
256226
return Err(syn::Error::new(signature.span(), "Queries must have a return type"));
257227
};
258228

259-
if let syn::Type::Path(ref ty_path) = *return_ty
260-
&& matches!(query_kind, QueryKind::Input)
261-
{
262-
let field = InputStructField {
263-
name: method_name.to_token_stream(),
264-
ty: ty_path.path.to_token_stream(),
265-
};
266-
267-
input_struct_fields.push(field);
268-
}
269-
270229
if let Some(block) = &mut method.default {
271230
SelfToDbRewriter.visit_block_mut(block);
272231
}
273232

274233
match (query_kind, invoke) {
275-
// input
276-
(QueryKind::Input, None) => {
277-
let query = InputQuery {
278-
signature: method.sig.clone(),
279-
create_data_ident: create_data_ident.clone(),
280-
};
281-
let value = Queries::InputQuery(query);
282-
trait_methods.push(value);
283-
284-
let setter = InputSetter {
285-
signature: method.sig.clone(),
286-
return_type: *return_ty.clone(),
287-
create_data_ident: create_data_ident.clone(),
288-
};
289-
setter_trait_methods.push(SetterKind::Plain(setter));
290-
291-
let setter = InputSetterWithDurability {
292-
signature: method.sig.clone(),
293-
return_type: *return_ty.clone(),
294-
create_data_ident: create_data_ident.clone(),
295-
};
296-
setter_trait_methods.push(SetterKind::WithDurability(setter));
297-
}
298234
// tracked function. it might have an invoke, or might not.
299235
(QueryKind::Tracked, invoke) => {
300236
let method = TrackedQuery {
@@ -336,70 +272,30 @@ pub(crate) fn query_group_impl(
336272
};
337273
trait_methods.push(Queries::Transparent(method));
338274
}
339-
(QueryKind::Input, Some(path)) => {
340-
return Err(syn::Error::new(
341-
path.span(),
342-
"Inputs cannot be used with an `#[invoke]`".to_string(),
343-
));
344-
}
345275
}
346276
}
347277
}
348278

349-
let fields = input_struct_fields
350-
.into_iter()
351-
.map(|input| {
352-
let name = input.name;
353-
let ret = input.ty;
354-
quote! { #name: Option<#ret> }
355-
})
356-
.collect::<Vec<proc_macro2::TokenStream>>();
357-
358279
let input_struct = quote! {
359280
#[salsa_macros::input]
360-
pub(crate) struct #input_struct_name {
361-
#(#fields),*
362-
}
281+
pub(crate) struct #input_struct_name {}
363282
};
364283

365-
let field_params = std::iter::repeat_n(quote! { None }, fields.len())
366-
.collect::<Vec<proc_macro2::TokenStream>>();
367-
368284
let create_data_method = quote! {
369285
#[allow(non_snake_case)]
370286
#[salsa_macros::tracked]
371287
fn #create_data_ident(db: &dyn #trait_name_ident) -> #input_struct_name {
372-
#input_struct_name::new(db, #(#field_params),*)
288+
#input_struct_name::new(db)
373289
}
374290
};
375291

376-
let mut setter_signatures = vec![];
377-
let mut setter_methods = vec![];
378-
for trait_item in setter_trait_methods
379-
.iter()
380-
.map(|method| method.to_token_stream())
381-
.map(|tokens| syn::parse2::<syn::TraitItemFn>(tokens).unwrap())
382-
{
383-
let mut methods_sans_body = trait_item.clone();
384-
methods_sans_body.default = None;
385-
methods_sans_body.semi_token = Some(syn::Token![;](trait_item.span()));
386-
387-
setter_signatures.push(TraitItem::Fn(methods_sans_body));
388-
setter_methods.push(TraitItem::Fn(trait_item));
389-
}
390-
391-
item_trait.items.append(&mut setter_signatures);
392-
item_trait.items.append(&mut lookup_signatures);
393-
394292
let trait_impl = quote! {
395293
#[salsa_macros::db]
396294
impl<DB> #trait_name_ident for DB
397295
where
398296
DB: #supertraits,
399297
{
400298
#(#trait_methods)*
401-
402-
#(#setter_methods)*
403299
}
404300
};
405301
RemoveAttrsFromTraitMethods.visit_item_trait_mut(&mut item_trait);

crates/query-group-macro/src/queries.rs

Lines changed: 1 addition & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! The IR of the `#[query_group]` macro.
22
33
use quote::{ToTokens, format_ident, quote, quote_spanned};
4-
use syn::{FnArg, Ident, PatType, Path, Receiver, ReturnType, parse_quote, spanned::Spanned};
4+
use syn::{Ident, PatType, Path, spanned::Spanned};
55

66
use crate::Cycle;
77

@@ -104,132 +104,6 @@ impl ToTokens for TrackedQuery {
104104
}
105105
}
106106

107-
pub(crate) struct InputQuery {
108-
pub(crate) signature: syn::Signature,
109-
pub(crate) create_data_ident: Ident,
110-
}
111-
112-
impl ToTokens for InputQuery {
113-
fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
114-
let sig = &self.signature;
115-
let fn_ident = &sig.ident;
116-
let create_data_ident = &self.create_data_ident;
117-
118-
let method = quote! {
119-
#sig {
120-
let data = #create_data_ident(self);
121-
data.#fn_ident(self).unwrap()
122-
}
123-
};
124-
method.to_tokens(tokens);
125-
}
126-
}
127-
128-
pub(crate) struct InputSetter {
129-
pub(crate) signature: syn::Signature,
130-
pub(crate) return_type: syn::Type,
131-
pub(crate) create_data_ident: Ident,
132-
}
133-
134-
impl ToTokens for InputSetter {
135-
fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
136-
let sig = &mut self.signature.clone();
137-
138-
let ty = &self.return_type;
139-
let fn_ident = &sig.ident;
140-
let create_data_ident = &self.create_data_ident;
141-
142-
let setter_ident = format_ident!("set_{}", fn_ident);
143-
sig.ident = setter_ident.clone();
144-
145-
let value_argument: PatType = parse_quote!(__value: #ty);
146-
sig.inputs.push(FnArg::Typed(value_argument.clone()));
147-
148-
// make `&self` `&mut self` instead.
149-
let mut_receiver: Receiver = parse_quote!(&mut self);
150-
if let Some(og) = sig.inputs.first_mut() {
151-
*og = FnArg::Receiver(mut_receiver)
152-
}
153-
154-
// remove the return value.
155-
sig.output = ReturnType::Default;
156-
157-
let value = &value_argument.pat;
158-
let method = quote! {
159-
#sig {
160-
use salsa::Setter;
161-
let data = #create_data_ident(self);
162-
data.#setter_ident(self).to(Some(#value));
163-
}
164-
};
165-
method.to_tokens(tokens);
166-
}
167-
}
168-
169-
pub(crate) struct InputSetterWithDurability {
170-
pub(crate) signature: syn::Signature,
171-
pub(crate) return_type: syn::Type,
172-
pub(crate) create_data_ident: Ident,
173-
}
174-
175-
impl ToTokens for InputSetterWithDurability {
176-
fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
177-
let sig = &mut self.signature.clone();
178-
179-
let ty = &self.return_type;
180-
let fn_ident = &sig.ident;
181-
let setter_ident = format_ident!("set_{}", fn_ident);
182-
183-
let create_data_ident = &self.create_data_ident;
184-
185-
sig.ident = format_ident!("set_{}_with_durability", fn_ident);
186-
187-
let value_argument: PatType = parse_quote!(__value: #ty);
188-
sig.inputs.push(FnArg::Typed(value_argument.clone()));
189-
190-
let durability_argument: PatType = parse_quote!(durability: salsa::Durability);
191-
sig.inputs.push(FnArg::Typed(durability_argument.clone()));
192-
193-
// make `&self` `&mut self` instead.
194-
let mut_receiver: Receiver = parse_quote!(&mut self);
195-
if let Some(og) = sig.inputs.first_mut() {
196-
*og = FnArg::Receiver(mut_receiver)
197-
}
198-
199-
// remove the return value.
200-
sig.output = ReturnType::Default;
201-
202-
let value = &value_argument.pat;
203-
let durability = &durability_argument.pat;
204-
let method = quote! {
205-
#sig {
206-
use salsa::Setter;
207-
let data = #create_data_ident(self);
208-
data.#setter_ident(self)
209-
.with_durability(#durability)
210-
.to(Some(#value));
211-
}
212-
};
213-
method.to_tokens(tokens);
214-
}
215-
}
216-
217-
pub(crate) enum SetterKind {
218-
Plain(InputSetter),
219-
WithDurability(InputSetterWithDurability),
220-
}
221-
222-
impl ToTokens for SetterKind {
223-
fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
224-
match self {
225-
SetterKind::Plain(input_setter) => input_setter.to_tokens(tokens),
226-
SetterKind::WithDurability(input_setter_with_durability) => {
227-
input_setter_with_durability.to_tokens(tokens)
228-
}
229-
}
230-
}
231-
}
232-
233107
pub(crate) struct Transparent {
234108
pub(crate) signature: syn::Signature,
235109
pub(crate) pat_and_tys: Vec<PatType>,
@@ -270,15 +144,13 @@ impl ToTokens for Transparent {
270144
#[allow(clippy::large_enum_variant)]
271145
pub(crate) enum Queries {
272146
TrackedQuery(TrackedQuery),
273-
InputQuery(InputQuery),
274147
Transparent(Transparent),
275148
}
276149

277150
impl ToTokens for Queries {
278151
fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
279152
match self {
280153
Queries::TrackedQuery(tracked_query) => tracked_query.to_tokens(tokens),
281-
Queries::InputQuery(input_query) => input_query.to_tokens(tokens),
282154
Queries::Transparent(transparent) => transparent.to_tokens(tokens),
283155
}
284156
}

0 commit comments

Comments
 (0)