From 8f990a4477aa126e6bc79b98ba5f6685b0658fe7 Mon Sep 17 00:00:00 2001 From: HampusM Date: Sun, 13 Aug 2023 11:26:37 +0200 Subject: feat: add internal logging for macros --- Cargo.lock | 135 ++++++++++++++++++++++++++++++++++++++++++++++ macros/Cargo.toml | 4 ++ macros/src/caster.rs | 11 ++++ macros/src/lib.rs | 18 +++++++ macros/src/util/mod.rs | 1 + macros/src/util/tokens.rs | 89 ++++++++++++++++++++++++++++++ 6 files changed, 258 insertions(+) create mode 100644 macros/src/util/tokens.rs diff --git a/Cargo.lock b/Cargo.lock index 376afe6..c397716 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -214,6 +214,12 @@ dependencies = [ "syn 2.0.28", ] +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + [[package]] name = "memchr" version = "2.5.0" @@ -262,6 +268,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-traits" version = "0.2.16" @@ -296,6 +312,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "paste" version = "1.0.14" @@ -431,6 +453,21 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "smallvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" + [[package]] name = "strum" version = "0.24.1" @@ -506,6 +543,8 @@ dependencies = [ "syn 1.0.109", "syrette", "thiserror", + "tracing", + "tracing-subscriber", "utility-macros", "uuid", ] @@ -540,6 +579,16 @@ dependencies = [ "syn 2.0.28", ] +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "tokio" version = "1.29.1" @@ -564,6 +613,64 @@ dependencies = [ "syn 2.0.28", ] +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.28", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + [[package]] name = "unicode-ident" version = "1.0.11" @@ -588,6 +695,12 @@ dependencies = [ "getrandom", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "version_check" version = "0.9.4" @@ -600,6 +713,28 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "yansi" version = "0.5.1" diff --git a/macros/Cargo.toml b/macros/Cargo.toml index ccf10cd..4764221 100644 --- a/macros/Cargo.toml +++ b/macros/Cargo.toml @@ -30,6 +30,10 @@ once_cell = "1.13.1" thiserror = "1.0.37" proc-macro-error = "1.0.4" +[target.'cfg(syrette_macros_logging)'.dependencies] +tracing = "0.1.37" +tracing-subscriber = "0.3.17" + [dev_dependencies] syrette = { version = "0.4.2", path = ".." } mockall = "0.11.4" diff --git a/macros/src/caster.rs b/macros/src/caster.rs index c36aa1f..417a881 100644 --- a/macros/src/caster.rs +++ b/macros/src/caster.rs @@ -18,16 +18,27 @@ use quote::{format_ident, quote, ToTokens}; use uuid::adapter::Simple; use uuid::Uuid; +#[cfg(syrette_macros_logging)] +use crate::util::tokens::ToTokensExt; + const CASTER_FN_NAME_PREFIX: &[u8] = b"__"; const FN_BUF_LEN: usize = CASTER_FN_NAME_PREFIX.len() + Simple::LENGTH; +#[cfg_attr(syrette_macros_logging, tracing::instrument(skip(ty, dst_trait)))] pub fn generate_caster( ty: &impl ToTokens, dst_trait: &impl ToTokens, sync: bool, ) -> TokenStream { + #[cfg(syrette_macros_logging)] + tracing::debug!( + source = %ty.to_str_pretty(), + destination = %ty.to_str_pretty(), + "Generating caster", + ); + let fn_ident = create_caster_fn_ident(Uuid::new_v4()); let new_caster = if sync { diff --git a/macros/src/lib.rs b/macros/src/lib.rs index 2fc3c21..41001ae 100644 --- a/macros/src/lib.rs +++ b/macros/src/lib.rs @@ -482,6 +482,9 @@ pub fn declare_interface(input: TokenStream) -> TokenStream .map_or_else(|| Ok(false), MacroFlag::get_bool) .unwrap_or_abort(); + #[cfg(syrette_macros_logging)] + init_logging(); + let interface_type = if interface == implementation { Type::Path(interface) } else { @@ -545,3 +548,18 @@ pub fn named(_: TokenStream, _: TokenStream) -> TokenStream { TokenStream::new() } + +#[cfg(syrette_macros_logging)] +fn init_logging() +{ + use tracing::Level; + use tracing_subscriber::FmtSubscriber; + + let subscriber = FmtSubscriber::builder() + .with_max_level(Level::DEBUG) + .finish(); + + // The error can be ignored because it doesn't matter if the global default + // has already been set + tracing::subscriber::set_global_default(subscriber).ok(); +} diff --git a/macros/src/util/mod.rs b/macros/src/util/mod.rs index d3edb67..2244229 100644 --- a/macros/src/util/mod.rs +++ b/macros/src/util/mod.rs @@ -3,6 +3,7 @@ pub mod item_impl; pub mod iterator_ext; pub mod string; pub mod syn_path; +pub mod tokens; macro_rules! to_option { ($($tokens: tt)+) => { diff --git a/macros/src/util/tokens.rs b/macros/src/util/tokens.rs new file mode 100644 index 0000000..c614ea0 --- /dev/null +++ b/macros/src/util/tokens.rs @@ -0,0 +1,89 @@ +use std::fmt::Write; + +use proc_macro2::{Delimiter, Spacing, TokenTree}; +use quote::ToTokens; + +pub trait ToTokensExt +{ + fn to_str_pretty(&self) -> String; +} + +impl ToTokensExt for T +{ + fn to_str_pretty(&self) -> String + { + let mut spaceable = Spaceable::None; + + self.to_token_stream() + .into_iter() + .fold(String::new(), |mut acc, token_tree| { + let prev_spaceable = spaceable; + + spaceable = get_tt_spaceable(&token_tree); + + if matches!(prev_spaceable, Spaceable::Left | Spaceable::LeftRight) + && matches!(spaceable, Spaceable::Right | Spaceable::LeftRight) + { + write!(acc, " ").ok(); + } + + match token_tree { + TokenTree::Group(group) => match group.delimiter() { + Delimiter::Parenthesis => { + write!(acc, "({})", group.stream().to_str_pretty()).ok(); + } + Delimiter::Brace => { + write!(acc, "{{{}}}", group.stream().to_str_pretty()).ok(); + } + Delimiter::Bracket => { + write!(acc, "[{}]", group.stream().to_str_pretty()).ok(); + } + Delimiter::None => { + write!(acc, "{}", group.stream().to_str_pretty()).ok(); + } + }, + tt => { + write!(acc, "{tt}").ok(); + } + } + + acc + }) + } +} + +fn get_tt_spaceable(token_tree: &TokenTree) -> Spaceable +{ + match &token_tree { + TokenTree::Ident(_) => Spaceable::LeftRight, + TokenTree::Punct(punct) + if punct.spacing() == Spacing::Alone && (punct.as_char() == '+') => + { + Spaceable::LeftRight + } + TokenTree::Punct(punct) + if punct.spacing() == Spacing::Alone + && (punct.as_char() == '>' || punct.as_char() == ',') => + { + Spaceable::Left + } + TokenTree::Punct(punct) + if punct.spacing() == Spacing::Joint && punct.as_char() == '-' => + { + // Is part of -> + Spaceable::Right + } + TokenTree::Punct(punct) if punct.as_char() == '&' => Spaceable::Right, + TokenTree::Group(_) => Spaceable::Left, + _ => Spaceable::None, + } +} + +#[derive(Debug, Clone, Copy)] +enum Spaceable +{ + Left, + Right, + LeftRight, + None, +} -- cgit v1.2.3-18-g5258