aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mingling/src/lib.rs2
-rw-r--r--mingling_macros/src/chain.rs7
-rw-r--r--mingling_macros/src/lib.rs13
-rw-r--r--mingling_macros/src/renderer.rs4
4 files changed, 21 insertions, 5 deletions
diff --git a/mingling/src/lib.rs b/mingling/src/lib.rs
index 5f45228..12d4a84 100644
--- a/mingling/src/lib.rs
+++ b/mingling/src/lib.rs
@@ -98,6 +98,8 @@ pub mod macros {
pub use mingling_macros::r_print;
/// Used to print content with a newline within a `Renderer` context
pub use mingling_macros::r_println;
+ /// Used to register a type into the context
+ pub use mingling_macros::register_type;
/// Used to generate a struct implementing the `Renderer` trait via a method
pub use mingling_macros::renderer;
#[cfg(feature = "comp")]
diff --git a/mingling_macros/src/chain.rs b/mingling_macros/src/chain.rs
index f1be091..cf91738 100644
--- a/mingling_macros/src/chain.rs
+++ b/mingling_macros/src/chain.rs
@@ -122,6 +122,8 @@ pub fn chain_attr(attr: TokenStream, item: TokenStream) -> TokenStream {
let pascal_case_name = just_fmt::pascal_case!(fn_name.to_string());
let struct_name = Ident::new(&pascal_case_name, fn_name.span());
+ let previous_type_str = previous_type.to_token_stream().to_string();
+
// Generate the struct and implementation
let expanded = if use_crate_prefix {
quote! {
@@ -129,6 +131,8 @@ pub fn chain_attr(attr: TokenStream, item: TokenStream) -> TokenStream {
#[doc(hidden)]
#vis struct #struct_name;
+ ::mingling::macros::register_type!(#previous_type_str);
+
impl ::mingling::Chain<ThisProgram> for #struct_name {
type Previous = #previous_type;
@@ -182,15 +186,12 @@ pub fn chain_attr(attr: TokenStream, item: TokenStream) -> TokenStream {
let mut chains = crate::CHAINS.lock().unwrap();
let mut chain_exist = crate::CHAINS_EXIST.lock().unwrap();
- let mut packed_types = crate::PACKED_TYPES.lock().unwrap();
let chain_entry = chain_entry.to_string();
let chain_exist_entry = chain_exist_entry.to_string();
- let previous_type_str = previous_type.to_token_stream().to_string();
chains.insert(chain_entry);
chain_exist.insert(chain_exist_entry);
- packed_types.insert(previous_type_str);
expanded.into()
}
diff --git a/mingling_macros/src/lib.rs b/mingling_macros/src/lib.rs
index da431d5..ffcf7e9 100644
--- a/mingling_macros/src/lib.rs
+++ b/mingling_macros/src/lib.rs
@@ -167,6 +167,19 @@ pub fn program_gen_completion(input: TokenStream) -> TokenStream {
TokenStream::from(comp_dispatcher)
}
+/// Internal macro for registering types.
+///
+/// This macro is used internally by the `#[chain]` and `#[renderer]` attribute macros
+#[proc_macro]
+pub fn register_type(input: TokenStream) -> TokenStream {
+ let type_entry = parse_macro_input!(input as syn::LitStr);
+ let entry_str = type_entry.value();
+
+ PACKED_TYPES.lock().unwrap().insert(entry_str);
+
+ TokenStream::new()
+}
+
#[proc_macro]
pub fn program_final_gen(input: TokenStream) -> TokenStream {
let name = read_name(&input);
diff --git a/mingling_macros/src/renderer.rs b/mingling_macros/src/renderer.rs
index 26e7aa9..dc00bc9 100644
--- a/mingling_macros/src/renderer.rs
+++ b/mingling_macros/src/renderer.rs
@@ -108,7 +108,6 @@ pub fn renderer_attr(item: TokenStream) -> TokenStream {
let mut renderers = crate::RENDERERS.lock().unwrap();
let mut renderer_exist = crate::RENDERERS_EXIST.lock().unwrap();
- let mut packed_types = crate::PACKED_TYPES.lock().unwrap();
#[cfg(feature = "general_renderer")]
let mut general_renderers = crate::GENERAL_RENDERERS.lock().unwrap();
@@ -122,7 +121,6 @@ pub fn renderer_attr(item: TokenStream) -> TokenStream {
renderers.insert(renderer_entry_str);
renderer_exist.insert(renderer_exist_entry_str);
- packed_types.insert(previous_type_str);
#[cfg(feature = "general_renderer")]
general_renderers.insert(general_renderer_entry_str);
@@ -134,6 +132,8 @@ pub fn renderer_attr(item: TokenStream) -> TokenStream {
#[doc(hidden)]
#vis struct #struct_name;
+ ::mingling::macros::register_type!(#previous_type_str);
+
impl ::mingling::Renderer for #struct_name {
type Previous = #previous_type;