Merge branch '3.x' into 4.x

* 3.x:
  Mark implicit macro argument default values as such with an attribute in AST
This commit is contained in:
Fabien Potencier
2024-08-27 13:22:48 +02:00
2 changed files with 24 additions and 1 deletions
+2 -1
View File
@@ -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 {
+22
View File
@@ -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()));