47 lines · 1.5 KB · Rust
RawDownload
use proc_macro::TokenStream;use proc_macro2::Ident;use quote::{format_ident, quote};use syn::parse_macro_input; pub fn register_action_macro(ident: TokenStream) -> TokenStream {    let name = parse_macro_input!(ident as Ident);    let registration = register_action(&name);     TokenStream::from(quote! {        #registration    })} pub(crate) fn register_action(type_name: &Ident) -> proc_macro2::TokenStream {    let action_builder_fn_name = format_ident!(        "__gpui_actions_builder_{}",        type_name.to_string().to_lowercase()    );     quote! {        impl #type_name {            /// This is an auto generated function, do not use.            #[automatically_derived]            #[doc(hidden)]            fn __autogenerated() {                /// This is an auto generated function, do not use.                #[doc(hidden)]                fn #action_builder_fn_name() -> gpui::MacroActionData {                    gpui::MacroActionData {                        name: <#type_name as gpui::Action>::debug_name(),                        aliases: <#type_name as gpui::Action>::deprecated_aliases(),                        type_id: ::std::any::TypeId::of::<#type_name>(),                        build: <#type_name as gpui::Action>::build,                        json_schema: <#type_name as gpui::Action>::action_json_schema,                    }                }                 gpui::private::inventory::submit! {                    gpui::MacroActionBuilder(#action_builder_fn_name)                }            }        }      }}