From c9026123e6038beda77b09343c7ca2df8c134ffd Mon Sep 17 00:00:00 2001 From: luaneko Date: Mon, 23 Jun 2025 07:27:52 +1000 Subject: [PATCH] Implement length macro in luaify --- crates/luaify/src/generate.rs | 8 ++++++++ crates/luaify/tests/test.rs | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/crates/luaify/src/generate.rs b/crates/luaify/src/generate.rs index 06591e6..82bc83c 100644 --- a/crates/luaify/src/generate.rs +++ b/crates/luaify/src/generate.rs @@ -796,6 +796,7 @@ fn generate_receiver(f: &mut Formatter, recv: &Receiver) -> Result<()> { fn generate_macro(f: &mut Formatter, mac: &Macro, cx: Context) -> Result<()> { match format!("{}", mac.path.require_ident()?).as_str() { "concat" => generate_macro_concat(f, mac, cx), + "len" => generate_macro_len(f, mac, cx), "variadic" => generate_macro_variadic(f, mac, cx), "embed" => generate_macro_embed(f, mac, cx), "raw" => generate_macro_raw(f, mac, cx), @@ -815,6 +816,13 @@ fn generate_macro_concat(f: &mut Formatter, mac: &Macro, cx: Context) -> Result< Ok(()) } +fn generate_macro_len(f: &mut Formatter, mac: &Macro, cx: Context) -> Result<()> { + syn_assert!(cx.is_value(), mac, "len! must be in expression position"); + cx.is_ret().then(|| f.write("return")); + f.write("#"); + generate_expr(f, &mac.parse_body()?, Context::expr(false)) +} + fn generate_macro_variadic(f: &mut Formatter, mac: &Macro, cx: Context) -> Result<()> { syn_assert!( cx.is_multi_expr(), diff --git a/crates/luaify/tests/test.rs b/crates/luaify/tests/test.rs index 7119167..c1331de 100644 --- a/crates/luaify/tests/test.rs +++ b/crates/luaify/tests/test.rs @@ -391,3 +391,14 @@ fn variadic() { r#"function(a,...)local a,b=a,b,c,...;return func(a,b,c,d,...);end"# ); } + +#[test] +fn length() { + assert_eq!(luaify!(len!(a)), r#"#a"#); + assert_eq!( + luaify!({ + let (a, b, c) = (len!(a), len!(b), len!(c)); + }), + r#"local a,b,c=#a,#b,#c;"# + ); +}