macro_rules! static_class_method {
    (
        $class_name:ident {
            $(
                $function_js_name:literal:
                    $function_rust_name:ident(
                        $(
                            $function_argument_name:ident: $function_argument_type:ty,
                        )*
                    ) -> $function_return_type:ty;
            )*
        }
    ) => {
        impl<'env> $class_name<'env> {
            $(
                pub fn $function_rust_name(
                    env: &'env napi::Env,
                    $($function_argument_name: $function_argument_type),*
                ) -> Result<$function_return_type, napi::Error> {
                    let vscode_object = VscodeContext::vscode(env)?;

                    let constructor: ::napi::bindgen_prelude::Function<
                        bindgen_prelude::Unknown,
                        bindgen_prelude::Unknown,
                    > = vscode_object.get_named_property(stringify!($class_name))?;

                    let js_function: bindgen_prelude::Function<
                        bindgen_prelude::FnArgs<($($function_argument_type,)*)>,
                        $function_return_type,
                    > = constructor.get_named_property($function_js_name)?;

                    js_function.apply(constructor, bindgen_prelude::FnArgs::from(($($function_argument_name,)*)))
                }
            )*
        }
    };
}

pub(crate) use static_class_method;