ribir_macros 0.4.0-alpha.3

A non-intrusive declarative GUI framework, to build modern native/wasm cross-platform applications.
Documentation
use proc_macro::TokenStream as TokenStream1;
use proc_macro2::TokenStream;
use quote::quote;
use syn::{fold::Fold, parse_macro_input};

use crate::{
  ok,
  pipe_macro::BodyExpr,
  symbol_process::{symbol_to_macro, DollarRefsCtx},
};

pub(crate) fn gen_code(input: TokenStream, refs_ctx: &mut DollarRefsCtx) -> TokenStream1 {
  let input = ok!(symbol_to_macro(TokenStream1::from(input)));
  let body = parse_macro_input!(input as BodyExpr);
  refs_ctx.new_dollar_scope(true);
  let stmts: Vec<_> = body
    .0
    .into_iter()
    .map(|s| refs_ctx.fold_stmt(s))
    .collect();
  let _ = refs_ctx.pop_dollar_scope(true, false);
  quote! {
    move |ctx!(): &BuildCtx| -> Widget { #(#stmts)*.build(ctx!()) }
  }
  .into()
}