Skip to content

Commit

Permalink
bug #6266 SimplifiedIfReturnFixer - handle statement in loop without …
Browse files Browse the repository at this point in the history
…braces (SpacePossum)

This PR was merged into the master branch.

Discussion
----------

SimplifiedIfReturnFixer - handle statement in loop without braces

closes #6230

Commits
-------

9743b6f SimplifiedIfReturnFixer - handle statement in loop without braces
  • Loading branch information
SpacePossum committed Feb 5, 2022
2 parents 3a17d14 + 9743b6f commit 13f0d2a
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 91 deletions.
8 changes: 5 additions & 3 deletions src/Fixer/ControlStructure/SimplifiedIfReturnFixer.php
Expand Up @@ -96,12 +96,14 @@ public function isCandidate(Tokens $tokens): bool
protected function applyFix(\SplFileInfo $file, Tokens $tokens): void
{
for ($ifIndex = $tokens->count() - 1; 0 <= $ifIndex; --$ifIndex) {
$ifToken = $tokens[$ifIndex];

if (!$ifToken->isGivenKind([T_IF, T_ELSEIF])) {
if (!$tokens[$ifIndex]->isGivenKind([T_IF, T_ELSEIF])) {
continue;
}

if ($tokens[$tokens->getPrevMeaningfulToken($ifIndex)]->equals(')')) {
continue; // in a loop without braces
}

$startParenthesisIndex = $tokens->getNextTokenOfKind($ifIndex, ['(']);
$endParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $startParenthesisIndex);
$firstCandidateIndex = $tokens->getNextMeaningfulToken($endParenthesisIndex);
Expand Down
231 changes: 143 additions & 88 deletions tests/Fixer/ControlStructure/SimplifiedIfReturnFixerTest.php
Expand Up @@ -33,47 +33,55 @@ public function testFix(string $expected, ?string $input = null): void
$this->doTest($expected, $input);
}

public function provideFixCases(): array
public function provideFixCases(): iterable
{
return [
'simple' => [
'<?php return (bool) ($foo) ;',
'<?php if ($foo) { return true; } return false;',
],
'simple-negative' => [
'<?php return ! ($foo) ;',
'<?php if ($foo) { return false; } return true;',
],
'simple-negative II' => [
'<?php return ! (!$foo && $a()) ;',
'<?php if (!$foo && $a()) { return false; } return true;',
],
'simple-braceless' => [
'<?php return (bool) ($foo) ;',
'<?php if ($foo) return true; return false;',
],
'simple-braceless-negative' => [
'<?php return ! ($foo) ;',
'<?php if ($foo) return false; return true;',
],
'bug-consecutive-ifs' => [
'<?php if ($bar) { return 1; } return (bool) ($foo) ;',
'<?php if ($bar) { return 1; } if ($foo) { return true; } return false;',
],
'bug-consecutive-ifs-negative' => [
'<?php if ($bar) { return 1; } return ! ($foo) ;',
'<?php if ($bar) { return 1; } if ($foo) { return false; } return true;',
],
'bug-consecutive-ifs-braceless' => [
'<?php if ($bar) return 1; return (bool) ($foo) ;',
'<?php if ($bar) return 1; if ($foo) return true; return false;',
],
'bug-consecutive-ifs-braceless-negative' => [
'<?php if ($bar) return 1; return ! ($foo) ;',
'<?php if ($bar) return 1; if ($foo) return false; return true;',
],
[
<<<'EOT'
yield 'simple' => [
'<?php return (bool) ($foo) ;',
'<?php if ($foo) { return true; } return false;',
];

yield 'simple-negative' => [
'<?php return ! ($foo) ;',
'<?php if ($foo) { return false; } return true;',
];

yield 'simple-negative II' => [
'<?php return ! (!$foo && $a()) ;',
'<?php if (!$foo && $a()) { return false; } return true;',
];

yield 'simple-braceless' => [
'<?php return (bool) ($foo) ;',
'<?php if ($foo) return true; return false;',
];

yield 'simple-braceless-negative' => [
'<?php return ! ($foo) ;',
'<?php if ($foo) return false; return true;',
];

yield 'bug-consecutive-ifs' => [
'<?php if ($bar) { return 1; } return (bool) ($foo) ;',
'<?php if ($bar) { return 1; } if ($foo) { return true; } return false;',
];

yield 'bug-consecutive-ifs-negative' => [
'<?php if ($bar) { return 1; } return ! ($foo) ;',
'<?php if ($bar) { return 1; } if ($foo) { return false; } return true;',
];

yield 'bug-consecutive-ifs-braceless' => [
'<?php if ($bar) return 1; return (bool) ($foo) ;',
'<?php if ($bar) return 1; if ($foo) return true; return false;',
];

yield 'bug-consecutive-ifs-braceless-negative' => [
'<?php if ($bar) return 1; return ! ($foo) ;',
'<?php if ($bar) return 1; if ($foo) return false; return true;',
];

yield [
<<<'EOT'
<?php
function f1() { return (bool) ($f1) ; }
function f2() { return true; } return false;
Expand All @@ -85,8 +93,8 @@ function f7() { return ! ($f7) ; }
function f8() { return false; } return true;
function f9() { return ! ($f9) ; }
EOT
,
<<<'EOT'
,
<<<'EOT'
<?php
function f1() { if ($f1) { return true; } return false; }
function f2() { return true; } return false;
Expand All @@ -98,10 +106,11 @@ function f7() { if ($f7) { return false; } return true; }
function f8() { return false; } return true;
function f9() { if ($f9) { return false; } return true; }
EOT
,
],
'preserve-comments' => [
<<<'EOT'
,
];

yield 'preserve-comments' => [
<<<'EOT'
<?php
// C1
return (bool)
Expand Down Expand Up @@ -129,8 +138,8 @@ function f9() { if ($f9) { return false; } return true; }
;
/* C13 */
EOT
,
<<<'EOT'
,
<<<'EOT'
<?php
// C1
if
Expand Down Expand Up @@ -158,10 +167,11 @@ function f9() { if ($f9) { return false; } return true; }
;
/* C13 */
EOT
,
],
'preserve-comments-braceless' => [
<<<'EOT'
,
];

yield 'preserve-comments-braceless' => [
<<<'EOT'
<?php
// C1
return (bool)
Expand All @@ -187,8 +197,8 @@ function f9() { if ($f9) { return false; } return true; }
;
/* C13 */
EOT
,
<<<'EOT'
,
<<<'EOT'
<?php
// C1
if
Expand All @@ -214,40 +224,85 @@ function f9() { if ($f9) { return false; } return true; }
;
/* C13 */
EOT
,
],
'else-if' => [
'<?php if ($bar) { return $bar; } else return (bool) ($foo) ;',
'<?php if ($bar) { return $bar; } else if ($foo) { return true; } return false;',
],
'else-if-negative' => [
'<?php if ($bar) { return $bar; } else return ! ($foo) ;',
'<?php if ($bar) { return $bar; } else if ($foo) { return false; } return true;',
],
'else-if-braceless' => [
'<?php if ($bar) return $bar; else return (bool) ($foo) ;',
'<?php if ($bar) return $bar; else if ($foo) return true; return false;',
],
'else-if-braceless-negative' => [
'<?php if ($bar) return $bar; else return ! ($foo) ;',
'<?php if ($bar) return $bar; else if ($foo) return false; return true;',
],
'elseif' => [
'<?php if ($bar) { return $bar; } return (bool) ($foo) ;',
'<?php if ($bar) { return $bar; } elseif ($foo) { return true; } return false;',
],
'elseif-negative' => [
'<?php if ($bar) { return $bar; } return ! ($foo) ;',
'<?php if ($bar) { return $bar; } elseif ($foo) { return false; } return true;',
],
'elseif-braceless' => [
'<?php if ($bar) return $bar; return (bool) ($foo) ;',
'<?php if ($bar) return $bar; elseif ($foo) return true; return false;',
],
'elseif-braceless-negative' => [
'<?php if ($bar) return $bar; return ! ($foo) ;',
'<?php if ($bar) return $bar; elseif ($foo) return false; return true;',
],
,
];

yield 'else-if' => [
'<?php if ($bar) { return $bar; } else return (bool) ($foo) ;',
'<?php if ($bar) { return $bar; } else if ($foo) { return true; } return false;',
];

yield 'else-if-negative' => [
'<?php if ($bar) { return $bar; } else return ! ($foo) ;',
'<?php if ($bar) { return $bar; } else if ($foo) { return false; } return true;',
];

yield 'else-if-braceless' => [
'<?php if ($bar) return $bar; else return (bool) ($foo) ;',
'<?php if ($bar) return $bar; else if ($foo) return true; return false;',
];

yield 'else-if-braceless-negative' => [
'<?php if ($bar) return $bar; else return ! ($foo) ;',
'<?php if ($bar) return $bar; else if ($foo) return false; return true;',
];

yield 'elseif' => [
'<?php if ($bar) { return $bar; } return (bool) ($foo) ;',
'<?php if ($bar) { return $bar; } elseif ($foo) { return true; } return false;',
];

yield 'elseif-negative' => [
'<?php if ($bar) { return $bar; } return ! ($foo) ;',
'<?php if ($bar) { return $bar; } elseif ($foo) { return false; } return true;',
];

yield 'elseif-braceless' => [
'<?php if ($bar) return $bar; return (bool) ($foo) ;',
'<?php if ($bar) return $bar; elseif ($foo) return true; return false;',
];

yield 'elseif-braceless-negative' => [
'<?php if ($bar) return $bar; return ! ($foo) ;',
'<?php if ($bar) return $bar; elseif ($foo) return false; return true;',
];

yield 'no braces loops' => [
'<?php
function foo1(string $str, array $letters): bool
{
foreach ($letters as $letter)
if ($str === $letter)
return true;
return false;
}
function foo2(int $z): bool
{
for ($i = 0; $i < 3; ++$i)
if ($i === $z)
return true;
return false;
}
function foo3($y): bool
{
while ($x = bar())
if ($x === $z)
return true;
return false;
}
',
];

yield 'alternative syntax not supported' => [
'<?php
if ($foo):
return true;
else:
return false;
endif;
',
];
}
}

0 comments on commit 13f0d2a

Please sign in to comment.