render optimizations (#585)

This commit is contained in:
Demonthos authored and GitHub committed 2022-10-08 23:24:41 -07:00
1 parent fb2f3e68ff
commit 23c48cf795
2 files changed
+27 -15

No files matched your search

+9 -2
View File
@@ -65,8 +65,15 @@ pub fn rsx_without_templates(s: TokenStream) -> TokenStream {
pub fn render(s: TokenStream) -> TokenStream { pub fn render(s: TokenStream) -> TokenStream {
match syn::parse::<rsx::CallBody>(s) { match syn::parse::<rsx::CallBody>(s) {
Err(err) => err.to_compile_error().into(), Err(err) => err.to_compile_error().into(),
Ok(body) => quote::quote! { Ok(body) => {
cx.render(#body) let mut inner = proc_macro2::TokenStream::new();
body.to_tokens_without_lazynodes(&mut inner);
quote::quote! {
{
let __cx = NodeFactory::new(&cx.scope);
Some(#inner)
}
}
} }
.into_token_stream() .into_token_stream()
.into(), .into(),
+18 -13
View File
@@ -67,20 +67,9 @@ impl Parse for CallBody {
/// Serialize the same way, regardless of flavor /// Serialize the same way, regardless of flavor
impl ToTokens for CallBody { impl ToTokens for CallBody {
fn to_tokens(&self, out_tokens: &mut TokenStream2) { fn to_tokens(&self, out_tokens: &mut TokenStream2) {
let template = TemplateBuilder::from_roots(self.roots.clone()); let mut inner = TokenStream2::new();
let inner = if let Some(template) = template { self.to_tokens_without_lazynodes(&mut inner);
quote! { #template }
} else {
let children = &self.roots;
if children.len() == 1 {
let inner = &self.roots[0];
quote! { #inner }
} else {
quote! { __cx.fragment_root([ #(#children),* ]) }
}
};
// Otherwise we just build the LazyNode wrapper
out_tokens.append_all(quote! { out_tokens.append_all(quote! {
LazyNodes::new(move |__cx: NodeFactory| -> VNode { LazyNodes::new(move |__cx: NodeFactory| -> VNode {
use dioxus_elements::{GlobalAttributes, SvgAttributes}; use dioxus_elements::{GlobalAttributes, SvgAttributes};
@@ -107,4 +96,20 @@ impl CallBody {
}) })
}) })
} }
pub fn to_tokens_without_lazynodes(&self, out_tokens: &mut TokenStream2) {
let template = TemplateBuilder::from_roots(self.roots.clone());
let inner = if let Some(template) = template {
quote! { #template }
} else {
let children = &self.roots;
if children.len() == 1 {
let inner = &self.roots[0];
quote! { #inner }
} else {
quote! { __cx.fragment_root([ #(#children),* ]) }
}
};
out_tokens.append_all(inner);
}
} }