From fd833197d33bece2bfa4c16ed9542f33b2f9aacc Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 29 Nov 2024 19:28:34 +0100 Subject: [PATCH] Remove deprecation, update code --- src/Extension/CoreExtension.php | 3 +- src/Node/Expression/ConditionalExpression.php | 54 --------------- src/Node/Expression/Filter/DefaultFilter.php | 1 - .../Expression/NullCoalesceExpression.php | 65 ------------------- src/NodeVisitor/EscaperNodeVisitor.php | 5 +- src/NodeVisitor/SafeAnalysisNodeVisitor.php | 2 - tests/Node/Expression/ConditionalTest.php | 47 -------------- tests/Node/Expression/NullCoalesceTest.php | 32 --------- 8 files changed, 2 insertions(+), 207 deletions(-) delete mode 100644 src/Node/Expression/ConditionalExpression.php delete mode 100644 src/Node/Expression/NullCoalesceExpression.php delete mode 100644 tests/Node/Expression/ConditionalTest.php delete mode 100644 tests/Node/Expression/NullCoalesceTest.php diff --git a/src/Extension/CoreExtension.php b/src/Extension/CoreExtension.php index 93fff5c80..7fdacf43e 100644 --- a/src/Extension/CoreExtension.php +++ b/src/Extension/CoreExtension.php @@ -58,7 +58,6 @@ use Twig\Node\Expression\Filter\RawFilter; use Twig\Node\Expression\FunctionNode\EnumCasesFunction; use Twig\Node\Expression\FunctionNode\EnumFunction; use Twig\Node\Expression\GetAttrExpression; -use Twig\Node\Expression\NullCoalesceExpression; use Twig\Node\Expression\ParentExpression; use Twig\Node\Expression\Test\ConstantTest; use Twig\Node\Expression\Test\DefinedTest; @@ -326,7 +325,7 @@ final class CoreExtension extends AbstractExtension ], [ '?:' => ['precedence' => 5, 'class' => ElvisBinary::class, 'associativity' => ExpressionParser::OPERATOR_RIGHT], - '??' => ['precedence' => 5, 'class' => NullCoalesceExpression::class, 'associativity' => ExpressionParser::OPERATOR_RIGHT], + '??' => ['precedence' => 5, 'class' => NullCoalesceBinary::class, 'associativity' => ExpressionParser::OPERATOR_RIGHT], 'or' => ['precedence' => 10, 'class' => OrBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], 'xor' => ['precedence' => 12, 'class' => XorBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], 'and' => ['precedence' => 15, 'class' => AndBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT], diff --git a/src/Node/Expression/ConditionalExpression.php b/src/Node/Expression/ConditionalExpression.php deleted file mode 100644 index 69d55a358..000000000 --- a/src/Node/Expression/ConditionalExpression.php +++ /dev/null @@ -1,54 +0,0 @@ - $expr1, 'expr2' => $expr2, 'expr3' => $expr3], [], $lineno); - } - - public function compile(Compiler $compiler): void - { - // Ternary with no then uses Elvis operator - if ($this->getNode('expr1') === $this->getNode('expr2')) { - $compiler - ->raw('((') - ->subcompile($this->getNode('expr1')) - ->raw(') ?: (') - ->subcompile($this->getNode('expr3')) - ->raw('))'); - } else { - $compiler - ->raw('((') - ->subcompile($this->getNode('expr1')) - ->raw(') ? (') - ->subcompile($this->getNode('expr2')) - ->raw(') : (') - ->subcompile($this->getNode('expr3')) - ->raw('))'); - } - } - - public function getOperandNamesToEscape(): array - { - return ['expr2', 'expr3']; - } -} diff --git a/src/Node/Expression/Filter/DefaultFilter.php b/src/Node/Expression/Filter/DefaultFilter.php index 5c8da07f5..2964f3bb1 100644 --- a/src/Node/Expression/Filter/DefaultFilter.php +++ b/src/Node/Expression/Filter/DefaultFilter.php @@ -18,7 +18,6 @@ use Twig\Node\Expression\AbstractExpression; use Twig\Node\Expression\ConstantExpression; use Twig\Node\Expression\FilterExpression; use Twig\Node\Expression\GetAttrExpression; -use Twig\Node\Expression\NameExpression; use Twig\Node\Expression\Ternary\ConditionalTernary; use Twig\Node\Expression\Test\DefinedTest; use Twig\Node\Expression\Variable\ContextVariable; diff --git a/src/Node/Expression/NullCoalesceExpression.php b/src/Node/Expression/NullCoalesceExpression.php deleted file mode 100644 index 9bd919173..000000000 --- a/src/Node/Expression/NullCoalesceExpression.php +++ /dev/null @@ -1,65 +0,0 @@ -getTemplateLine()); - // for "block()", we don't need the null test as the return value is always a string - if (!$left instanceof BlockReferenceExpression) { - $test = new AndBinary( - $test, - new NotUnary(new NullTest($left, new TwigTest('null'), new EmptyNode(), $left->getTemplateLine()), $left->getTemplateLine()), - $left->getTemplateLine() - ); - } - - parent::__construct($test, $left, $right, $lineno); - } - - public function compile(Compiler $compiler): void - { - /* - * This optimizes only one case. PHP 7 also supports more complex expressions - * that can return null. So, for instance, if log is defined, log("foo") ?? "..." works, - * but log($a["foo"]) ?? "..." does not if $a["foo"] is not defined. More advanced - * cases might be implemented as an optimizer node visitor, but has not been done - * as benefits are probably not worth the added complexity. - */ - if ($this->getNode('expr2') instanceof ContextVariable) { - $this->getNode('expr2')->setAttribute('always_defined', true); - $compiler - ->raw('((') - ->subcompile($this->getNode('expr2')) - ->raw(') ?? (') - ->subcompile($this->getNode('expr3')) - ->raw('))') - ; - } else { - parent::compile($compiler); - } - } -} diff --git a/src/NodeVisitor/EscaperNodeVisitor.php b/src/NodeVisitor/EscaperNodeVisitor.php index f16d74b38..31e0bd75e 100644 --- a/src/NodeVisitor/EscaperNodeVisitor.php +++ b/src/NodeVisitor/EscaperNodeVisitor.php @@ -99,10 +99,7 @@ final class EscaperNodeVisitor implements NodeVisitorInterface return $node; } - /** - * @param AbstractExpression&OperatorEscapeInterface $expression - */ - private function escapeConditional($expression, Environment $env, string $type): void + private function escapeConditional(AbstractExpression&OperatorEscapeInterface $expression, Environment $env, string $type): void { foreach ($expression->getOperandNamesToEscape() as $name) { $operand = $expression->getNode($name); diff --git a/src/NodeVisitor/SafeAnalysisNodeVisitor.php b/src/NodeVisitor/SafeAnalysisNodeVisitor.php index d5d6a7af3..a38bb63ce 100644 --- a/src/NodeVisitor/SafeAnalysisNodeVisitor.php +++ b/src/NodeVisitor/SafeAnalysisNodeVisitor.php @@ -18,8 +18,6 @@ use Twig\Node\Expression\FilterExpression; use Twig\Node\Expression\FunctionExpression; use Twig\Node\Expression\GetAttrExpression; use Twig\Node\Expression\MacroReferenceExpression; -use Twig\Node\Expression\MethodCallExpression; -use Twig\Node\Expression\NameExpression; use Twig\Node\Expression\OperatorEscapeInterface; use Twig\Node\Expression\ParentExpression; use Twig\Node\Expression\Variable\ContextVariable; diff --git a/tests/Node/Expression/ConditionalTest.php b/tests/Node/Expression/ConditionalTest.php deleted file mode 100644 index 254b306fc..000000000 --- a/tests/Node/Expression/ConditionalTest.php +++ /dev/null @@ -1,47 +0,0 @@ -assertEquals($expr1, $node->getNode('expr1')); - $this->assertEquals($expr2, $node->getNode('expr2')); - $this->assertEquals($expr3, $node->getNode('expr3')); - } - - public static function provideTests(): iterable - { - $tests = []; - - $expr1 = new ConstantExpression(1, 1); - $expr2 = new ConstantExpression(2, 1); - $expr3 = new ConstantExpression(3, 1); - $node = new ConditionalExpression($expr1, $expr2, $expr3, 1); - $tests[] = [$node, '((1) ? (2) : (3))']; - - return $tests; - } -} diff --git a/tests/Node/Expression/NullCoalesceTest.php b/tests/Node/Expression/NullCoalesceTest.php deleted file mode 100644 index cc22a90f7..000000000 --- a/tests/Node/Expression/NullCoalesceTest.php +++ /dev/null @@ -1,32 +0,0 @@ -