11//! A macro that mimics the old Salsa-style `#[query_group]` macro.
22
3- use core:: fmt;
43use std:: vec;
54
65use proc_macro:: TokenStream ;
76use proc_macro2:: Span ;
8- use queries:: {
9- GeneratedInputStruct , InputQuery , InputSetter , InputSetterWithDurability , Queries , SetterKind ,
10- TrackedQuery , Transparent ,
11- } ;
7+ use queries:: { GeneratedInputStruct , Queries , TrackedQuery , Transparent } ;
128use quote:: { ToTokens , format_ident, quote} ;
139use syn:: parse:: { Parse , ParseStream } ;
1410use 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-
4125struct 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 ) ]
10185enum 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) ;
0 commit comments