From 41f4ad1022c4f516ac8cf5edefd26ee47df7d72c Mon Sep 17 00:00:00 2001 From: Leo dev Date: Fri, 30 Jan 2026 17:03:18 +0100 Subject: [PATCH] Fixed rsx! for loops and if statements --- examples/benchmark.rs | 37 --------------------- macros/src/emit.rs | 77 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 62 insertions(+), 52 deletions(-) delete mode 100644 examples/benchmark.rs diff --git a/examples/benchmark.rs b/examples/benchmark.rs deleted file mode 100644 index bbea75e..0000000 --- a/examples/benchmark.rs +++ /dev/null @@ -1,37 +0,0 @@ -use std::sync::Arc; - -use osui::prelude::*; - -pub fn main() { - let engine = Benchmark::new(Console::new()); - - let mut benchmark_result = Vec::new(); - - for flat in 0..10 { - // for nest in 0..10 { - benchmark_result.push( - engine - .run(move |cx| { - // let sync_nest = use_state(nest); - cx.scope().child(app, None); - // use_sync_effect(cx, &sync_nest, |s| s.get_dl(), &[&sync_nest]); - - rsx! { - app - } - .view(cx.clone()) - }) - .expect("Failed to run engine"), - ); - // } - } -} - -fn app(cx: &Arc) -> View { - // let nest = use_sync_state(cx, 0, |v| *v); - - rsx! { - "hello_world" - } - .view(cx.clone()) -} diff --git a/macros/src/emit.rs b/macros/src/emit.rs index c4683c9..6ad9c85 100644 --- a/macros/src/emit.rs +++ b/macros/src/emit.rs @@ -3,7 +3,7 @@ use proc_macro2::TokenStream; use quote::quote; pub fn emit_rsx(root: RsxRoot) -> TokenStream { - let nodes = root.nodes.iter().map(emit_node); + let nodes = root.nodes.iter().map(emit_node_scope); quote! {{ let mut r = osui::frontend::Rsx::new(); @@ -25,19 +25,42 @@ fn emit_deps(deps: &[Dep]) -> TokenStream { .collect() } -fn emit_node(node: &RsxNode) -> TokenStream { - match node { - RsxNode::Text(text) => quote! { - r.static_scope(|scope| scope.view(Arc::new(move |ctx| { - ctx.draw_text(Point { x: 0, y: 0 }, &format!(#text)) - }))); - }, +fn emit_deps_vec(deps: &[Dep]) -> TokenStream { + let deps = deps.iter().map(|d| { + let ident = &d.ident; - RsxNode::Component(name) => quote! { - r.static_scope(|scope| scope.view(Arc::new(move |ctx| { - scope.child(#name, None) - }))); - }, + if let Some(pat) = &d.pat { + quote! {{ + let #pat = #ident.clone(); + Box::new(#pat) as Box + }} + } else { + quote! { + Box::new(#ident.clone()) as Box + } + } + }); + + quote! { + vec![ #(#deps),* ] + } +} + +fn emit_node_scope(node: &RsxNode) -> TokenStream { + match node { + RsxNode::Text(_) => { + let emit = emit_node(node); + quote! { + r.static_scope(|scope| {#emit}); + } + } + + RsxNode::Component(_) => { + let emit = emit_node(node); + quote! { + r.static_scope(|scope| {#emit}); + } + } RsxNode::Mount(m) => quote! { #m.mount(); @@ -49,6 +72,7 @@ fn emit_node(node: &RsxNode) -> TokenStream { children, } => { let deps_emit = emit_deps(deps); + let deps_vec_emit = emit_deps_vec(deps); let kids = children.iter().map(emit_node); quote! { @@ -62,7 +86,7 @@ fn emit_node(node: &RsxNode) -> TokenStream { } else { scope.children.lock().unwrap().clear(); } - }); + }, #deps_vec_emit); } } } @@ -74,6 +98,7 @@ fn emit_node(node: &RsxNode) -> TokenStream { children, } => { let deps_emit = emit_deps(deps); + let deps_vec_emit = emit_deps_vec(deps); let kids = children.iter().map(emit_node); quote! { @@ -84,9 +109,31 @@ fn emit_node(node: &RsxNode) -> TokenStream { for #pat in #expr { #(#kids)* } - }); + }, #deps_vec_emit); } } } } } + +fn emit_node(node: &RsxNode) -> TokenStream { + match node { + RsxNode::Text(text) => quote! { + scope.view(Arc::new(move |ctx| { + ctx.draw_text(Point { x: 0, y: 0 }, &format!(#text)) + })); + }, + + RsxNode::Component(name) => quote! { + scope.child(#name, None); + }, + + RsxNode::Mount(m) => quote! { + #m.mount(); + }, + + RsxNode::If { .. } => panic!("Invalid if statement"), + + RsxNode::For { .. } => panic!("Invalid for loop"), + } +}