From 96a98d1e17fbb1db9b59307aaad189bcadfa9710 Mon Sep 17 00:00:00 2001 From: Joakker Date: Sun, 16 Feb 2025 20:00:49 -0300 Subject: [PATCH 1/3] Add derive macros --- .../src/derive/into_script.rs | 22 +++++++++++++++++++ .../src/derive/mod.rs | 4 ++++ .../src/derive/typed_through.rs | 20 +++++++++++++++++ crates/bevy_mod_scripting_derive/src/lib.rs | 14 ++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 crates/bevy_mod_scripting_derive/src/derive/into_script.rs create mode 100644 crates/bevy_mod_scripting_derive/src/derive/mod.rs create mode 100644 crates/bevy_mod_scripting_derive/src/derive/typed_through.rs diff --git a/crates/bevy_mod_scripting_derive/src/derive/into_script.rs b/crates/bevy_mod_scripting_derive/src/derive/into_script.rs new file mode 100644 index 0000000000..f0f5ddddb9 --- /dev/null +++ b/crates/bevy_mod_scripting_derive/src/derive/into_script.rs @@ -0,0 +1,22 @@ +use proc_macro2::TokenStream; +use quote::quote; +use syn::DeriveInput; + +pub fn into_script(input: TokenStream) -> TokenStream { + let DeriveInput { + ident, generics, .. + } = syn::parse2(input).unwrap(); + + let (impl_generics, type_generics, where_clause) = generics.split_for_impl(); + + quote! { + impl #impl_generics ::bevy_mod_scripting::bindings::function::into::IntoScript for #ident #type_generics #where_clause { + fn into_script(self, world: ::bevy_mod_scripting::core::bindings::WorldGuard) -> Result<::bevy_mod_scripting::core::bindings::script_value::ScriptValue, ::bevy_mod_scripting::core::error::InteropError> { + ::bevy_mod_scripting::core::bindings::function::into::IntoScript::into_script( + ::bevy_mod_scripting::core::bindings::function::from::Val(self), + world, + ) + } + } + } +} diff --git a/crates/bevy_mod_scripting_derive/src/derive/mod.rs b/crates/bevy_mod_scripting_derive/src/derive/mod.rs new file mode 100644 index 0000000000..3ae391a536 --- /dev/null +++ b/crates/bevy_mod_scripting_derive/src/derive/mod.rs @@ -0,0 +1,4 @@ +mod into_script; +mod typed_through; + +pub use self::{into_script::into_script, typed_through::typed_through}; diff --git a/crates/bevy_mod_scripting_derive/src/derive/typed_through.rs b/crates/bevy_mod_scripting_derive/src/derive/typed_through.rs new file mode 100644 index 0000000000..d3a189d6b3 --- /dev/null +++ b/crates/bevy_mod_scripting_derive/src/derive/typed_through.rs @@ -0,0 +1,20 @@ +use proc_macro2::TokenStream; +use quote::quote; +use syn::DeriveInput; + +pub fn typed_through(input: TokenStream) -> TokenStream { + let DeriveInput { + ident, generics, .. + }: DeriveInput = syn::parse2(input).unwrap(); + + let (impl_generics, type_generics, where_clause) = generics.split_for_impl(); + + let turbofish = type_generics.as_turbofish(); + quote! { + impl #impl_generics ::bevy_mod_scripting::core::docgen::typed_through::TypedThrough for #ident #type_generics #where_clause { + fn through_type_info() -> ::bevy_mod_scripting::core::docgen::typed_through::ThroughTypeInfo { + ::bevy_mod_scripting::core::docgen::typed_through::ThroughTypeInfo::TypeInfo(#ident #turbofish ::type_info()) + } + } + } +} diff --git a/crates/bevy_mod_scripting_derive/src/lib.rs b/crates/bevy_mod_scripting_derive/src/lib.rs index 9a6d133389..7e1ea2e391 100644 --- a/crates/bevy_mod_scripting_derive/src/lib.rs +++ b/crates/bevy_mod_scripting_derive/src/lib.rs @@ -4,6 +4,20 @@ use proc_macro2::{Span, TokenStream}; use quote::{format_ident, quote_spanned, ToTokens}; use syn::{spanned::Spanned, ImplItemFn, ItemImpl}; +mod derive; + +#[proc_macro_derive(TypedThrough)] +/// Default implementation for the `TypedThrough` trait +pub fn typed_through(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + derive::typed_through(input.into()).into() +} + +#[proc_macro_derive(IntoScript)] +/// Default implementation for the `IntoScript` trait +pub fn into_script(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + derive::into_script(input.into()).into() +} + /// Derive macro for generating script bindings from an impl block. /// /// Does not support generics. From 9d43e5a39bb95b10cef4536f6a86c056b5ead64d Mon Sep 17 00:00:00 2001 From: Joakker Date: Mon, 17 Feb 2025 22:40:44 -0300 Subject: [PATCH 2/3] Fix: Don't panic! --- .../bevy_mod_scripting_derive/src/derive/into_script.rs | 9 ++++++--- .../src/derive/typed_through.rs | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/crates/bevy_mod_scripting_derive/src/derive/into_script.rs b/crates/bevy_mod_scripting_derive/src/derive/into_script.rs index f0f5ddddb9..beb99a2374 100644 --- a/crates/bevy_mod_scripting_derive/src/derive/into_script.rs +++ b/crates/bevy_mod_scripting_derive/src/derive/into_script.rs @@ -3,9 +3,12 @@ use quote::quote; use syn::DeriveInput; pub fn into_script(input: TokenStream) -> TokenStream { - let DeriveInput { - ident, generics, .. - } = syn::parse2(input).unwrap(); + let (ident, generics) = match syn::parse2(input) { + Ok(DeriveInput { + ident, generics, .. + }) => (ident, generics), + Err(err) => return TokenStream::from(err.to_compile_error()), + }; let (impl_generics, type_generics, where_clause) = generics.split_for_impl(); diff --git a/crates/bevy_mod_scripting_derive/src/derive/typed_through.rs b/crates/bevy_mod_scripting_derive/src/derive/typed_through.rs index d3a189d6b3..ae441dd802 100644 --- a/crates/bevy_mod_scripting_derive/src/derive/typed_through.rs +++ b/crates/bevy_mod_scripting_derive/src/derive/typed_through.rs @@ -3,9 +3,12 @@ use quote::quote; use syn::DeriveInput; pub fn typed_through(input: TokenStream) -> TokenStream { - let DeriveInput { - ident, generics, .. - }: DeriveInput = syn::parse2(input).unwrap(); + let (ident, generics) = match syn::parse2(input) { + Ok(DeriveInput { + ident, generics, .. + }) => (ident, generics), + Err(err) => return TokenStream::from(err.to_compile_error()), + }; let (impl_generics, type_generics, where_clause) = generics.split_for_impl(); From 1b690557584b71d455ee39fe13b696349b07541d Mon Sep 17 00:00:00 2001 From: Joakker Date: Tue, 18 Feb 2025 22:19:09 -0300 Subject: [PATCH 3/3] Fix: useless conversion --- crates/bevy_mod_scripting_derive/src/derive/into_script.rs | 2 +- crates/bevy_mod_scripting_derive/src/derive/typed_through.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/bevy_mod_scripting_derive/src/derive/into_script.rs b/crates/bevy_mod_scripting_derive/src/derive/into_script.rs index beb99a2374..d67d3ab288 100644 --- a/crates/bevy_mod_scripting_derive/src/derive/into_script.rs +++ b/crates/bevy_mod_scripting_derive/src/derive/into_script.rs @@ -7,7 +7,7 @@ pub fn into_script(input: TokenStream) -> TokenStream { Ok(DeriveInput { ident, generics, .. }) => (ident, generics), - Err(err) => return TokenStream::from(err.to_compile_error()), + Err(err) => return err.to_compile_error(), }; let (impl_generics, type_generics, where_clause) = generics.split_for_impl(); diff --git a/crates/bevy_mod_scripting_derive/src/derive/typed_through.rs b/crates/bevy_mod_scripting_derive/src/derive/typed_through.rs index ae441dd802..d8213aeef4 100644 --- a/crates/bevy_mod_scripting_derive/src/derive/typed_through.rs +++ b/crates/bevy_mod_scripting_derive/src/derive/typed_through.rs @@ -7,7 +7,7 @@ pub fn typed_through(input: TokenStream) -> TokenStream { Ok(DeriveInput { ident, generics, .. }) => (ident, generics), - Err(err) => return TokenStream::from(err.to_compile_error()), + Err(err) => return err.to_compile_error(), }; let (impl_generics, type_generics, where_clause) = generics.split_for_impl();