From 115cc0ad4233531a07b9dfb689960b749701e8ce Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Tue, 30 Jul 2024 21:28:19 +0200 Subject: [PATCH] Fix component names when they are re-exported (#2744) * Fix component names when they are re-exported * Fix read only signal props expansion --- packages/core-macro/src/props/mod.rs | 2 +- packages/core/src/properties.rs | 14 ++++---------- packages/core/src/root_wrapper.rs | 4 ++-- packages/core/src/suspense/component.rs | 2 +- packages/rsx/src/component.rs | 10 +--------- 5 files changed, 9 insertions(+), 23 deletions(-) diff --git a/packages/core-macro/src/props/mod.rs b/packages/core-macro/src/props/mod.rs index aa708fe82..809d5d7cb 100644 --- a/packages/core-macro/src/props/mod.rs +++ b/packages/core-macro/src/props/mod.rs @@ -1420,9 +1420,9 @@ Finally, call `.build()` to create the instance of `{name}`. pub fn into_vcomponent( self, render_fn: impl dioxus_core::prelude::ComponentFunction<#original_name #ty_generics, M>, - component_name: &'static str, ) -> dioxus_core::VComponent { use dioxus_core::prelude::ComponentFunction; + let component_name = ::std::any::type_name_of_val(&render_fn); dioxus_core::VComponent::new(move |wrapper: Self| render_fn.rebuild(wrapper.inner), self, component_name) } } diff --git a/packages/core/src/properties.rs b/packages/core/src/properties.rs index b7d201c07..3ae0fc781 100644 --- a/packages/core/src/properties.rs +++ b/packages/core/src/properties.rs @@ -57,12 +57,9 @@ pub trait Properties: Clone + Sized + 'static { fn memoize(&mut self, other: &Self) -> bool; /// Create a component from the props. - fn into_vcomponent( - self, - render_fn: impl ComponentFunction, - component_name: &'static str, - ) -> VComponent { - VComponent::new(render_fn, self, component_name) + fn into_vcomponent(self, render_fn: impl ComponentFunction) -> VComponent { + let type_name = std::any::type_name_of_val(&render_fn); + VComponent::new(render_fn, self, type_name) } } @@ -121,10 +118,7 @@ where #[warnings::warning] pub(crate) fn component_called_as_function, P, M>(_: C) { // We trim WithOwner from the end of the type name for component with a builder that include a special owner which may not match the function name directly - let mut type_name = std::any::type_name::(); - if let Some((_, after_colons)) = type_name.rsplit_once("::") { - type_name = after_colons; - } + let type_name = std::any::type_name::(); let component_name = Runtime::with(|rt| { current_scope_id() .ok() diff --git a/packages/core/src/root_wrapper.rs b/packages/core/src/root_wrapper.rs index 91b7dea70..3cab84a42 100644 --- a/packages/core/src/root_wrapper.rs +++ b/packages/core/src/root_wrapper.rs @@ -29,12 +29,12 @@ pub(crate) fn RootScopeWrapper(props: RootProps) -> Element { Box::new([]), ))) .build() - .into_vcomponent(SuspenseBoundary, "SuspenseBoundary") + .into_vcomponent(SuspenseBoundary) })]), Box::new([]), ))) .build() - .into_vcomponent(ErrorBoundary, "ErrorBoundary"), + .into_vcomponent(ErrorBoundary), )]), Box::new([]), )) diff --git a/packages/core/src/suspense/component.rs b/packages/core/src/suspense/component.rs index abdb4e019..f8da649c7 100644 --- a/packages/core/src/suspense/component.rs +++ b/packages/core/src/suspense/component.rs @@ -178,8 +178,8 @@ impl SuspenseBoundaryPropsWithOwner { pub fn into_vcomponent( self, render_fn: impl ComponentFunction, - component_name: &'static str, ) -> VComponent { + let component_name = std::any::type_name_of_val(&render_fn); VComponent::new( move |wrapper: Self| render_fn.rebuild(wrapper.inner), self, diff --git a/packages/rsx/src/component.rs b/packages/rsx/src/component.rs index 80243ec55..5f1c28f2c 100644 --- a/packages/rsx/src/component.rs +++ b/packages/rsx/src/component.rs @@ -24,7 +24,7 @@ use std::{collections::HashSet, vec}; use syn::{ parse::{Parse, ParseStream}, spanned::Spanned, - token, AngleBracketedGenericArguments, Expr, Ident, PathArguments, Result, + token, AngleBracketedGenericArguments, Expr, PathArguments, Result, }; #[derive(PartialEq, Eq, Clone, Debug)] @@ -92,9 +92,6 @@ impl ToTokens for Component { // Create props either from manual props or from the builder approach let props = self.create_props(); - // Make sure we stringify the component name - let fn_name = self.fn_name().to_string(); - // Make sure we emit any errors let diagnostics = &self.diagnostics; @@ -109,7 +106,6 @@ impl ToTokens for Component { #props }).into_vcomponent( #name #generics, - #fn_name ); #diagnostics __comp @@ -302,10 +298,6 @@ impl Component { .collect() } - fn fn_name(&self) -> Ident { - self.name.segments.last().unwrap().ident.clone() - } - fn empty(name: syn::Path, generics: Option) -> Self { let mut diagnostics = Diagnostics::new(); diagnostics.push(