diff --git a/CHANGELOG b/CHANGELOG index e76aceca7..ef40b2055 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ # 3.16.0 (2024-XX-XX) + * Fix having macro variables starting with an underscore * Deprecate not passing a `Source` instance to `TokenStream` * Deprecate returning `null` from `TwigFilter::getSafe()` and `TwigFunction::getSafe()`, return `[]` instead diff --git a/src/Node/Expression/TempNameExpression.php b/src/Node/Expression/TempNameExpression.php index b6ce30c8b..925b0e7b3 100644 --- a/src/Node/Expression/TempNameExpression.php +++ b/src/Node/Expression/TempNameExpression.php @@ -32,7 +32,7 @@ class TempNameExpression extends AbstractExpression if (null !== $name && (is_int($name) || ctype_digit($name))) { $name = (int) $name; } elseif (in_array($name, self::RESERVED_NAMES)) { - $name = '_'.$name.'_'; + $name = "\u{035C}".$name; } parent::__construct([], ['name' => $name], $lineno); diff --git a/src/Node/MacroNode.php b/src/Node/MacroNode.php index 86abee759..ab37d85a5 100644 --- a/src/Node/MacroNode.php +++ b/src/Node/MacroNode.php @@ -48,7 +48,7 @@ class MacroNode extends Node } foreach ($arguments->getKeyValuePairs() as $pair) { - if ('_'.self::VARARGS_NAME.'_' === $pair['key']->getAttribute('name')) { + if ("\u{035C}".self::VARARGS_NAME === $pair['key']->getAttribute('name')) { throw new SyntaxError(\sprintf('The argument "%s" in macro "%s" cannot be defined because the variable "%s" is reserved for arbitrary arguments.', self::VARARGS_NAME, $name, self::VARARGS_NAME), $pair['value']->getTemplateLine(), $pair['value']->getSourceContext()); } } @@ -88,9 +88,13 @@ class MacroNode extends Node foreach ($arguments->getKeyValuePairs() as $pair) { $name = $pair['key']; + $var = $name->getAttribute('name'); + if (str_starts_with($var, "\u{035C}")) { + $var = substr($var, \strlen("\u{035C}")); + } $compiler ->write('') - ->string(trim($name->getAttribute('name'), '_')) + ->string($var) ->raw(' => ') ->subcompile($name) ->raw(",\n") diff --git a/tests/Node/MacroTest.php b/tests/Node/MacroTest.php index fcd5db402..11bdc2f15 100644 --- a/tests/Node/MacroTest.php +++ b/tests/Node/MacroTest.php @@ -42,6 +42,8 @@ class MacroTest extends NodeTestCase new ConstantExpression(null, 1), new LocalVariable('bar', 1), new ConstantExpression('Foo', 1), + new LocalVariable('_underscore', 1), + new ConstantExpression(null, 1), ], 1); $body = new BodyNode([new TextNode('foo', 1)]); @@ -49,12 +51,13 @@ class MacroTest extends NodeTestCase yield 'with use_yield = true' => [$node, <<macros; \$context = [ "foo" => \$foo, "bar" => \$bar, + "_underscore" => \$_underscore, "varargs" => \$varargs, ] + \$this->env->getGlobals(); @@ -71,12 +74,13 @@ EOF yield 'with use_yield = false' => [$node, <<macros; \$context = [ "foo" => \$foo, "bar" => \$bar, + "_underscore" => \$_underscore, "varargs" => \$varargs, ] + \$this->env->getGlobals();