Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SimplifiedIfReturnFixer - handle statement in loop without braces #6266

Merged
merged 1 commit into from Feb 5, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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;
',
];
}
}