napi_derive_backend/codegen/
const.rs1use proc_macro2::{Ident, Literal, TokenStream};
2use quote::ToTokens;
3
4use crate::{codegen::js_mod_to_token_stream, BindgenResult, NapiConst, TryToTokens};
5
6impl TryToTokens for NapiConst {
7 fn try_to_tokens(&self, tokens: &mut TokenStream) -> BindgenResult<()> {
8 let register = self.gen_module_register();
9 (quote! {
10 #register
11 })
12 .to_tokens(tokens);
13
14 Ok(())
15 }
16}
17
18impl NapiConst {
19 fn gen_module_register(&self) -> TokenStream {
20 if cfg!(test) {
21 return quote! {};
22 }
23
24 let name_ident = &self.name;
25 let js_name_lit = Literal::string(&format!("{}\0", self.name));
26 let register_name = &self.register_name;
27 let type_name = &self.type_name;
28 let cb_name = Ident::new(
29 &format!("__register__const__{register_name}_callback__"),
30 self.name.span(),
31 );
32 let js_mod_ident = js_mod_to_token_stream(self.js_mod.as_ref());
33
34 quote! {
35 #[allow(non_snake_case)]
36 #[allow(clippy::all)]
37 unsafe fn #cb_name(env: napi::sys::napi_env) -> napi::Result<napi::sys::napi_value> {
38 <#type_name as napi::bindgen_prelude::ToNapiValue>::to_napi_value(env, #name_ident)
39 }
40 #[allow(non_snake_case)]
41 #[allow(clippy::all)]
42 #[cfg(all(not(test), not(target_family = "wasm")))]
43 #[napi::ctor::ctor(crate_path=::napi::ctor)]
44 fn #register_name() {
45 napi::bindgen_prelude::register_module_export(#js_mod_ident, #js_name_lit, #cb_name);
46 }
47
48 #[allow(non_snake_case)]
49 #[allow(clippy::all)]
50 #[cfg(all(not(test), target_family = "wasm"))]
51 #[no_mangle]
52 unsafe extern "C" fn #register_name() {
53 napi::bindgen_prelude::register_module_export(#js_mod_ident, #js_name_lit, #cb_name);
54 }
55 }
56 }
57}