@@ -25,7 +25,7 @@ use proc_macro::{Delimiter, Group, TokenStream, TokenTree};
2525use proc_macro2:: TokenStream as TokenStream2 ;
2626use quote:: quote;
2727use syn:: spanned:: Spanned ;
28- use syn:: { parse, ImplItemFn , Token } ;
28+ use syn:: { parse, Attribute , FnArg , ImplItem , ImplItemFn , ItemImpl , Meta , Token , Visibility } ;
2929use syn:: { parse_macro_input, Item } ;
3030
3131fn add_async_method ( mut parsed : ImplItemFn ) -> TokenStream {
@@ -400,3 +400,30 @@ pub fn xtest_inventory(_input: TokenStream) -> TokenStream {
400400
401401 TokenStream :: from ( expanded)
402402}
403+
404+ /// Auto-enters the parent span.
405+ #[ proc_macro_attribute]
406+ pub fn auto_span_methods ( _attr : TokenStream , item : TokenStream ) -> TokenStream {
407+ let mut input = parse_macro_input ! ( item as ItemImpl ) ;
408+
409+ for item in input. items . iter_mut ( ) {
410+ if let ImplItem :: Fn ( method) = item {
411+ if let Visibility :: Public ( _) = method. vis {
412+ // Skip the method that sets the node_span
413+ if method. sig . ident == "set_node_id" {
414+ continue ;
415+ }
416+
417+ if let Some ( FnArg :: Receiver ( _) ) = method. sig . inputs . first ( ) {
418+ let block = & method. block ;
419+ method. block = syn:: parse_quote!( {
420+ let _entered_span = self . node_span. enter( ) ;
421+ #block
422+ } ) ;
423+ }
424+ }
425+ }
426+ }
427+
428+ TokenStream :: from ( quote ! ( #input) )
429+ }
0 commit comments