From 2a7f3a4164cea014e77b6e02242851e121d3aa98 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Wed, 10 Jan 2024 16:38:07 -0800 Subject: [PATCH 1/3] Fix: quick tweak to allow #[component] macro working --- .../src/component_body_deserializers/inline_props.rs | 10 +++++----- packages/core-macro/src/lib.rs | 7 ++----- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/core-macro/src/component_body_deserializers/inline_props.rs b/packages/core-macro/src/component_body_deserializers/inline_props.rs index 35eca3f57..a420e2e36 100644 --- a/packages/core-macro/src/component_body_deserializers/inline_props.rs +++ b/packages/core-macro/src/component_body_deserializers/inline_props.rs @@ -47,7 +47,7 @@ fn get_props_struct(component_body: &ComponentBody) -> ItemStruct { } = sig; // Skip first arg since that's the context - let struct_fields = inputs.iter().skip(1).map(move |f| { + let struct_fields = inputs.iter().skip(0).map(move |f| { match f { FnArg::Receiver(_) => unreachable!(), // Unreachable because of ComponentBody parsing FnArg::Typed(pt) => { @@ -74,9 +74,9 @@ fn get_props_struct(component_body: &ComponentBody) -> ItemStruct { }; let struct_attrs = if first_lifetime.is_some() { - quote! { #[derive(Props)] } + quote! { #[derive(Props, Clone)] } } else { - quote! { #[derive(Props, PartialEq)] } + quote! { #[derive(Props, Clone, PartialEq)] } }; let struct_generics = if first_lifetime.is_some() { @@ -245,7 +245,7 @@ fn get_function(component_body: &ComponentBody) -> ItemFn { let struct_ident = Ident::new(&format!("{fn_ident}Props"), fn_ident.span()); // Skip first arg since that's the context - let struct_field_names = inputs.iter().skip(1).filter_map(|f| match f { + let struct_field_names = inputs.iter().skip(0).filter_map(|f| match f { FnArg::Receiver(_) => unreachable!(), // ComponentBody prohibits receiver parameters. FnArg::Typed(pt) => Some(&pt.pat), }); @@ -296,7 +296,7 @@ fn get_function(component_body: &ComponentBody) -> ItemFn { #asyncness #vis fn #fn_ident #fn_generics (__props: #struct_ident #generics_no_bounds) #fn_output #where_clause { - let #struct_ident { #(#struct_field_names),* } = &__props; + let #struct_ident { #(#struct_field_names),* } = __props; #fn_block } } diff --git a/packages/core-macro/src/lib.rs b/packages/core-macro/src/lib.rs index 4686bc797..cfcb02bc7 100644 --- a/packages/core-macro/src/lib.rs +++ b/packages/core-macro/src/lib.rs @@ -39,11 +39,8 @@ pub fn derive_typed_builder(input: TokenStream) -> TokenStream { /// The rsx! macro makes it easy for developers to write jsx-style markup in their components. #[proc_macro] -pub fn rsx(s: TokenStream) -> TokenStream { - match syn::parse::(s) { - Err(err) => err.to_compile_error().into(), - Ok(body) => body.to_token_stream().into(), - } +pub fn rsx(tokens: TokenStream) -> TokenStream { + render(tokens) } /// The render! macro makes it easy for developers to write jsx-style markup in their components. From 47805461d0b077a08d4ef67099598efbf34261d0 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Wed, 10 Jan 2024 16:39:40 -0800 Subject: [PATCH 2/3] Dump skip(0) --- .../src/component_body_deserializers/inline_props.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core-macro/src/component_body_deserializers/inline_props.rs b/packages/core-macro/src/component_body_deserializers/inline_props.rs index a420e2e36..75d2c9c9d 100644 --- a/packages/core-macro/src/component_body_deserializers/inline_props.rs +++ b/packages/core-macro/src/component_body_deserializers/inline_props.rs @@ -47,7 +47,7 @@ fn get_props_struct(component_body: &ComponentBody) -> ItemStruct { } = sig; // Skip first arg since that's the context - let struct_fields = inputs.iter().skip(0).map(move |f| { + let struct_fields = inputs.iter().map(move |f| { match f { FnArg::Receiver(_) => unreachable!(), // Unreachable because of ComponentBody parsing FnArg::Typed(pt) => { @@ -245,7 +245,7 @@ fn get_function(component_body: &ComponentBody) -> ItemFn { let struct_ident = Ident::new(&format!("{fn_ident}Props"), fn_ident.span()); // Skip first arg since that's the context - let struct_field_names = inputs.iter().skip(0).filter_map(|f| match f { + let struct_field_names = inputs.iter().filter_map(|f| match f { FnArg::Receiver(_) => unreachable!(), // ComponentBody prohibits receiver parameters. FnArg::Typed(pt) => Some(&pt.pat), }); @@ -256,7 +256,7 @@ fn get_function(component_body: &ComponentBody) -> ItemFn { None }; - let (scope_lifetime, fn_generics) = if let Some(lt) = first_lifetime { + let (_scope_lifetime, fn_generics) = if let Some(lt) = first_lifetime { (quote! { #lt, }, generics.clone()) } else { let lifetime: LifetimeParam = parse_quote! { 'a }; From 3bde4296192a9c7d79152648b6a016e5d2e5a115 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Wed, 10 Jan 2024 16:57:21 -0800 Subject: [PATCH 3/3] Export signals from dioxus prelude --- packages/dioxus/Cargo.toml | 4 +++- packages/dioxus/src/lib.rs | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/dioxus/Cargo.toml b/packages/dioxus/Cargo.toml index 170f0321e..aa932a715 100644 --- a/packages/dioxus/Cargo.toml +++ b/packages/dioxus/Cargo.toml @@ -16,13 +16,15 @@ dioxus-html = { workspace = true, optional = true } dioxus-core-macro = { workspace = true, optional = true } dioxus-hooks = { workspace = true, optional = true } dioxus-rsx = { workspace = true, optional = true } +dioxus-signals = { workspace = true, optional = true } manganis = { git = "https://github.com/DioxusLabs/collect-assets" } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] dioxus-hot-reload = { workspace = true, optional = true } [features] -default = ["macro", "hooks", "html", "hot-reload"] +default = ["macro", "html", "hot-reload", "signals"] +signals = ["dioxus-signals"] macro = ["dioxus-core-macro", "dioxus-rsx"] html = ["dioxus-html"] hooks = ["dioxus-hooks"] diff --git a/packages/dioxus/src/lib.rs b/packages/dioxus/src/lib.rs index 1e64715b0..247c2cac4 100644 --- a/packages/dioxus/src/lib.rs +++ b/packages/dioxus/src/lib.rs @@ -7,6 +7,9 @@ pub use dioxus_core as core; #[cfg(feature = "hooks")] pub use dioxus_hooks as hooks; +#[cfg(feature = "signals")] +pub use dioxus_signals as signals; + pub mod events { #[cfg(feature = "html")] pub use dioxus_html::prelude::*; @@ -28,6 +31,9 @@ pub mod prelude { #[cfg(feature = "hooks")] pub use crate::hooks::*; + #[cfg(feature = "signals")] + pub use dioxus_signals::*; + pub use dioxus_core::prelude::*; #[cfg(feature = "macro")]