#![allow(clippy::module_name_repetitions)]
use proc_macro::TokenStream;
use quote::{format_ident, quote};
use syn::{
parse::{Parse, ParseStream},
parse_macro_input, Ident, Result,
};
struct ProfileIdentifier {
value: String,
}
impl Parse for ProfileIdentifier {
fn parse(input: ParseStream) -> Result<Self> {
let ident: Ident = input.parse()?;
Ok(Self {
value: ident.to_string(),
})
}
}
pub fn end_impl(input: TokenStream) -> TokenStream {
let profile_identifier = parse_macro_input!(input as ProfileIdentifier);
let profile_id_str = profile_identifier.value;
let profile_id = format_ident!("{profile_id_str}");
let func_name = format_ident!("end_{profile_id_str}");
#[cfg(feature = "full_profiling")]
let expanded = quote! {
fn #func_name() -> u32 { line!() }
::thag_profiler::safe_alloc! {
if let Some(profile) = #profile_id {
drop(profile);
}
};
};
#[cfg(not(feature = "full_profiling"))]
let expanded = quote! {
fn #func_name() -> u32 { line!() }
if let Some(profile) = #profile_id {
drop(profile);
}
};
expanded.into()
}