From dfd57e0ad03503c83414a9222802fad6fc97a984 Mon Sep 17 00:00:00 2001 From: luaneko Date: Thu, 26 Jun 2025 13:57:10 +1000 Subject: [PATCH] Add macro to luaify blocks instead of exprs --- crates/luaify/src/generate.rs | 6 ++++++ crates/luaify/src/lib.rs | 15 ++++++++++++++- crates/luaify/src/transform.rs | 6 ++++++ crates/luaify/tests/test.rs | 18 +++++++++++++++++- 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/crates/luaify/src/generate.rs b/crates/luaify/src/generate.rs index 4138e96..bdf14c2 100644 --- a/crates/luaify/src/generate.rs +++ b/crates/luaify/src/generate.rs @@ -14,6 +14,12 @@ pub fn generate(expr: &Expr) -> Result { Ok(f.done()) } +pub fn generate_chunk(block: &Block) -> Result { + let mut f = Formatter::default(); + generate_block(&mut f, &block, Context::stmt(false))?; + Ok(f.done()) +} + #[derive(Default)] struct Formatter { buf: String, diff --git a/crates/luaify/src/lib.rs b/crates/luaify/src/lib.rs index 8440456..5e1ed7c 100644 --- a/crates/luaify/src/lib.rs +++ b/crates/luaify/src/lib.rs @@ -1,4 +1,7 @@ -use crate::{generate::generate, transform::transform}; +use crate::{ + generate::{generate, generate_chunk}, + transform::{transform, transform_chunk}, +}; use proc_macro::TokenStream as TokenStream1; use quote::ToTokens; use syn::parse_macro_input; @@ -16,3 +19,13 @@ pub fn luaify(input: TokenStream1) -> TokenStream1 { } .into() } + +#[proc_macro] +pub fn luaify_chunk(input: TokenStream1) -> TokenStream1 { + let mut block = parse_macro_input!(input); + match transform_chunk(&mut block).and_then(|()| generate_chunk(&block)) { + Ok(s) => s, + Err(err) => err.into_compile_error().into_token_stream(), + } + .into() +} diff --git a/crates/luaify/src/transform.rs b/crates/luaify/src/transform.rs index 9605605..8c6047d 100644 --- a/crates/luaify/src/transform.rs +++ b/crates/luaify/src/transform.rs @@ -9,6 +9,12 @@ pub fn transform(expr: &mut Expr) -> Result<()> { visitor.result } +pub fn transform_chunk(block: &mut Block) -> Result<()> { + let mut visitor = Visitor::new(); + visitor.visit_block_mut(block); + visitor.result +} + #[derive(Debug)] struct Visitor { result: Result<()>, diff --git a/crates/luaify/tests/test.rs b/crates/luaify/tests/test.rs index bc09cde..78e77ac 100644 --- a/crates/luaify/tests/test.rs +++ b/crates/luaify/tests/test.rs @@ -1,4 +1,4 @@ -use luaify::luaify; +use luaify::{luaify, luaify_chunk}; use pretty_assertions::assert_eq; #[test] @@ -403,3 +403,19 @@ fn length() { r#"local a,b,c=#a,#b,#c;"# ); } + +#[test] +fn chunk() { + assert_eq!( + luaify_chunk!({ + if a == b { + c() + } else if b == c { + a() + } else { + d() + } + }), + "if a==b then c();elseif b==c then a();else d();end;" + ); +}