diff --git a/src/ExpressionParser.php b/src/ExpressionParser.php index 9915f9703..663eb45cb 100644 --- a/src/ExpressionParser.php +++ b/src/ExpressionParser.php @@ -565,7 +565,7 @@ class ExpressionParser * Parses arguments. * * @param bool $namedArguments Whether to allow named arguments or not - * @param bool $definition Whether we are parsing arguments for a function definition + * @param bool $definition Whether we are parsing arguments for a function (or macro) definition * * @return Node * @@ -616,6 +616,7 @@ class ExpressionParser if (null === $name) { $name = $value->getAttribute('name'); $value = new ConstantExpression(null, $this->parser->getCurrentToken()->getLine()); + $value->setAttribute('is_implicit', true); } $args[$name] = $value; } else { diff --git a/tests/ParserTest.php b/tests/ParserTest.php index 2500c7fba..5a0a0603a 100644 --- a/tests/ParserTest.php +++ b/tests/ParserTest.php @@ -14,6 +14,7 @@ namespace Twig\Tests; use PHPUnit\Framework\TestCase; use Twig\Environment; use Twig\Error\SyntaxError; +use Twig\Lexer; use Twig\Loader\ArrayLoader; use Twig\Node\Node; use Twig\Node\SetNode; @@ -172,6 +173,27 @@ EOF $this->addToAssertionCount(1); } + public function testImplicitMacroArgumentDefaultValues() + { + $template = '{% macro marco (po, lo = true) %}{% endmacro %}'; + $lexer = new Lexer(new Environment(new ArrayLoader())); + $stream = $lexer->tokenize(new Source($template, 'index')); + + $argumentNodes = $this->getParser() + ->parse($stream) + ->getNode('macros') + ->getNode('marco') + ->getNode('arguments') + ; + + $this->assertTrue($argumentNodes->getNode('po')->hasAttribute('is_implicit')); + $this->assertTrue($argumentNodes->getNode('po')->getAttribute('is_implicit')); + $this->assertNull($argumentNodes->getNode('po')->getAttribute('value')); + + $this->assertFalse($argumentNodes->getNode('lo')->hasAttribute('is_implicit')); + $this->assertSame(true, $argumentNodes->getNode('lo')->getAttribute('value')); + } + protected function getParser() { $parser = new Parser(new Environment(new ArrayLoader()));