rialo-sol-syn 0.4.2

Sol syntax parsing and code generation tools
// Copyright (c) Subzero Labs, Inc.
// SPDX-License-Identifier: Apache-2.0

use heck::ToSnakeCase;
use proc_macro2::TokenStream;
use quote::{format_ident, quote};

use super::{
    common::{gen_print_section, get_idl_module_path, get_no_docs},
    defined::gen_idl_type,
};
use crate::parser::docs;

pub fn gen_idl_print_fn_constant(item: &syn::ItemConst) -> TokenStream {
    let idl = get_idl_module_path();
    let no_docs = get_no_docs();

    let name = item.ident.to_string();
    let expr = &item.expr;
    let fn_name = format_ident!("__sol_private_print_idl_const_{}", name.to_snake_case());
    let fn_name_test = format_ident!("{}__test", fn_name);
    let slice_entry = format_ident!(
        "__SOL_IDL_ENTRY_CONST_{}",
        name.to_snake_case().to_uppercase()
    );

    let docs = match docs::parse(&item.attrs) {
        Some(docs) if !no_docs => quote! { vec![#(#docs.into()),*] },
        _ => quote! { vec![] },
    };

    let fn_body = match gen_idl_type(&item.ty, &[]) {
        Ok((ty, _)) => gen_print_section(
            "const",
            quote! {
                #idl::IdlConst {
                    name: #name.into(),
                    docs: #docs,
                    ty: #ty,
                    value: format!("{:?}", #expr),
                }
            },
        ),
        _ => quote! {},
    };

    quote! {
        #[doc(hidden)]
        #[cfg(feature = "idl-build")]
        pub fn #fn_name() {
            #fn_body
        }

        #[cfg(feature = "idl-build")]
        #[allow(unsafe_code)]
        #[rialo_sol_lang::linkme::distributed_slice(rialo_sol_lang::__SOL_IDL_PRINT_FNS)]
        #[linkme(crate = rialo_sol_lang::linkme)]
        #[doc(hidden)]
        static #slice_entry: (fn(), &'static str) = (#fn_name, module_path!());

        #[cfg(feature = "idl-build")]
        #[test]
        fn #fn_name_test() {
            #fn_name();
        }
    }
}