From bf24f136b95af154a47a00477b8e1ae22e0abceb Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Fri, 5 Jun 2020 15:54:17 +0200 Subject: [PATCH] Fix the compilation of Twig comparison operators The new compilation implemented in Twig 3 for PHP 7 (to match the comparison semantic of PHP 8) was missing the surrounding braces (which are part of the AsbtractBinary compilation). This caused issues when the full expression would involve other operators (like the not operator), as things would then rely on having the correct precedence in PHP (which would not be the case). --- src/Node/Expression/Binary/EqualBinary.php | 4 ++-- src/Node/Expression/Binary/GreaterBinary.php | 4 ++-- src/Node/Expression/Binary/GreaterEqualBinary.php | 4 ++-- src/Node/Expression/Binary/LessBinary.php | 4 ++-- src/Node/Expression/Binary/LessEqualBinary.php | 4 ++-- src/Node/Expression/Binary/NotEqualBinary.php | 4 ++-- .../expressions/comparison_precedence.test | 14 ++++++++++++++ 7 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 tests/Fixtures/expressions/comparison_precedence.test diff --git a/src/Node/Expression/Binary/EqualBinary.php b/src/Node/Expression/Binary/EqualBinary.php index 80ca26447..6b48549ef 100644 --- a/src/Node/Expression/Binary/EqualBinary.php +++ b/src/Node/Expression/Binary/EqualBinary.php @@ -24,11 +24,11 @@ class EqualBinary extends AbstractBinary } $compiler - ->raw('0 === twig_compare(') + ->raw('(0 === twig_compare(') ->subcompile($this->getNode('left')) ->raw(', ') ->subcompile($this->getNode('right')) - ->raw(')') + ->raw('))') ; } diff --git a/src/Node/Expression/Binary/GreaterBinary.php b/src/Node/Expression/Binary/GreaterBinary.php index f1af1275b..e1dd06780 100644 --- a/src/Node/Expression/Binary/GreaterBinary.php +++ b/src/Node/Expression/Binary/GreaterBinary.php @@ -24,11 +24,11 @@ class GreaterBinary extends AbstractBinary } $compiler - ->raw('1 === twig_compare(') + ->raw('(1 === twig_compare(') ->subcompile($this->getNode('left')) ->raw(', ') ->subcompile($this->getNode('right')) - ->raw(')') + ->raw('))') ; } diff --git a/src/Node/Expression/Binary/GreaterEqualBinary.php b/src/Node/Expression/Binary/GreaterEqualBinary.php index 7d206f7c8..df9bfcfbf 100644 --- a/src/Node/Expression/Binary/GreaterEqualBinary.php +++ b/src/Node/Expression/Binary/GreaterEqualBinary.php @@ -24,11 +24,11 @@ class GreaterEqualBinary extends AbstractBinary } $compiler - ->raw('0 <= twig_compare(') + ->raw('(0 <= twig_compare(') ->subcompile($this->getNode('left')) ->raw(', ') ->subcompile($this->getNode('right')) - ->raw(')') + ->raw('))') ; } diff --git a/src/Node/Expression/Binary/LessBinary.php b/src/Node/Expression/Binary/LessBinary.php index e85193324..598e62913 100644 --- a/src/Node/Expression/Binary/LessBinary.php +++ b/src/Node/Expression/Binary/LessBinary.php @@ -24,11 +24,11 @@ class LessBinary extends AbstractBinary } $compiler - ->raw('-1 === twig_compare(') + ->raw('(-1 === twig_compare(') ->subcompile($this->getNode('left')) ->raw(', ') ->subcompile($this->getNode('right')) - ->raw(')') + ->raw('))') ; } diff --git a/src/Node/Expression/Binary/LessEqualBinary.php b/src/Node/Expression/Binary/LessEqualBinary.php index dccaf31aa..e3c4af58d 100644 --- a/src/Node/Expression/Binary/LessEqualBinary.php +++ b/src/Node/Expression/Binary/LessEqualBinary.php @@ -24,11 +24,11 @@ class LessEqualBinary extends AbstractBinary } $compiler - ->raw('0 >= twig_compare(') + ->raw('(0 >= twig_compare(') ->subcompile($this->getNode('left')) ->raw(', ') ->subcompile($this->getNode('right')) - ->raw(')') + ->raw('))') ; } diff --git a/src/Node/Expression/Binary/NotEqualBinary.php b/src/Node/Expression/Binary/NotEqualBinary.php index 04eb54605..db47a2890 100644 --- a/src/Node/Expression/Binary/NotEqualBinary.php +++ b/src/Node/Expression/Binary/NotEqualBinary.php @@ -24,11 +24,11 @@ class NotEqualBinary extends AbstractBinary } $compiler - ->raw('0 !== twig_compare(') + ->raw('(0 !== twig_compare(') ->subcompile($this->getNode('left')) ->raw(', ') ->subcompile($this->getNode('right')) - ->raw(')') + ->raw('))') ; } diff --git a/tests/Fixtures/expressions/comparison_precedence.test b/tests/Fixtures/expressions/comparison_precedence.test new file mode 100644 index 000000000..db20a6ec9 --- /dev/null +++ b/tests/Fixtures/expressions/comparison_precedence.test @@ -0,0 +1,14 @@ +--TEST-- +Twig comparison operators precendence +--TEMPLATE-- +{{ not(1 > 2) }}/{{ not(1 > 1) }}/{{ not(1 >= 2) }}/{{ not(1 >= 1) }} +{{ not(1 < 2) }}/{{ not(1 < 1) }}/{{ not(1 <= 2) }}/{{ not(1 <= 1) }} +{{ not(1 == 1) }}/{{ not(1 == 2) }} +{{ not(1 != 1) }}/{{ not(1 != 2) }} +--DATA-- +return [] +--EXPECT-- +1/1/1/ +/1// +/1 +1/