Don't discard other attributes in time macro

This commit is contained in:
Laurenz 2024-01-16 10:32:36 +01:00
parent c2dfbd39a0
commit 55a50ace1e
2 changed files with 12 additions and 17 deletions

View File

@ -381,7 +381,7 @@ pub fn symbols(stream: BoundaryStream) -> BoundaryStream {
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn time(stream: BoundaryStream, item: BoundaryStream) -> BoundaryStream { pub fn time(stream: BoundaryStream, item: BoundaryStream) -> BoundaryStream {
let item = syn::parse_macro_input!(item as syn::ItemFn); let item = syn::parse_macro_input!(item as syn::ItemFn);
time::time(stream.into(), &item) time::time(stream.into(), item)
.unwrap_or_else(|err| err.to_compile_error()) .unwrap_or_else(|err| err.to_compile_error())
.into() .into()
} }

View File

@ -1,12 +1,12 @@
use proc_macro2::TokenStream; use proc_macro2::TokenStream;
use quote::quote; use quote::{quote, ToTokens};
use syn::parse::{Parse, ParseStream}; use syn::parse::{Parse, ParseStream};
use syn::Result; use syn::{parse_quote, Result};
use crate::util::{kw, parse_key_value, parse_string}; use crate::util::{kw, parse_key_value, parse_string};
/// Expand the `#[time(..)]` macro. /// Expand the `#[time(..)]` macro.
pub fn time(stream: TokenStream, item: &syn::ItemFn) -> Result<TokenStream> { pub fn time(stream: TokenStream, item: syn::ItemFn) -> Result<TokenStream> {
let meta: Meta = syn::parse2(stream)?; let meta: Meta = syn::parse2(stream)?;
Ok(create(meta, item)) Ok(create(meta, item))
} }
@ -26,7 +26,7 @@ impl Parse for Meta {
} }
} }
fn create(meta: Meta, item: &syn::ItemFn) -> TokenStream { fn create(meta: Meta, mut item: syn::ItemFn) -> TokenStream {
let name = meta.name.unwrap_or_else(|| item.sig.ident.to_string()); let name = meta.name.unwrap_or_else(|| item.sig.ident.to_string());
let span = meta let span = meta
.span .span
@ -34,18 +34,13 @@ fn create(meta: Meta, item: &syn::ItemFn) -> TokenStream {
.map(|span| quote! { Some(#span) }) .map(|span| quote! { Some(#span) })
.unwrap_or_else(|| quote! { None }); .unwrap_or_else(|| quote! { None });
let sig = &item.sig; item.block.stmts.insert(
let vis = &item.vis; 0,
let block = &item.block; parse_quote! {
quote! {
#vis #sig {
#[cfg(not(target_arch = "wasm32"))] #[cfg(not(target_arch = "wasm32"))]
let __scope = ::typst_timing::TimingScope::new(#name, { let __scope = ::typst_timing::TimingScope::new(#name, #span);
use ::typst::foundations::NativeElement; },
#span );
});
#block item.into_token_stream()
}
}
} }