mirror of
https://github.com/twigphp/Twig.git
synced 2026-09-12 10:26:32 +00:00
Remove deprecation, update code
This commit is contained in:
@@ -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],
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Twig.
|
||||
*
|
||||
* (c) Fabien Potencier
|
||||
* (c) Armin Ronacher
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Twig\Node\Expression;
|
||||
|
||||
use Twig\Compiler;
|
||||
use Twig\Node\Expression\OperatorEscapeInterface;
|
||||
use Twig\Node\Expression\Ternary\ConditionalTernary;
|
||||
|
||||
class ConditionalExpression extends AbstractExpression implements OperatorEscapeInterface
|
||||
{
|
||||
public function __construct(AbstractExpression $expr1, AbstractExpression $expr2, AbstractExpression $expr3, int $lineno)
|
||||
{
|
||||
trigger_deprecation('twig/twig', '3.16', \sprintf('"%s" is deprecated; use "%s" instead.', __CLASS__, ConditionalTernary::class));
|
||||
|
||||
parent::__construct(['expr1' => $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'];
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Twig.
|
||||
*
|
||||
* (c) Fabien Potencier
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Twig\Node\Expression;
|
||||
|
||||
use Twig\Compiler;
|
||||
use Twig\Node\EmptyNode;
|
||||
use Twig\Node\Expression\Binary\AndBinary;
|
||||
use Twig\Node\Expression\Binary\NullCoalesceBinary;
|
||||
use Twig\Node\Expression\Test\DefinedTest;
|
||||
use Twig\Node\Expression\Test\NullTest;
|
||||
use Twig\Node\Expression\Unary\NotUnary;
|
||||
use Twig\Node\Expression\Variable\ContextVariable;
|
||||
use Twig\TwigTest;
|
||||
|
||||
class NullCoalesceExpression extends ConditionalExpression
|
||||
{
|
||||
public function __construct(AbstractExpression $left, AbstractExpression $right, int $lineno)
|
||||
{
|
||||
trigger_deprecation('twig/twig', '3.16', \sprintf('"%s" is deprecated; use "%s" instead.', __CLASS__, NullCoalesceBinary::class));
|
||||
|
||||
$test = new DefinedTest(clone $left, new TwigTest('defined'), new EmptyNode(), $left->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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Twig\Tests\Node\Expression;
|
||||
|
||||
/*
|
||||
* This file is part of Twig.
|
||||
*
|
||||
* (c) Fabien Potencier
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
use Twig\Node\Expression\ConditionalExpression;
|
||||
use Twig\Node\Expression\ConstantExpression;
|
||||
use Twig\Test\NodeTestCase;
|
||||
|
||||
/**
|
||||
* @group legacy
|
||||
*/
|
||||
class ConditionalTest extends NodeTestCase
|
||||
{
|
||||
public function testConstructor()
|
||||
{
|
||||
$expr1 = new ConstantExpression(1, 1);
|
||||
$expr2 = new ConstantExpression(2, 1);
|
||||
$expr3 = new ConstantExpression(3, 1);
|
||||
$node = new ConditionalExpression($expr1, $expr2, $expr3, 1);
|
||||
|
||||
$this->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;
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Twig\Tests\Node\Expression;
|
||||
|
||||
/*
|
||||
* This file is part of Twig.
|
||||
*
|
||||
* (c) Fabien Potencier
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
use Twig\Node\Expression\ConstantExpression;
|
||||
use Twig\Node\Expression\NullCoalesceExpression;
|
||||
use Twig\Node\Expression\Variable\ContextVariable;
|
||||
use Twig\Test\NodeTestCase;
|
||||
|
||||
/**
|
||||
* @group legacy
|
||||
*/
|
||||
class NullCoalesceTest extends NodeTestCase
|
||||
{
|
||||
public static function provideTests(): iterable
|
||||
{
|
||||
$left = new ContextVariable('foo', 1);
|
||||
$right = new ConstantExpression(2, 1);
|
||||
$node = new NullCoalesceExpression($left, $right, 1);
|
||||
|
||||
return [[$node, "((// line 1\n\$context[\"foo\"]) ?? (2))"]];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user