Add macro to luaify blocks instead of exprs
This commit is contained in:
parent
2a6015c19a
commit
dfd57e0ad0
@ -14,6 +14,12 @@ pub fn generate(expr: &Expr) -> Result<TokenStream> {
|
|||||||
Ok(f.done())
|
Ok(f.done())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn generate_chunk(block: &Block) -> Result<TokenStream> {
|
||||||
|
let mut f = Formatter::default();
|
||||||
|
generate_block(&mut f, &block, Context::stmt(false))?;
|
||||||
|
Ok(f.done())
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct Formatter {
|
struct Formatter {
|
||||||
buf: String,
|
buf: String,
|
||||||
|
@ -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 proc_macro::TokenStream as TokenStream1;
|
||||||
use quote::ToTokens;
|
use quote::ToTokens;
|
||||||
use syn::parse_macro_input;
|
use syn::parse_macro_input;
|
||||||
@ -16,3 +19,13 @@ pub fn luaify(input: TokenStream1) -> TokenStream1 {
|
|||||||
}
|
}
|
||||||
.into()
|
.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()
|
||||||
|
}
|
||||||
|
@ -9,6 +9,12 @@ pub fn transform(expr: &mut Expr) -> Result<()> {
|
|||||||
visitor.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)]
|
#[derive(Debug)]
|
||||||
struct Visitor {
|
struct Visitor {
|
||||||
result: Result<()>,
|
result: Result<()>,
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use luaify::luaify;
|
use luaify::{luaify, luaify_chunk};
|
||||||
use pretty_assertions::assert_eq;
|
use pretty_assertions::assert_eq;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -403,3 +403,19 @@ fn length() {
|
|||||||
r#"local a,b,c=#a,#b,#c;"#
|
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;"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user