wsdom_ts_convert/generator/
var.rs

1use proc_macro2::TokenStream;
2use quote::quote;
3
4use crate::{
5    generator::util::new_ident_safe,
6    parser::{method::MethodArg, ts_type::TsType},
7};
8
9use super::Context;
10
11impl<'a> Context<'a> {
12    pub(super) fn make_global_var_getter(&self, name: &str, ty: &TsType<'a>) -> TokenStream {
13        let function_name = new_ident_safe(name);
14        let ty = self.convert_type(self.simplify_type(ty.to_owned()));
15        quote! {
16            pub fn #function_name (browser: &__wsdom_load_ts_macro::Browser) -> #ty {
17                __wsdom_load_ts_macro::JsCast::unchecked_from_js(
18                    browser.value_from_raw_code(core::format_args!(#name))
19                )
20            }
21        }
22    }
23    pub(super) fn make_custom_constructor(
24        &self,
25        class_name: &str,
26        args: &[MethodArg<'a>],
27        ret_ty: &TsType<'a>,
28    ) -> TokenStream {
29        let (arg_types, arg_names_sig, variadic) = self.make_sig_args(args);
30        let arg_names_body = arg_names_sig.clone();
31        let ret_ty = self.convert_type(self.simplify_type(ret_ty.to_owned()));
32        let name = new_ident_safe(class_name);
33        quote! {
34            pub fn #name (browser: &__wsdom_load_ts_macro::Browser, #(#arg_names_sig : #arg_types,)*) -> #ret_ty {
35                __wsdom_load_ts_macro::JsCast::unchecked_from_js(
36                    browser.call_constructor(
37                        #class_name,
38                        [
39                            #(  __wsdom_load_ts_macro::UpcastWorkaround::new( #arg_names_body ).cast(), )*
40                        ],
41                        #variadic
42                    )
43                )
44            }
45        }
46    }
47}