diff --git a/src/ExpressionParser.php b/src/ExpressionParser.php index 7258d4c20..d02b02720 100644 --- a/src/ExpressionParser.php +++ b/src/ExpressionParser.php @@ -467,8 +467,10 @@ class ExpressionParser } $recurseArgs = new ArrayExpression([], $line); $recurseArgs->addElement($args->getNode('0')); + $expr = new GetAttrExpression(new NameExpression('loop', $line), new ConstantExpression('__invoke', $line), $recurseArgs, Template::METHOD_CALL, $line); + $expr->setAttribute('is_generator', true); - return new GetAttrExpression(new NameExpression('loop', $line), new ConstantExpression('__invoke', $line), $recurseArgs, Template::METHOD_CALL, $line); + return $expr; default: if (null !== $alias = $this->parser->getImportedSymbol('function', $name)) { $arguments = new ArrayExpression([], $line); diff --git a/src/Extension/CoreExtension.php b/src/Extension/CoreExtension.php index fd46bcd8b..144b4a343 100644 --- a/src/Extension/CoreExtension.php +++ b/src/Extension/CoreExtension.php @@ -56,7 +56,6 @@ use Twig\Node\Expression\Test\SameasTest; use Twig\Node\Expression\Unary\NegUnary; use Twig\Node\Expression\Unary\NotUnary; use Twig\Node\Expression\Unary\PosUnary; -use Twig\NodeVisitor\ForNodeVisitor; use Twig\NodeVisitor\MacroAutoImportNodeVisitor; use Twig\Source; use Twig\Template; @@ -269,10 +268,7 @@ final class CoreExtension extends AbstractExtension public function getNodeVisitors(): array { - return [ - new MacroAutoImportNodeVisitor(), - new ForNodeVisitor(), - ]; + return [new MacroAutoImportNodeVisitor()]; } public function getOperators(): array diff --git a/src/NodeVisitor/ForNodeVisitor.php b/src/NodeVisitor/ForNodeVisitor.php deleted file mode 100644 index afa35e75c..000000000 --- a/src/NodeVisitor/ForNodeVisitor.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * @internal - */ -final class ForNodeVisitor implements NodeVisitorInterface -{ - private int $loops = 0; - - public function enterNode(Node $node, Environment $env): Node - { - if ($node instanceof ForNode) { - ++$this->loops; - - return $node; - } elseif (!$this->loops) { - // we are outside a loop - return $node; - } - - if (!$node instanceof PrintNode) { - return $node; - } - - // We look for exactly {{ loop.__invoke(...) }} - $exprNode = $node->getNode('expr'); - if ( - $exprNode instanceof GetAttrExpression - && $exprNode->getNode('node') instanceof NameExpression - && 'loop' === $exprNode->getNode('node')->getAttribute('name') - && $exprNode->getNode('attribute') instanceof ConstantExpression - && '__invoke' === $exprNode->getNode('attribute')->getAttribute('value') - ) { - $exprNode->setAttribute('is_generator', true); - } - - return $node; - } - - public function leaveNode(Node $node, Environment $env): ?Node - { - if ($node instanceof ForNode) { - --$this->loops; - } - - return $node; - } - - public function getPriority(): int - { - return 0; - } -}