mirror of
https://github.com/phabelio/PHP-Parser.git
synced 2024-12-15 10:26:55 +01:00
ac6f221c50
Previously the pretty printer added unnecessary and odd-looking parentheses when several operators with the same precedence were chained: 'a' . 'b' . 'c' . 'd' . 'e' // was printed as 'a' . ('b' . ('c' . ('d' . 'e'))) Another issue reported as part of #39 was that assignments inside closures were wrapped in parentheses: function() { $a = $b; } // was printed as function() { ($a = $b); } This was caused by the automatic precedence handling, which just regarded the closure as an ordinal nested expression. With the new system the $predenceMap of PrettyPrinterAbstract contains both precedence and associativity and there is a new method pPrec() which prints a node taking precedence and associativity into account. For simpler usage there are additional function pInfixOp(), pPrefixOp() and pPostfixOp(). Prints not going through pPrec() do not have any precedence handling (fixing the closure issue).
45 lines
1.4 KiB
Plaintext
45 lines
1.4 KiB
Plaintext
Pretty printer generates least-parentheses output
|
|
-----
|
|
<?php
|
|
|
|
echo 'abc' . 'cde' . 'fgh';
|
|
echo 'abc' . ('cde' . 'fgh');
|
|
|
|
echo 'abc' . 1 + 2 . 'fgh';
|
|
echo 'abc' . (1 + 2) . 'fgh';
|
|
|
|
echo 1 * 2 + 3 / 4 % 5 . 6;
|
|
echo 1 * (2 + 3) / (4 % (5 . 6));
|
|
|
|
$a = $b = $c = $d = $f && true;
|
|
($a = $b = $c = $d = $f) && true;
|
|
$a = $b = $c = $d = $f and true;
|
|
$a = $b = $c = $d = ($f and true);
|
|
|
|
$a ? $b : $c ? $d : $e ? $f : $g;
|
|
$a ? $b : ($c ? $d : ($e ? $f : $g));
|
|
$a ? $b ? $c : $d : $f;
|
|
|
|
(1 > 0) > (1 < 0);
|
|
|
|
// this will currently unnecessarily print !($a = $b). This is correct as far as operator precedence is concerned, but
|
|
// the parentheses are not really necessary, because = takes only variables as the left hand side operator.
|
|
!$a = $b;
|
|
-----
|
|
echo 'abc' . 'cde' . 'fgh';
|
|
echo 'abc' . ('cde' . 'fgh');
|
|
echo 'abc' . 1 + 2 . 'fgh';
|
|
echo 'abc' . (1 + 2) . 'fgh';
|
|
echo 1 * 2 + 3 / 4 % 5 . 6;
|
|
echo 1 * (2 + 3) / (4 % (5 . 6));
|
|
$a = $b = $c = $d = $f && true;
|
|
($a = $b = $c = $d = $f) && true;
|
|
$a = $b = $c = $d = $f and true;
|
|
$a = $b = $c = $d = ($f and true);
|
|
$a ? $b : $c ? $d : $e ? $f : $g;
|
|
$a ? $b : ($c ? $d : ($e ? $f : $g));
|
|
$a ? $b ? $c : $d : $f;
|
|
(1 > 0) > (1 < 0);
|
|
// this will currently unnecessarily print !($a = $b). This is correct as far as operator precedence is concerned, but
|
|
// the parentheses are not really necessary, because = takes only variables as the left hand side operator.
|
|
!($a = $b); |