1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804 |
- <?php
- declare(strict_types=1);
- /*
- * This file is part of PHP CS Fixer.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- * Dariusz Rumiński <dariusz.ruminski@gmail.com>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
- namespace PhpCsFixer\Tests\Fixer\ControlStructure;
- use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
- /**
- * @author Sullivan Senechal <soullivaneuh@gmail.com>
- * @author Gregor Harlan <gharlan@web.de>
- *
- * @internal
- *
- * @covers \PhpCsFixer\Fixer\ControlStructure\NoUnneededControlParenthesesFixer
- */
- final class NoUnneededControlParenthesesFixerTest extends AbstractFixerTestCase
- {
- /**
- * @dataProvider provideFixCases
- */
- public function testFix(string $expected, ?string $input = null): void
- {
- $this->fixer->configure(
- [
- 'statements' => [
- 'break',
- 'clone',
- 'continue',
- 'echo_print',
- 'return',
- 'switch_case',
- 'yield',
- 'yield_from',
- 'others',
- ],
- ],
- );
- $this->doTest($expected, $input);
- }
- public static function provideFixCases(): iterable
- {
- yield [
- '<?php while ($x) { while ($y) { break 2; } }',
- '<?php while ($x) { while ($y) { break (2); } }',
- ];
- yield [
- '<?php while ($x) { while ($y) { break 2; } }',
- '<?php while ($x) { while ($y) { break(2); } }',
- ];
- yield [
- '<?php while ($x) { while ($y) { continue 2; } }',
- '<?php while ($x) { while ($y) { continue (2); } }',
- ];
- yield [
- '<?php while ($x) { while ($y) { continue 2; } }',
- '<?php while ($x) { while ($y) { continue(2); } }',
- ];
- yield [
- '<?php
- $var = clone ($obj1 ?: $obj2);
- $var = clone ($obj1 ? $obj1->getSubject() : $obj2);
- ',
- ];
- yield [
- '<?php clone $object;',
- '<?php clone ($object);',
- ];
- yield [
- '<?php clone new Foo();',
- '<?php clone (new Foo());',
- ];
- yield [
- '<?php
- foo(clone $a);
- foo(clone $a, 1);
- $a = $b ? clone $b : $c;
- ',
- '<?php
- foo(clone($a));
- foo(clone($a), 1);
- $a = $b ? clone($b) : $c;
- ',
- ];
- yield [
- '<?php
- echo (1 + 2) . $foo;
- print (1 + 2) . $foo;
- ',
- ];
- yield [
- '<?php echo (1 + 2) * 10, "\n";',
- ];
- yield [
- '<?php echo (1 + 2) * 10, "\n" ?>',
- ];
- yield [
- '<?php echo "foo" ?>',
- '<?php echo ("foo") ?>',
- ];
- yield [
- '<?php print "foo" ?>',
- '<?php print ("foo") ?>',
- ];
- yield [
- '<?php echo "foo2"; print "foo";',
- '<?php echo ("foo2"); print ("foo");',
- ];
- yield [
- '<?php echo "foo"; print "foo1";',
- '<?php echo("foo"); print("foo1");',
- ];
- yield [
- '<?php echo 2; print 2;',
- '<?php echo(2); print(2);',
- ];
- yield [
- '<?php
- echo $a ? $b : $c;
- echo ($a ? $b : $c) ? $d : $e;
- echo 10 * (2 + 3);
- echo ("foo"), ("bar");
- echo my_awesome_function("foo");
- echo $this->getOutput(1);
- ',
- '<?php
- echo ($a ? $b : $c);
- echo ($a ? $b : $c) ? $d : $e;
- echo 10 * (2 + 3);
- echo ("foo"), ("bar");
- echo my_awesome_function("foo");
- echo $this->getOutput(1);
- ',
- ];
- yield [
- '<?php return (1 + 2) * 10;',
- '<?php return ((1 + 2) * 10);',
- ];
- yield [
- '<?php return "prod";',
- '<?php return ("prod");',
- ];
- yield [
- '<?php return $x;',
- '<?php return($x);',
- ];
- yield [
- '<?php return 2;',
- '<?php return(2);',
- ];
- yield [
- '<?php return 2?>',
- '<?php return(2)?>',
- ];
- yield [
- '<?php
- switch ($a) {
- case "prod":
- break;
- }
- ',
- ];
- yield [
- '<?php
- switch ($a) {
- case "prod":
- break;
- }
- ',
- '<?php
- switch ($a) {
- case ("prod"):
- break;
- }
- ',
- 'switch_case',
- ];
- yield [
- '<?php
- switch ($a) {
- case $x;
- }
- ',
- '<?php
- switch ($a) {
- case($x);
- }
- ',
- ];
- yield [
- '<?php
- switch ($a) {
- case 2;
- }
- ',
- '<?php
- switch ($a) {
- case(2);
- }
- ',
- ];
- yield [
- '<?php
- $a = 5.1;
- $b = 1.0;
- switch($a) {
- case (int) $a < 1 : {
- echo "leave alone";
- break;
- }
- case $a < 2/* test */: {
- echo "fix 1";
- break;
- }
- case 3 : {
- echo "fix 2";
- break;
- }
- case /**//**/ // test
- 4
- /**///
- /**/: {
- echo "fix 3";
- break;
- }
- case ((int)$b) + 4.1: {
- echo "fix 4";
- break;
- }
- case ($b + 1) * 2: {
- echo "leave alone";
- break;
- }
- }
- ',
- '<?php
- $a = 5.1;
- $b = 1.0;
- switch($a) {
- case (int) $a < 1 : {
- echo "leave alone";
- break;
- }
- case ($a < 2)/* test */: {
- echo "fix 1";
- break;
- }
- case (3) : {
- echo "fix 2";
- break;
- }
- case /**/(/**/ // test
- 4
- /**/)//
- /**/: {
- echo "fix 3";
- break;
- }
- case (((int)$b) + 4.1): {
- echo "fix 4";
- break;
- }
- case ($b + 1) * 2: {
- echo "leave alone";
- break;
- }
- }
- ',
- 'switch_case',
- ];
- yield [
- '<?php while ($x) { while ($y) { break#
- #
- 2#
- #
- ; } }',
- '<?php while ($x) { while ($y) { break#
- (#
- 2#
- )#
- ; } }',
- ];
- yield [
- '<?php
- function foo() { yield "prod"; }
- ',
- ];
- yield [
- '<?php
- function foo() { yield (1 + 2) * 10; }
- ',
- ];
- yield [
- '<?php
- function foo() { yield (1 + 2) * 10; }
- ',
- '<?php
- function foo() { yield ((1 + 2) * 10); }
- ',
- ];
- yield [
- '<?php
- function foo() { yield "prod"; }
- ',
- '<?php
- function foo() { yield ("prod"); }
- ',
- ];
- yield [
- '<?php
- function foo() { yield 2; }
- ',
- '<?php
- function foo() { yield(2); }
- ',
- ];
- yield [
- '<?php
- function foo() { $a = (yield $x); }
- ',
- '<?php
- function foo() { $a = (yield($x)); }
- ',
- ];
- yield [
- '<?php
- $var = clone ($obj1->getSubject() ?? $obj2);
- ',
- ];
- }
- /**
- * @dataProvider provideFixAllCases
- */
- public function testFixAll(string $expected, ?string $input = null): void
- {
- $this->fixer->configure(
- [
- 'statements' => [
- 'break',
- 'clone',
- 'continue',
- 'echo_print',
- 'return',
- 'switch_case',
- 'yield',
- 'yield_from',
- 'others',
- 'negative_instanceof',
- ],
- ],
- );
- $this->doTest($expected, $input);
- }
- public static function provideFixAllCases(): iterable
- {
- yield '===' => [
- '<?php $at = $a === $b;',
- '<?php $at = ($a) === ($b);',
- ];
- yield 'yield/from fun' => [
- '<?php
- function foo3() { $a = (yield $x); }
- function foo4() { yield from (1 + 2) * 10; }
- function foo5() { yield from "prod"; }
- function foo6() { $a = (yield $x); }
- function foo7() { yield from 2; }
- function foo8() { $a = (yield from $x); }
- ',
- '<?php
- function foo3() { $a = (yield $x); }
- function foo4() { yield from ((1 + 2) * 10); }
- function foo5() { yield from ("prod"); }
- function foo6() { $a = (yield($x)); }
- function foo7() { yield from(2); }
- function foo8() { $a = (yield from($x)); }
- ',
- ];
- yield 'clone stuff' => [
- '<?php
- clone new $f[0];
- $a1 = clone new foo;
- $a2 = clone new foo();
- $a3 = [clone $f];
- $a4 = [1, clone $f];
- $a5 = [clone $f, 2];
- $a6 = [1, clone $f, 2];
- $c1 = fn() => clone $z;
- for ( clone new Bar(1+2) ; $i < 100; ++$i) {
- $i = foo();
- }
- clone $object2[0]->foo()[2] /* 1 */ ?>',
- '<?php
- clone (new $f[0]);
- $a1 = clone (new foo);
- $a2 = clone (new foo());
- $a3 = [clone ($f)];
- $a4 = [1, clone ($f)];
- $a5 = [clone ($f), 2];
- $a6 = [1, clone ($f), 2];
- $c1 = fn() => clone ($z);
- for ( clone(new Bar(1+2) ); $i < 100; ++$i) {
- $i = foo();
- }
- clone ($object2[0]->foo()[2]) /* 1 */ ?>',
- ];
- yield 'print unary wrapped sequence' => [
- '<?php $b7 =[ print !$a ,];',
- '<?php $b7 =[ print !($a) ,];',
- ];
- yield 'print - sequence' => [
- '<?php
- $b7 =[ print $a, 1];
- $b7 =[1, print $a];
- ',
- '<?php
- $b7 =[ print ($a), 1];
- $b7 =[1, print ($a)];
- ',
- ];
- yield 'print - wrapped block' => [
- '<?php $b7 =[ print $a ];',
- '<?php $b7 =[ print ($a) ];',
- ];
- yield 'print fun' => [
- '<?php
- for ( print $b+1; foo(); ++$i ) {}
- for( print $b+1; foo(); ++$i ) {}
- $b1 = $c[print $e+5];
- $b2 = [1, print $e++];
- $b3 = [print $e+9, 1];
- $b4 = [1, 1 + print $e, 1];
- $b51 = fn() => print $b."something";
- $b52 = fn() => print $b."else";
- $b6 = foo(print $a);
- $b7 =[ print $a ,];
- $b8 =[ print ($a+1) . "1" ,];
- ',
- '<?php
- for ( (print $b+1); foo(); ++$i ) {}
- for( print ($b+1); foo(); ++$i ) {}
- $b1 = $c[(print $e+5)];
- $b2 = [1, (print $e++)];
- $b3 = [(print $e+9), 1];
- $b4 = [1, (1 + print $e), 1];
- $b51 = fn() => (print $b."something");
- $b52 = fn() => print ($b."else");
- $b6 = foo(print ($a));
- $b7 =[ (print ($a)) ,];
- $b8 =[ (print ($a+1) . "1") ,];
- ',
- ];
- yield 'simple' => [
- '<?php $aw?><?php $av;',
- '<?php ($aw)?><?php ($av);',
- ];
- yield 'simple, echo open tag' => [
- '<?= $a;',
- '<?= ($a);',
- ];
- yield '+ (X),' => [
- '<?php $bw = [1 + !!$a, 2 + $b,];',
- '<?php $bw = [1 + !!($a), 2 + ($b),];',
- ];
- yield 'op ns' => [
- '<?php $aq = A\B::c . $d;',
- '<?php $aq = (A\B::c) . $d;',
- ];
- yield 'wrapped FN' => [
- '<?php $fn1 = fn($x) => $x + $y;',
- '<?php $fn1 = fn($x) => ($x + $y);',
- ];
- yield 'wrapped FN 2 with pre and reference' => [
- '<?php $fn1 = fn & ($x) => !$x;',
- '<?php $fn1 = fn & ($x) => !($x);',
- ];
- yield 'wrapped FN with `,`' => [
- '<?php
- $fn1 = array_map(fn() => 1, $array);
- $fn2 = array_map($array, fn() => 2);
- $fn3 = array_map($array, fn() => 3, $array);
- ',
- '<?php
- $fn1 = array_map(fn() => (1), $array);
- $fn2 = array_map($array, fn() => (2));
- $fn3 = array_map($array, fn() => (3), $array);
- ',
- ];
- yield 'wrapped FN with return type' => [
- '<?php
- $fn8 = fn(): int => 123456;
- ',
- '<?php
- $fn8 = fn(): int => (123456);
- ',
- ];
- yield 'wrapped `for` elements' => [
- '<?php
- for (!$a; $a < 10; ++$a){
- echo $a;
- }
- ',
- '<?php
- for (!($a); ($a < 10); (++$a)){
- echo $a;
- }
- ',
- ];
- $statements = [
- 'echo',
- 'print',
- 'return',
- 'throw',
- 'yield from',
- 'yield',
- ];
- foreach ($statements as $statement) {
- yield $statement.', no op, space' => [
- '<?php function foo(){ '.$statement.' $e; }',
- '<?php function foo(){ '.$statement.' ($e); }',
- ];
- yield $statement.', wrapped op, no space' => [
- '<?php function foo(){;'.$statement.' $e.$f; }',
- '<?php function foo(){;'.$statement.'($e.$f); }',
- ];
- }
- yield 'yield wrapped unary' => [
- '<?php $a = function($a) {yield ++$a;};',
- '<?php $a = function($a) {yield (++$a);};',
- ];
- $constants = [
- '__CLASS__',
- '__DIR__',
- '__FILE__',
- '__FUNCTION__',
- '__LINE__',
- '__METHOD__',
- '__NAMESPACE__',
- '__TRAIT__',
- ];
- foreach ($constants as $constant) {
- yield $constant.'+ op' => [
- sprintf('<?php $a = %s . $b;', $constant),
- sprintf('<?php $a = (%s) . $b;', $constant),
- ];
- }
- yield 'break/continue' => [
- '<?php
- while(foo() && $f) {
- while(bar()) {
- if ($a) {
- break 2;
- } else {
- continue 2;
- }
- }
- }
- ',
- '<?php
- while((foo() && $f)) {
- while(bar()) {
- if ($a) {
- break (2);
- } else {
- continue (2);
- }
- }
- }
- ',
- ];
- yield 'switch case' => [
- '<?php switch($a) {
- case 1: echo 1;
- case !$a; echo 2;
- }',
- '<?php switch($a) {
- case(1): echo 1;
- case !($a); echo 2;
- }',
- ];
- yield 'switch case II' => [
- '<?php
- switch ($x) {
- case $a + 1 + 3:
- break;
- case 1 + $a + 4:
- break;
- }
- ',
- '<?php
- switch ($x) {
- case ($a) + 1 + 3:
- break;
- case 1 + ($a) + 4:
- break;
- }
- ',
- ];
- yield 'bin pre bin' => [
- '<?php $t = 1+ $i +1;',
- '<?php $t = 1+($i)+1;',
- ];
- yield 'bin, (X))' => [
- '<?php $ap = 1 + $a;',
- '<?php $ap = 1 + ($a);',
- ];
- yield 'bin close tag' => [
- '<?php $d + 2; ?>',
- '<?php ($d) + 2; ?>',
- ];
- yield 'bin after open echo' => [
- '<?= $d - 55;',
- '<?= ($d) - 55;',
- ];
- yield 'more bin + sequences combinations' => [
- '<?php
- $b1 = [1 + $d];
- $b2 = [1 + $d,];
- $b3 = [1,1 + $d + 1];
- $b4 = [1,1 + $d,];
- ',
- '<?php
- $b1 = [1 + ($d)];
- $b2 = [1 + ($d),];
- $b3 = [1,1 + ($d) + 1];
- $b4 = [1,1 + ($d),];
- ',
- ];
- yield 'bin doggybag' => [
- '<?php
- while(foo()[1]){bar();}
- $aR . "";
- $e = [$a] + $b;
- $f = [$a] + $b[1];
- $a = $b + !$c + $d;
- $b = !$a[1]++;
- $c = $c + !!!(bool) -$a;
- throw $b . "";
- ',
- '<?php
- while((foo())[1]){bar();}
- ($aR) . "";
- $e = [$a] + ($b);
- $f = [$a] + ($b)[1];
- $a = $b + !($c) + $d;
- $b = !($a)[1]++;
- $c = $c + !!!(bool) -($a);
- throw($b) . "";
- ',
- ];
- $statements = [
- 'while(foo()){echo 1;}',
- ';;;;',
- 'echo',
- 'print',
- 'return',
- 'throw',
- '',
- ];
- foreach ($statements as $statement) {
- yield $statement.' (X) bin' => [
- '<?php '.$statement.' $e . "foo";',
- '<?php '.$statement.' ($e) . "foo";',
- ];
- }
- yield 'bin after' => [
- '<?php
- $d * 5;
- ; $a - $b;
- while(foo() + 1 < 100){} $z - 6 ?>',
- '<?php
- ($d) * 5;
- ; ($a) - $b;
- while((foo()) + 1 < 100){} ($z) - 6 ?>',
- ];
- yield 'bin after throw/return' => [
- '<?php
- function foo() {
- if($b) {
- throw $e . "";
- }
- return ((string)$dd)[1] . "a";
- }',
- '<?php
- function foo() {
- if(($b)) {
- throw($e) . "";
- }
- return(((string)$dd)[1] . "a");
- }',
- ];
- yield 'multiple fixes' => [
- '<?php
- $a = [];
- $b = [1, []];
- foo();
- while(foo()){
- $a = foo2();
- }
- ',
- '<?php
- $a = ([]);
- $b = ([1,([])]);
- (foo());
- while(foo()){
- $a = (foo2());
- }
- ',
- ];
- yield 'access' => [
- '<?php
- $ag = $b->A::$foo;
- $a1 = $b->$c[1];
- $a2 = $b->c[1][2];
- $a3 = $b->$c[1]->$a[2]->${"abc"};
- $a4 = $b->$c[1][2]->${"abc"}(22);
- $a5 = $o->$foo();
- $o->$c[] = 6;
- $a7 = $o->$c[8] (7);
- $a9 = $o->abc($a);
- $a10 = $o->abc($a)[1];
- $a11 = $o->{$bar};
- $a12 = $o->{$c->d}($e)[1](2){$f}->$c[1]()?>
- ',
- '<?php
- $ag = (($b)->A::$foo);
- $a1 = (($b)->$c[1]);
- $a2 = (($b)->c[1][2]);
- $a3 = (($b)->$c[1]->$a[2]->${"abc"});
- $a4 = (($b)->$c[1][2]->${"abc"}(22));
- $a5 = (($o)->$foo());
- ($o)->$c[] = 6;
- $a7 = (($o)->$c[8] (7));
- $a9 = (($o)->abc($a));
- $a10 = (($o)->abc($a)[1]);
- $a11 = (($o)->{$bar});
- $a12 = (($o)->{$c->d}($e)[1](2){$f}->$c[1]())?>
- ',
- ];
- yield 'simple unary `!`' => [
- '<?php
- $a1 = !$foo;
- $a2 = +$f;
- $a3 = -$f;
- $a4 = @bar();
- ',
- '<?php
- $a1 = !($foo);
- $a2 = +($f);
- $a3 = -($f);
- $a4 = @(bar());
- ',
- ];
- yield 'pre op ! function call' => [
- '<?php $a9 = !foo($a + 1);',
- '<?php $a9 = !(foo($a + 1));',
- ];
- yield 'multiple pre in wrapped array init' => [
- '<?php $d7 = [!!!!!!!$a5];',
- '<?php $d7 = [!!!!!!!($a5)];',
- ];
- yield 'pre op cast' => [
- '<?php $a6 = (bool)$foo;',
- '<?php $a6 = (bool)($foo);',
- ];
- yield 'pre op ! wrapped' => [
- '<?php if (!$z) {echo 1;}',
- '<?php if ((!($z))) {echo 1;}',
- ];
- yield 'crazy unary' => [
- '<?php
- $b0 = !!!(bool) $a1;
- $b1 = [!!!(bool) $a2,1];
- !!!(bool) $a3;
- !!!(bool) $a4;
- $b = 1 + (!!!!!!!$a5);
- $a = !$a[1]++;
- while(!!!(bool) $a2[1] ){echo 1;}
- $b = @$a[1];
- $b = ++$a[1];
- ',
- '<?php
- $b0 = !!!(bool) ($a1);
- $b1 = [!!!(bool) ($a2),1];
- (!!!(bool) (($a3)));
- (!!!(bool) ($a4));
- $b = 1 + (!!!!!!!($a5));
- $a = !($a)[1]++;
- while(!!!(bool) ($a2)[1] ){echo 1;}
- $b = @($a)[1];
- $b = ++($a)[1];
- ',
- ];
- yield 'logic &&' => [
- '<?php $arr = $a && $b;',
- '<?php $arr = ($a) && $b;',
- ];
- yield 'bin before' => [
- '<?php
- $ax = $d + $a;
- $dx = 1 + $z ?>',
- '<?php
- $ax = $d + ($a);
- $dx = 1 + ($z) ?>',
- ];
- yield 'bin before and after' => [
- '<?php
- echo 1 + 2 + 3;
- echo 1.5 + 2.5 + 3.5;
- echo 1 + $obj->value + 3;
- echo 1 + Obj::VALUE + 3;
- ',
- '<?php
- echo 1 + (2) + 3;
- echo 1.5 + (2.5) + 3.5;
- echo 1 + ($obj->value) + 3;
- echo 1 + (Obj::VALUE) + 3;
- ',
- ];
- yield 'new class as sequence element' => [
- '<?php $a7 = [1, new class($a+$b) {}];',
- '<?php $a7 = [1, (new class($a+$b) {})];',
- ];
- yield 'pre @ sequence' => [
- '<?php $a8 = [1, @ ($f.$b)() ];',
- '<?php $a8 = [1, @( ($f.$b)() )];',
- ];
- yield 'inside `{` and `}`' => [
- '<?php
- while(foo()) { bar(); }
- while(bar()){foo1();};
- if($a){foo();}
- ',
- '<?php
- while(foo()) { (bar()); }
- while(bar()){(foo1());};
- if($a){(foo());}
- ',
- ];
- yield 'block type dynamic var brace' => [
- '<?php ${$bar};',
- '<?php ${($bar)};',
- ];
- yield 'block type dynamic prop brace' => [
- '<?php $foo->{$bar};',
- '<?php $foo->{($bar)};',
- ];
- yield 'anonymous class wrapped init' => [
- '<?php $a11 = new class(1){};',
- '<?php $a11 = new class((1)){};',
- ];
- yield 'return, new long array notation, no space' => [
- '<?php return array();',
- '<?php return(array());',
- ];
- yield 'block type array square brace' => [
- '<?php
- echo $a13 = [1];
- $bX = [1,];
- $b0 = [1, 2, 3,];
- $b1 = [$a + 1];
- $b2 = [-1 + $a];
- $b3 = [2 + $c];
- ',
- '<?php
- echo $a13 = [(1)];
- $bX = [(1),];
- $b0 = [(1),(2),(3),];
- $b1 = [($a) + 1];
- $b2 = [-1 + ($a)];
- $b3 = [2 + ($c)];
- ',
- ];
- yield 'multiple array construct elements' => [
- '<?php echo $a14 = [1, $a(1,$b(3)), 3+4]?>',
- '<?php echo $a14 = [(1),($a(1,$b(3))),(3+4)]?>',
- ];
- yield 'double comma and `)`' => [
- '<?php echo sprintf("%d%s", $e, $f);',
- '<?php echo sprintf("%d%s", ($e), ($f));',
- ];
- yield 'two wrapped function calls' => [
- '<?php foo(); $ap = foo();',
- '<?php (foo()); $ap = (foo());',
- ];
- yield 'wrapped function call, op + call as arg' => [
- '<?php $bk = foo(1 + bar()) ?>',
- '<?php $bk = (foo(1 + bar())) ?>',
- ];
- yield 'wrapped function call, short open, semicolon' => [
- '<?= foo1z() ?>',
- '<?=(foo1z()) ?>',
- ];
- yield 'wrapped function call, short open, close tag' => [
- '<?= foo2A();',
- '<?=( foo2A());',
- ];
- yield 'wrapped returns' => [
- '<?php function A($a) {return 1;}',
- '<?php function A($a) {return (1);}',
- ];
- yield 'wrapped returns ops' => [
- '<?php function A($a1,$b2) {return ++$a1+$b2;}',
- '<?php function A($a1,$b2) {return (++$a1+$b2);}',
- ];
- yield 'throws, no space' => [
- '<?php throw $z . 2;',
- '<?php throw($z . 2);',
- ];
- yield 'throws + op, wrapped in {}' => [
- '<?php if (k()) { throw new $a.$b(1,2); } ?>',
- '<?php if (k()) { throw (new $a.$b(1,2)); } ?>',
- ];
- yield 'dynamic class name op' => [
- '<?php $xX = ($d+$e)->test();',
- '<?php $xX = (($d+$e))->test();',
- ];
- yield 'token type changing edge case' => [
- '<?php $y1 = (new Foo())->bar;',
- '<?php $y1 = ((new Foo()))->bar;',
- ];
- yield 'brace class instantiation open, double wrapped, no assign' => [
- '<?php (new Foo())->bar();',
- '<?php (((new Foo())))->bar();',
- ];
- yield 'brace class instantiation open, multiple wrapped' => [
- '<?php $y0 = (new Foo())->bar;',
- '<?php $y0 = (((((new Foo())))))->bar;',
- ];
- yield 'wrapped instance check' => [
- '<?php
- ; $foo instanceof Foo;
- ; $foo() instanceof Foo;
- $l1 = $foo instanceof $z;
- $l2 = $foo instanceof $z[1];
- $l3 = [$foo instanceof $z->a[1]];
- $l4 = [1, $foo instanceof $a[1]->$f];
- $l5 = [$foo instanceof Foo, 1];
- $l6 = [1, $foo instanceof Foo, 1];
- $fn1 = fn($x) => $fx instanceof Foo;
- for ($foo instanceof Foo ; $i < 1; ++$i) { echo $i; }
- class foo {
- public function bar() {
- self instanceof static;
- self instanceof self;
- $a instanceof static;
- self instanceof $a;
- $a instanceof self;
- }
- }
- ',
- '<?php
- ; ($foo instanceof Foo);
- ; ($foo() instanceof Foo);
- $l1 = ($foo instanceof $z);
- $l2 = ($foo instanceof $z[1]);
- $l3 = [($foo instanceof $z->a[1])];
- $l4 = [1, ($foo instanceof $a[1]->$f)];
- $l5 = [($foo instanceof Foo), 1];
- $l6 = [1, ($foo instanceof Foo), 1];
- $fn1 = fn($x) => ($fx instanceof Foo);
- for (($foo instanceof Foo) ; $i < 1; ++$i) { echo $i; }
- class foo {
- public function bar() {
- (self instanceof static);
- (self instanceof self);
- ($a instanceof static);
- (self instanceof $a);
- ($a instanceof self);
- }
- }
- ',
- ];
- yield 'wrapped negative instanceof' => [
- '<?php
- !$z instanceof $z[1];
- $z2 = !$foo[1]->b(1)[2] instanceof A\Foo;
- $z3 = [!$z instanceof Foo\Bar::$a];
- $z4 = [1, !$z instanceof Foo\Bar::$a];
- $z5 = [!$z instanceof Foo\Bar::$a, 2];
- $z6 = [8, !$z instanceof Foo\Bar::$a, 2];
- for( !$z instanceof Foo\Bar::$a ; $a < 100; ++$a) {
- foo();
- }
- $c1 = fn() => !$z instanceof $z[1];
- if (!$x instanceof $v) {
- echo 123;
- }
- ',
- '<?php
- !($z instanceof $z[1]);
- $z2 = !($foo[1]->b(1)[2] instanceof A\Foo);
- $z3 = [!($z instanceof Foo\Bar::$a)];
- $z4 = [1, !($z instanceof Foo\Bar::$a)];
- $z5 = [!($z instanceof Foo\Bar::$a), 2];
- $z6 = [8, !($z instanceof Foo\Bar::$a), 2];
- for( !($z instanceof Foo\Bar::$a) ; $a < 100; ++$a) {
- foo();
- }
- $c1 = fn() => !($z instanceof $z[1]);
- if (!($x instanceof $v)) {
- echo 123;
- }
- ',
- ];
- yield 'wrapped negative instanceof 2' => [
- '<?php
- class foo {
- public function bar() {
- !self instanceof static;
- !self instanceof self;
- !$a instanceof static;
- !self instanceof $a;
- !$a instanceof self;
- }
- }',
- '<?php
- class foo {
- public function bar() {
- !(self instanceof static);
- !(self instanceof self);
- !($a instanceof static);
- !(self instanceof $a);
- !($a instanceof self);
- }
- }',
- ];
- yield '(x,y' => [
- '<?php $n = ["".foo(1+2),3];',
- '<?php $n = [("".foo(1+2)),3];',
- ];
- yield 'x,y) = ' => [
- '<?php $m = [$x, $y];',
- '<?php $m = [$x,($y)];',
- ];
- yield '(x,y,x)' => [
- '<?php $aj = [1, "".foo(1+2),3];',
- '<?php $aj = [1,("".foo(1+2)),3];',
- ];
- yield 'block type index square brace' => [
- '<?php $n = $foo[1];',
- '<?php $n = $foo[(1)];',
- ];
- yield 'multiple wrapped call' => [
- '<?php
- $u = $z($b);
- $a = bar/*1*/ ($a) /*2*/;',
- '<?php
- $u = $z(($b));
- $a = bar/*1*/ (((($a)))) /*2*/;',
- ];
- yield 'if' => [
- '<?php if ($z) {echo 1;}',
- '<?php if ((($z))) {echo 1;}',
- ];
- yield 'destructuring square brace + comments' => [
- '<?php
- [/*A*/$a/*B*/] = z();
- [/*A*/$a/*B*/, $c] = z();
- ',
- '<?php
- [/*A*/($a)/*B*/] = z();
- [/*A*/($a)/*B*/,($c)] = z();
- ',
- ];
- yield 'multiple fix cases' => [
- '<?php
- $aF=array(1);$a=array(1);$a=array(1);$a=array(1);
- $bF=array(1);$b=array(1);$b=array(1);$b=array(1);
- $cF=array(1);$c=array(1);$c=array(1);$c=array(1);
- ',
- '<?php
- $aF=array((1));$a=array((1));$a=array((1));$a=array((1));
- $bF=array((1));$b=array((1));$b=array((1));$b=array((1));
- $cF=array((1));$c=array((1));$c=array((1));$c=array((1));
- ',
- ];
- yield 'multiple fix cases with space inserts' => [
- '<?php $a=$b. 1 .$c;$a=$b. 1 .$c;$a=$b. 1 .$c;$a=$b. 1 .$c;$a=$b. 1 .$c;$a=$b./*1*/1/*2*/.$c;',
- '<?php $a=$b.(1).$c;$a=$b.(1).$c;$a=$b.(1).$c;$a=$b.(1).$c;$a=$b.(1).$c;$a=$b./*1*/(1)/*2*/.$c;',
- ];
- yield 'empty exit/die' => [
- '<?php exit; die;',
- '<?php exit(); die();',
- ];
- yield 'more space around concat handling' => [
- '<?php
- $s2 = "a". 0.1 . 2 . "b" . "c";
- $f = \'x\' . \'y\' . \'z\';
- ',
- '<?php
- $s2 = "a".(0.1). (2) . ("b") . "c";
- $f = \'x\' . ( \'y\' ) . \'z\';
- ',
- ];
- $assignOperators = [
- 'and equal' => '&=',
- 'coalesce_equal' => '??=',
- 'concat_equal' => '.=',
- 'div equal' => '*=',
- 'minus equal' => '!=',
- 'mod equal' => '+=',
- 'mul equal' => '*=',
- 'or equal' => '+=',
- 'plus equal' => '+=',
- 'pow equal' => '**=',
- 'sl equal' => '<<=',
- 'sr equal' => '>>=',
- 'xor equal' => '^=',
- ];
- foreach ($assignOperators as $assignOperator) {
- yield [
- '<?php $a '.$assignOperator.' $x;',
- '<?php $a '.$assignOperator.' ($x);',
- ];
- }
- yield 'after `}`' => [
- '<?php
- while(foo()){} ++$i;
- for(;;){}++$i;
- foreach ($a as $b){}++$i;
- if (foo()) {}++$i;
- if (foo()) {} else {}++$i;
- if (foo()) {} elseif(bar()) {}++$i;
- switch(foo()){case 1: echo 1;}++$i;
- switch (foo()){
- case 1: {}++$i; break;
- }
- function Bar(): array {
- $i++;
- return [];
- }
- function Foo1(){}++$i;
- function & Foo2(){}++$i;
- class A{}++$i;
- class A1 extends BD{}++$i;
- class A2 extends BD implements CE{}++$i;
- class A3 extends BD implements CE,DE{}++$i;
- interface B{}++$i;
- interface B1 extends A{}++$i;
- interface B2 extends A,B{}++$i;
- trait X{}++$i;
- try{}catch(E $e){}$i++;
- try {} finally {}++$i;
- ',
- '<?php
- while(foo()){} (++$i);
- for(;;){}(++$i);
- foreach ($a as $b){}(++$i);
- if (foo()) {}(++$i);
- if (foo()) {} else {}(++$i);
- if (foo()) {} elseif(bar()) {}(++$i);
- switch(foo()){case 1: echo 1;}(++$i);
- switch (foo()){
- case 1: {}(++$i); break;
- }
- function Bar(): array {
- ($i++);
- return [];
- }
- function Foo1(){}(++$i);
- function & Foo2(){}(++$i);
- class A{}(++$i);
- class A1 extends BD{}(++$i);
- class A2 extends BD implements CE{}(++$i);
- class A3 extends BD implements CE,DE{}(++$i);
- interface B{}(++$i);
- interface B1 extends A{}(++$i);
- interface B2 extends A,B{}(++$i);
- trait X{}(++$i);
- try{}catch(E $e){}($i++);
- try {} finally {}(++$i);
- ',
- ];
- yield 'do not fix' => [
- '<?php
- $b = ($a+=$c);
- foo();
- foo(1);
- foo(1,$a,3);
- foo(1,3,);
- foo($a)->$b;
- ${foo}();
- foo(+ $a, -$b);
- $a[1](2);
- $b = $c();
- $z = foo(1) + 2;
- $a = ${\'foo\'}();
- $b["foo"]($bar);
- namespace\func();
- Y::class();
- $z = (print \'a\') + 2;
- $fn1 = fn($x) => $x + $y;
- $d = function() use ($d) {};
- function provideFixCases(): iterable{}
- $z = function &($x) {++$x;};
- final class Foo { public static function bar() { return new static(); } }
- $a = (print 1) + 1;
- $b = $c(print $e);
- $c = foo(print $e);
- $c2 =[ print !($a + 1) ,];
- $a = ($a && !$c) && $b;
- $a = (1 + foo()) * 2;
- $a = -($f+$a);
- $a = !($f ? $a : $b);
- $a = @( ($f.$b)() . foo() );
- $a = $b ? ($c)($d + 2) : $d;
- $d = ($c && $a ? true : false) ? 1 : 2; // PHP Deprecated: Unparenthesized `a ? b : c ? d : e` is deprecated.
- $z = $b ? ($c)($d + 2) : $d;
- $x = $b ? foo($c)[$a](1) : $d;
- $a = [1,($a.$foo[1])[2]];
- $b = [ $d[4]($a[1].$b) , ];
- $c = [$d[4]($a[1].$b)];
- $a = ($a ? 1 : 2) ? 1 : 2;
- $a = $a ? ($a ? 1 : 2): 2;
- $a = $a ? 1 : ($a ? 1 : 2);
- $a = 1 + ($a + 1) ? 1 : 2;
- $a = $a ? ($a + 1) + 3 : 2;
- $a = $a ? 3 + ($a + 1) : 2;
- $a = $a ? 3 : 1 + ($a + 1);
- $a = $a ? 3 : ($a + 1) + 2;
- $b += ($a+=$c);
- $a = isset( ( (array) $b) [1] );
- $a = ( (array) $b) [1] ;
- exit(4);
- exit (foo()) + 1;
- $a = array();
- $b = new class(){};
- declare(ticks=1);
- $d = empty($e);
- $e = eval($b);
- list($f) = $f;
- try {foo();} catch (E $e){}
- if ($a){ echo 1; } elseif($b) { echo 2; }
- switch($a) {case 1: echo 1;}
- foreach ($a1 as $b){}
- foreach ($a2 as $b => $c){}
- for ($a =0; $a < 1; --$a){}
- while(bar()) {}
- while(!!!(bool) $a1() ){echo 1;}
- while( ($a2)(1) ){echo 1;}
- $d = isset($c);
- $d = isset($c,$a,$z);
- $y = isset($foo) && isset($foo2);
- unset($d);
- unset($d,$e);
- // from https://www.php.net/manual/en/language.operators.precedence.php
- $a = 1;
- echo $a + ($a++); // echo $a + $a++; // may print either 2 or 3
- $i = 1;
- $array[$i] = ($i++); // $array[$i] = $i++; // may set either index 1 or 2
- $t = 1+($i++)+1;
- echo (("x minus one equals " . $x) - 1) . ", or so I hope\n";
- echo "x minus one equals " . ($x-1) . ", or so I hope\n";
- $bool = (true and false);
- $a = ($a instanceof MyClass) && true;
- $a = foo($a instanceof MyClass);
- $a = $a || ($a instanceof MyClass);
- $a = clone ($a)[0];
- // handled by the `include` rule
- require (__DIR__."/foo2.php");
- require_once (__DIR__."/foo.php");
- include ($a);
- include_once ($b);
- // halt compiler
- __halt_compiler();
- ',
- ];
- yield 'do not fix ' => [
- '<?php
- SomeClass::{$method}(
- $variableA,
- $variableB
- );',
- ];
- yield 'do not fix 2' => [
- '<?php SomeClass::{$method}(2) + 1;',
- ];
- yield 'do not fix 3' => [
- '<?php $object::{$method}(...$args);',
- ];
- yield 'alternative syntax is not completely supported' => [
- '<?php if ($a):(++$i); endif;',
- ];
- }
- /**
- * @param array<string, mixed> $config
- *
- * @dataProvider provideWithConfigCases
- */
- public function testWithConfig(array $config, string $expected, string $input): void
- {
- $this->fixer->configure($config);
- $this->doTest($expected, $input);
- $this->fixer->configure(['statements' => []]);
- $this->doTest($input);
- }
- public static function provideWithConfigCases(): iterable
- {
- yield 'config: break' => [
- ['statements' => ['break']],
- '<?php
- while (foo()) {
- while (foo()) {
- break 2;
- }
- }
- ',
- '<?php
- while (foo()) {
- while (foo()) {
- break (2);
- }
- }
- ',
- ];
- yield 'config: clone' => [
- ['statements' => ['clone']],
- '<?php ; clone $f;',
- '<?php ; clone($f);',
- ];
- yield 'config: continue' => [
- ['statements' => ['continue']],
- '<?php
- while (foo()) {
- while (foo()) {
- continue 2;
- }
- }
- ',
- '<?php
- while (foo()) {
- while (foo()) {
- continue (2);
- }
- }
- ',
- ];
- yield 'config: echo_print' => [
- ['statements' => ['echo_print']],
- '<?php
- echo 1; print 2;
- ',
- '<?php
- echo (1); print (2);
- ',
- ];
- yield 'config: return' => [
- ['statements' => ['return']],
- '<?php ; return 999 ?>',
- '<?php ; return (999) ?>',
- ];
- yield 'config: switch_case' => [
- ['statements' => ['switch_case']],
- '<?php
- switch ($a) {
- case 22: echo 1;
- }
- ',
- '<?php
- switch ($a) {
- case (22): echo 1;
- }
- ',
- ];
- yield 'config: yield' => [
- ['statements' => ['yield']],
- '<?php function foo() { yield "prod"; }',
- '<?php function foo() { yield ("prod"); }',
- ];
- yield 'config: yield_from' => [
- ['statements' => ['yield_from']],
- '<?php function foo() { ; yield from $a; }',
- '<?php function foo() { ; yield from ($a); }',
- ];
- yield 'config: negative_instanceof' => [
- ['statements' => ['negative_instanceof']],
- '<?php !$foo instanceof $b;',
- '<?php !($foo instanceof $b);',
- ];
- yield 'config: others' => [
- ['statements' => ['others']],
- '<?php ; ++$v[1];',
- '<?php ; ++($v)[1];',
- ];
- }
- /**
- * @dataProvider providePrePhp8Cases
- *
- * @requires PHP <8.0
- */
- public function testPrePhp8(string $expected, string $input): void
- {
- $this->fixer->configure(
- [
- 'statements' => [
- 'break',
- 'clone',
- 'continue',
- 'echo_print',
- 'return',
- 'switch_case',
- 'yield',
- 'yield_from',
- 'others',
- ],
- ],
- );
- $this->doTest($expected, $input);
- }
- public static function providePrePhp8Cases(): iterable
- {
- yield 'block type array index curly brace' => [
- '<?php echo $a12 = $a{1};',
- '<?php echo $a12 = $a{(1)};',
- ];
- yield 'PHP8 bin doggybag' => [
- '<?php
- $s = $a{$d}(1) + 1;
- $t = $a{1}(2);
- ',
- '<?php
- $s = ($a{$d}(1)) + 1;
- $t = ($a{1}(2));
- ',
- ];
- }
- /**
- * @dataProvider provideFixPhp80Cases
- *
- * @requires PHP 8.0
- */
- public function testFixPhp80(string $expected, ?string $input = null): void
- {
- $this->fixer->configure(
- [
- 'statements' => [
- 'break',
- 'clone',
- 'continue',
- 'echo_print',
- 'return',
- 'switch_case',
- 'yield',
- 'yield_from',
- 'others',
- ],
- ],
- );
- $this->doTest($expected, $input);
- }
- public static function provideFixPhp80Cases(): iterable
- {
- yield 'fn throw' => [
- '<?php $triggerError = fn () => throw new MyError();',
- '<?php $triggerError = fn () => (throw new MyError());',
- ];
- yield 'match' => [
- "<?php
- \$r = match (\$food) {
- 'apple' => 'An apple',
- 'cake' => 'Some cake',
- };
- ",
- "<?php
- \$r = match ((\$food)) {
- 'apple' => 'An apple',
- 'cake' => 'Some cake',
- };
- ",
- ];
- yield 'wrapped FN with return types' => [
- '<?php
- $fn8 = fn(): int|bool => 123456;
- ',
- '<?php
- $fn8 = fn(): int|bool => (123456);
- ',
- ];
- yield [
- '<?php echo 1 + $obj?->value + 3;',
- '<?php echo 1 + ($obj?->value) + 3;',
- ];
- }
- /**
- * @dataProvider provideFixPhp81Cases
- *
- * @requires PHP 8.1
- */
- public function testFixPhp81(string $expected, ?string $input = null): void
- {
- $this->fixer->configure(
- [
- 'statements' => [
- 'break',
- 'clone',
- 'continue',
- 'echo_print',
- 'return',
- 'switch_case',
- 'yield',
- 'yield_from',
- 'others',
- ],
- ],
- );
- $this->doTest($expected, $input);
- }
- public static function provideFixPhp81Cases(): iterable
- {
- yield [
- '<?php
- enum Foo: string
- {
- case Bar = "do fix";
- }
- ',
- '<?php
- enum Foo: string
- {
- case Bar = ("do fix");
- }
- ',
- ];
- yield [
- '<?php echo Number::Two->value;',
- '<?php echo (Number::Two)->value;',
- ];
- yield 'wrapped FN with return types' => [
- '<?php
- $fn8 = fn(): A&B => new C();
- ',
- '<?php
- $fn8 = fn(): A&B => (new C());
- ',
- ];
- yield 'wrapped FN with return types and ref' => [
- '<?php
- $fn9 = fn & (): D & E => new F();
- ',
- '<?php
- $fn9 = fn & (): D & E => (new F());
- ',
- ];
- yield [
- '<?php
- enum Suit
- {
- case Hearts;
- }$i++;
- ',
- '<?php
- enum Suit
- {
- case Hearts;
- }($i++);
- ',
- ];
- }
- }
|