From 0f1d7477236c63435e3a60684b7ba0f6c3c6d28f Mon Sep 17 00:00:00 2001 From: Andrew Welch Date: Tue, 18 Dec 2018 21:39:42 -0500 Subject: [PATCH 1/5] Add ??? Empty Coalesce Operator Signed-off-by: Andrew Welch --- lib/Twig/Extension/Core.php | 1 + lib/Twig/Node/Expression/EmptyCoalesce.php | 51 +++++++++++++++++++ .../Expression/EmptyCoalesceExpression.php | 25 +++++++++ .../Node/Expression/EmptyCoalesceTest.php | 28 ++++++++++ 4 files changed, 105 insertions(+) create mode 100644 lib/Twig/Node/Expression/EmptyCoalesce.php create mode 100644 src/Node/Expression/EmptyCoalesceExpression.php create mode 100644 test/Twig/Tests/Node/Expression/EmptyCoalesceTest.php diff --git a/lib/Twig/Extension/Core.php b/lib/Twig/Extension/Core.php index ffec15e0014..55bd134f12b 100644 --- a/lib/Twig/Extension/Core.php +++ b/lib/Twig/Extension/Core.php @@ -251,6 +251,7 @@ public function getOperators() 'is not' => array('precedence' => 100, 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), '**' => array('precedence' => 200, 'class' => 'Twig_Node_Expression_Binary_Power', 'associativity' => Twig_ExpressionParser::OPERATOR_RIGHT), '??' => array('precedence' => 300, 'class' => 'Twig_Node_Expression_NullCoalesce', 'associativity' => Twig_ExpressionParser::OPERATOR_RIGHT), + '???' => array('precedence' => 300, 'class' => 'Twig_Node_Expression_EmptyCoalesce', 'associativity' => Twig_ExpressionParser::OPERATOR_RIGHT), ), ); } diff --git a/lib/Twig/Node/Expression/EmptyCoalesce.php b/lib/Twig/Node/Expression/EmptyCoalesce.php new file mode 100644 index 00000000000..26646c1841d --- /dev/null +++ b/lib/Twig/Node/Expression/EmptyCoalesce.php @@ -0,0 +1,51 @@ +setAttribute('ignore_strict_check', true); + $left->setAttribute('is_defined_test', false); + $right->setAttribute('ignore_strict_check', true); + $right->setAttribute('is_defined_test', false); + parent::__construct( + ['left' => $left, 'right' => $right], + ['ignore_strict_check' => true, 'is_defined_test' => false], + $lineno + ); + } + + public function compile(\Twig_Compiler $compiler) + { + //$this->getNode('expr1')->setAttribute('always_defined', true); + $compiler + ->raw('((empty(') + ->subcompile($this->getNode('left')) + ->raw(') ? null : ') + ->subcompile($this->getNode('left')) + ->raw(') ?? (empty(') + ->subcompile($this->getNode('right')) + ->raw(') ? null : ') + ->subcompile($this->getNode('right')) + ->raw('))') + ; + } +} + +class_alias('Twig_Node_Expression_EmptyCoalesce', 'nystudio107\emptycoalesce\Node\Expression\EmptyCoalesceExpression', false); diff --git a/src/Node/Expression/EmptyCoalesceExpression.php b/src/Node/Expression/EmptyCoalesceExpression.php new file mode 100644 index 00000000000..a6db77a4fd8 --- /dev/null +++ b/src/Node/Expression/EmptyCoalesceExpression.php @@ -0,0 +1,25 @@ + Date: Tue, 18 Dec 2018 21:47:57 -0500 Subject: [PATCH 2/5] Add ??? Empty Coalesce Operator Signed-off-by: Andrew Welch --- lib/Twig/Node/Expression/EmptyCoalesce.php | 21 +++++++------------ .../Expression/EmptyCoalesceExpression.php | 16 +------------- .../Node/Expression/EmptyCoalesceTest.php | 18 ++++++---------- 3 files changed, 14 insertions(+), 41 deletions(-) diff --git a/lib/Twig/Node/Expression/EmptyCoalesce.php b/lib/Twig/Node/Expression/EmptyCoalesce.php index 26646c1841d..dd47994752a 100644 --- a/lib/Twig/Node/Expression/EmptyCoalesce.php +++ b/lib/Twig/Node/Expression/EmptyCoalesce.php @@ -1,20 +1,14 @@ getNode('expr1')->setAttribute('always_defined', true); $compiler ->raw('((empty(') ->subcompile($this->getNode('left')) @@ -48,4 +41,4 @@ public function compile(\Twig_Compiler $compiler) } } -class_alias('Twig_Node_Expression_EmptyCoalesce', 'nystudio107\emptycoalesce\Node\Expression\EmptyCoalesceExpression', false); +class_alias('Twig_Node_Expression_EmptyCoalesce', 'Twig\Node\Expression\EmptyCoalesceExpression', false); diff --git a/src/Node/Expression/EmptyCoalesceExpression.php b/src/Node/Expression/EmptyCoalesceExpression.php index a6db77a4fd8..33361b43ee9 100644 --- a/src/Node/Expression/EmptyCoalesceExpression.php +++ b/src/Node/Expression/EmptyCoalesceExpression.php @@ -1,21 +1,7 @@ Date: Tue, 18 Dec 2018 22:09:42 -0500 Subject: [PATCH 3/5] Fix test Signed-off-by: Andrew Welch --- test/Twig/Tests/Node/Expression/EmptyCoalesceTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Twig/Tests/Node/Expression/EmptyCoalesceTest.php b/test/Twig/Tests/Node/Expression/EmptyCoalesceTest.php index 1b8c6d16dac..e15ca600e16 100644 --- a/test/Twig/Tests/Node/Expression/EmptyCoalesceTest.php +++ b/test/Twig/Tests/Node/Expression/EmptyCoalesceTest.php @@ -17,6 +17,6 @@ public function getTests() $right = new Twig_Node_Expression_Constant(2, 1); $node = new Twig_Node_Expression_EmptyCoalesce($left, $right, 1); - return array(array($node, "((// line 1\n\((empty((\$context[\"foo\"] ?? null)) ? null : (\$context[\"foo\"] ?? null)) ?? (empty(2) ? null : 2))")); + return array(array($node, "((empty(// line 1\n(\$context[\"foo\"] ?? null)) ? null : (\$context[\"foo\"] ?? null)) ?? (empty(2) ? null : 2))")); } } From 2d746926a3cc2b870275b0cba4e36bcaf42dc6a9 Mon Sep 17 00:00:00 2001 From: Andrew Welch Date: Mon, 29 Apr 2019 23:18:15 -0400 Subject: [PATCH 4/5] =?UTF-8?q?Use=20twig=5Ftest=5Fempty()=20instead=20of?= =?UTF-8?q?=20PHP=E2=80=99s=20empty(),=20updated=20namespacing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Andrew Welch --- lib/Twig/Node/Expression/EmptyCoalesce.php | 34 ++------- .../Expression/EmptyCoalesceExpression.php | 69 ++++++++++++++++++- .../Node/Expression/EmptyCoalesceTest.php | 15 ++-- 3 files changed, 82 insertions(+), 36 deletions(-) diff --git a/lib/Twig/Node/Expression/EmptyCoalesce.php b/lib/Twig/Node/Expression/EmptyCoalesce.php index dd47994752a..2b3cb0d1163 100644 --- a/lib/Twig/Node/Expression/EmptyCoalesce.php +++ b/lib/Twig/Node/Expression/EmptyCoalesce.php @@ -9,36 +9,14 @@ * file that was distributed with this source code. */ -class Twig_Node_Expression_EmptyCoalesce extends \Twig_Node_Expression -{ +use Twig\Node\Expression\EmptyCoalesceExpression; - public function __construct(Twig_Node $left, Twig_Node $right, $lineno) - { - $left->setAttribute('ignore_strict_check', true); - $left->setAttribute('is_defined_test', false); - $right->setAttribute('ignore_strict_check', true); - $right->setAttribute('is_defined_test', false); - parent::__construct( - ['left' => $left, 'right' => $right], - ['ignore_strict_check' => true, 'is_defined_test' => false], - $lineno - ); - } +@trigger_error(sprintf('Using the "Twig_Node_Expression_EmptyCoalesce" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\EmptyCoalesceExpression" instead.'), E_USER_DEPRECATED); - public function compile(\Twig_Compiler $compiler) +class_exists('Twig\Node\Expression\EmptyCoalesceExpression'); + +if (\false) { + class Twig_Node_Expression_EmptyCoalesce extends EmptyCoalesceExpression { - $compiler - ->raw('((empty(') - ->subcompile($this->getNode('left')) - ->raw(') ? null : ') - ->subcompile($this->getNode('left')) - ->raw(') ?? (empty(') - ->subcompile($this->getNode('right')) - ->raw(') ? null : ') - ->subcompile($this->getNode('right')) - ->raw('))') - ; } } - -class_alias('Twig_Node_Expression_EmptyCoalesce', 'Twig\Node\Expression\EmptyCoalesceExpression', false); diff --git a/src/Node/Expression/EmptyCoalesceExpression.php b/src/Node/Expression/EmptyCoalesceExpression.php index 33361b43ee9..7ac872701dd 100644 --- a/src/Node/Expression/EmptyCoalesceExpression.php +++ b/src/Node/Expression/EmptyCoalesceExpression.php @@ -1,11 +1,74 @@ setAttribute('ignore_strict_check', true); + $left->setAttribute('is_defined_test', false); + $right->setAttribute('ignore_strict_check', true); + $right->setAttribute('is_defined_test', false); + parent::__construct( + ['left' => $left, 'right' => $right], + ['ignore_strict_check' => true, 'is_defined_test' => false], + $lineno + ); + } + + public function compile(Compiler $compiler) + { + //$this->getNode('expr1')->setAttribute('always_defined', true); + $compiler + ->raw('(('.self::class.'::empty(') + ->subcompile($this->getNode('left')) + ->raw(') ? null : ') + ->subcompile($this->getNode('left')) + ->raw(') ?? ('.self::class.'::empty(') + ->subcompile($this->getNode('right')) + ->raw(') ? null : ') + ->subcompile($this->getNode('right')) + ->raw('))') + ; } } + +class_alias('Twig\Node\Expression\EmptyCoalesceExpression', 'Twig_Node_Expression_EmptyCoalesce'); diff --git a/test/Twig/Tests/Node/Expression/EmptyCoalesceTest.php b/test/Twig/Tests/Node/Expression/EmptyCoalesceTest.php index e15ca600e16..1227c45372d 100644 --- a/test/Twig/Tests/Node/Expression/EmptyCoalesceTest.php +++ b/test/Twig/Tests/Node/Expression/EmptyCoalesceTest.php @@ -9,14 +9,19 @@ * file that was distributed with this source code. */ -class Twig_Tests_Node_Expression_EmptyCoalesceTest extends Twig_Test_NodeTestCase +use Twig\Node\Expression\ConstantExpression; +use Twig\Node\Expression\EmptyCoalesceExpression; +use Twig\Node\Expression\NameExpression; +use Twig\Test\NodeTestCase; + +class Twig_Tests_Node_Expression_EmptyCoalesceTest extends NodeTestCase { public function getTests() { - $left = new Twig_Node_Expression_Name('foo', 1); - $right = new Twig_Node_Expression_Constant(2, 1); - $node = new Twig_Node_Expression_EmptyCoalesce($left, $right, 1); + $left = new NameExpression('foo', 1); + $right = new ConstantExpression(2, 1); + $node = new EmptyCoalesceExpression($left, $right, 1); - return array(array($node, "((empty(// line 1\n(\$context[\"foo\"] ?? null)) ? null : (\$context[\"foo\"] ?? null)) ?? (empty(2) ? null : 2))")); + return array(array($node, "((".EmptyCoalesceExpression::class."::empty(// line 1\n(\$context[\"foo\"] ?? null)) ? null : (\$context[\"foo\"] ?? null)) ?? (".EmptyCoalesceExpression::class."::empty(2) ? null : 2))")); } } From 2e08267966acc3853ba94a4695cffd06514a2ccf Mon Sep 17 00:00:00 2001 From: Andrew Welch Date: Thu, 23 May 2019 08:25:59 -0400 Subject: [PATCH 5/5] Remove pointless Twig_Node_Expression_EmptyCoalesce class Signed-off-by: Andrew Welch --- lib/Twig/Node/Expression/EmptyCoalesce.php | 22 ------------------- .../Expression/EmptyCoalesceExpression.php | 2 -- 2 files changed, 24 deletions(-) delete mode 100644 lib/Twig/Node/Expression/EmptyCoalesce.php diff --git a/lib/Twig/Node/Expression/EmptyCoalesce.php b/lib/Twig/Node/Expression/EmptyCoalesce.php deleted file mode 100644 index 2b3cb0d1163..00000000000 --- a/lib/Twig/Node/Expression/EmptyCoalesce.php +++ /dev/null @@ -1,22 +0,0 @@ -