dioxus_rsx/
expr_node.rs

1use crate::{DynIdx, PartialExpr};
2use quote::{quote, ToTokens, TokenStreamExt};
3use syn::parse::Parse;
4
5#[derive(PartialEq, Eq, Clone, Debug)]
6pub struct ExprNode {
7    pub expr: PartialExpr,
8    pub dyn_idx: DynIdx,
9}
10
11impl ExprNode {
12    pub fn span(&self) -> proc_macro2::Span {
13        self.expr.span()
14    }
15}
16
17impl Parse for ExprNode {
18    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
19        // // If it's a single-line expression, we want to parse it without braces, fixing some issues with rust 2024 lifetimes
20        // use syn::braced;
21        // let forked = input.fork();
22        // if forked.peek(syn::token::Brace) {
23        //     let content;
24        //     let _brace = braced!(content in forked);
25        //     let as_expr: Result<syn::Expr, syn::Error> = content.parse();
26        //     if as_expr.is_ok() && content.is_empty() {
27        //         let content;
28        //         let _brace = braced!(content in input);
29        //         return Ok(Self {
30        //             expr: content.parse()?,
31        //             dyn_idx: DynIdx::default(),
32        //         });
33        //     }
34        // }
35
36        Ok(Self {
37            expr: input.parse()?,
38            dyn_idx: DynIdx::default(),
39        })
40    }
41}
42
43impl ToTokens for ExprNode {
44    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
45        let expr = &self.expr;
46        tokens.append_all(quote! {
47            {
48                #[allow(unused_braces)]
49                let ___nodes = dioxus_core::IntoDynNode::into_dyn_node(#expr);
50                ___nodes
51            }
52        })
53    }
54}
55
56#[test]
57fn no_commas() {
58    use prettier_please::PrettyUnparse;
59    let input = quote! {
60        div {
61            {label("Hello, world!")},
62        }
63    };
64
65    let _expr: crate::BodyNode = syn::parse2(input).unwrap();
66    println!("{}", _expr.to_token_stream().pretty_unparse());
67}