diff --git a/integration_tests/macros_test.ucg b/integration_tests/macros_test.ucg index d14dfc7..c6392be 100644 --- a/integration_tests/macros_test.ucg +++ b/integration_tests/macros_test.ucg @@ -1,3 +1,7 @@ +let noargmacro = macro() => { + field1 = "value", +}; + let simplemacro = macro(arg1, arg2, arg3) => { field1 = arg1, field2 = arg2, @@ -11,9 +15,13 @@ let cplxmacro = macro(argint, argstr, argfloat) => { boolfield = argint == 1, }; +let noargresult = noargmacro(); let simpleresult = simplemacro(1, 2, 3); let cplxresult = cplxmacro(1, "We", 3.0); +assert | + noargresult.field1 == "value"; +|; assert | simpleresult.field1 == 1; |; diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 261083c..57e0c24 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -661,12 +661,12 @@ make_fn!( fn tuple_to_call<'a>( input: SliceIter<'a, Token>, val: Value, - exprs: Vec, + exprs: Option>, ) -> ParseResult<'a, Expression> { if let Value::Selector(def) = val { Ok(Expression::Call(CallDef { macroref: def, - arglist: exprs, + arglist: exprs.unwrap_or_else(|| Vec::new()), pos: (&input).into(), })) } else { @@ -693,7 +693,7 @@ fn call_expression(input: SliceIter) -> Result, Expressi let parsed = do_each!(input.clone(), macroname => trace_nom!(selector_value), _ => punct!("("), - args => separated!(punct!(","), trace_nom!(expression)), + args => optional!(separated!(punct!(","), trace_nom!(expression))), _ => punct!(")"), (macroname, args) ); diff --git a/src/parse/test.rs b/src/parse/test.rs index ba20a30..260c4ea 100644 --- a/src/parse/test.rs +++ b/src/parse/test.rs @@ -887,6 +887,18 @@ fn test_call_parse() { pos: Position::new(1, 1, 0), }) ); + + assert_parse!( + call_expression("foo ()"), + Expression::Call(CallDef { + macroref: make_selector!( + make_expr!("foo", Position::new(1, 1, 0)), + Position::new(1, 1, 0) + ), + arglist: Vec::new(), + pos: Position::new(1, 1, 0), + }) + ); } #[test]