interoptopus_proc_impl 0.16.0-alpha.12

Macros to produce Interoptopus item info.
Documentation
use proc_macro2::TokenStream;
use quote::quote;

use super::model::ConstantModel;

impl ConstantModel {
    pub fn emit_constant_info_impl(&self) -> TokenStream {
        let name_ident = syn::Ident::new(&self.name, proc_macro2::Span::call_site());
        let effective_name = self.effective_name();
        let ty = &self.ty;
        let constant_value = self.constant_value_tokens();
        let docs_content = self.docs_content();
        let visibility = quote! { ::interoptopus::lang::meta::Visibility::Public };
        let emission = quote! { ::interoptopus::lang::meta::Emission::FileEmission(::interoptopus::lang::meta::FileEmission::Common) };

        let constant_info_impl = quote! {
            #[allow(non_camel_case_types)]
            #[allow(clippy::redundant_pub_crate)]
            pub struct #name_ident {}

            unsafe impl ::interoptopus::lang::constant::ConstantInfo for #name_ident {
                fn id() -> ::interoptopus::inventory::ConstantId {
                    ::interoptopus::inventory::ConstantId::from_id(::interoptopus::id!(#name_ident))
                }

                fn constant() -> ::interoptopus::lang::constant::Constant {
                    ::interoptopus::lang::constant::Constant {
                        name: #effective_name.to_string(),
                        visibility: #visibility,
                        docs: ::interoptopus::lang::meta::Docs::from_line(#docs_content),
                        emission: #emission,
                        ty: <#ty as ::interoptopus::lang::types::TypeInfo>::id(),
                        value: #constant_value,
                    }
                }

                fn register(inventory: &mut impl ::interoptopus::inventory::Inventory) {
                    <#ty as ::interoptopus::lang::types::TypeInfo>::register(inventory);
                    inventory.register_constant(Self::id(), Self::constant());
                }
            }
        };

        constant_info_impl
    }
}