[CodeQuality] Do not duplicate Expr on SimplifyIfElseToTernaryRector+SimplifyUselessVariableRector+CompleteDynamicPropertiesRector (#2308)

* [CodeQuality] Do not duplicate Expr on SimplifyIfElseToTernaryRector+SimplifyUselessVariableRector+CompleteDynamicPropertiesRector

* Fixed 🎉

* clen up
This commit is contained in:
Abdul Malik Ikhsan 2022-05-14 14:32:02 +07:00 committed by GitHub
parent f92d5deca3
commit fcb2dc6f33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 122 additions and 33 deletions

View File

@ -73,53 +73,56 @@ CODE_SAMPLE
return null;
}
$previousStmt = null;
$hasChanged = false;
foreach ($stmts as $stmt) {
if ($previousStmt === null || ! $stmt instanceof Return_) {
$previousStmt = $stmt;
foreach ($stmts as $key => $stmt) {
if (! isset($stmts[$key - 1])) {
continue;
}
if (! $stmt instanceof Return_) {
continue;
}
$previousStmt = $stmts[$key - 1];
if ($this->shouldSkipStmt($stmt, $previousStmt)) {
$previousStmt = $stmt;
continue;
}
/** @var Expression $previousStmt */
/** @var Assign|AssignOp $previousNode */
$previousNode = $previousStmt->expr;
/** @var Return_ $stmt */
if ($previousNode instanceof Assign) {
if ($this->isReturnWithVarAnnotation($stmt)) {
continue;
}
$stmt->expr = $previousNode->expr;
} else {
$binaryClass = $this->assignAndBinaryMap->getAlternative($previousNode);
if ($binaryClass === null) {
continue;
}
$stmt->expr = new $binaryClass($previousNode->var, $previousNode->expr);
if ($this->isReturnWithVarAnnotation($stmt)) {
continue;
}
$this->removeNode($previousStmt);
$hasChanged = true;
$previousStmt = $stmt;
}
if ($hasChanged) {
return $node;
/**
* @var Expression $previousStmt
* @var Assign|AssignOp $assign
*/
$assign = $previousStmt->expr;
return $this->processSimplifyUselessVariable($node, $stmt, $assign, $key);
}
return null;
}
private function processSimplifyUselessVariable(
FunctionLike $functionLike,
Return_ $return,
Assign|AssignOp $assign,
int $key
): ?FunctionLike {
if (! $assign instanceof Assign) {
$binaryClass = $this->assignAndBinaryMap->getAlternative($assign);
if ($binaryClass === null) {
return null;
}
$return->expr = new $binaryClass($assign->var, $assign->expr);
} else {
$return->expr = $assign->expr;
}
unset($functionLike->stmts[$key - 1]);
return $functionLike;
}
private function shouldSkipStmt(Return_ $return, Stmt $previousStmt): bool
{
if ($this->hasSomeComment($previousStmt)) {

View File

@ -0,0 +1,37 @@
<?php
declare(strict_types=1);
namespace Rector\Core\Tests\Issues\SimplifyVariableIfElseTernary\Fixture;
final class DoNotDuplicateExpr
{
function test($foo, $bar)
{
if ($foo > 0) {
$baz = 'a';
} else {
$baz = 'b';
}
return $baz;
}
}
?>
-----
<?php
declare(strict_types=1);
namespace Rector\Core\Tests\Issues\SimplifyVariableIfElseTernary\Fixture;
final class DoNotDuplicateExpr
{
function test($foo, $bar)
{
return $foo > 0 ? 'a' : 'b';
}
}
?>

View File

@ -0,0 +1,33 @@
<?php
declare(strict_types=1);
namespace Rector\Core\Tests\Issues\SimplifyVariableIfElseTernary;
use Iterator;
use Rector\Testing\PHPUnit\AbstractRectorTestCase;
use Symplify\SmartFileSystem\SmartFileInfo;
final class SimplifyVariableIfElseTernaryTest extends AbstractRectorTestCase
{
/**
* @dataProvider provideData()
*/
public function test(SmartFileInfo $fileInfo): void
{
$this->doTestFileInfo($fileInfo);
}
/**
* @return Iterator<SmartFileInfo>
*/
public function provideData(): Iterator
{
return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture');
}
public function provideConfigFilePath(): string
{
return __DIR__ . '/config/configured_rule.php';
}
}

View File

@ -0,0 +1,16 @@
<?php
declare(strict_types=1);
use Rector\CodeQuality\Rector\Class_\CompleteDynamicPropertiesRector;
use Rector\CodeQuality\Rector\FunctionLike\SimplifyUselessVariableRector;
use Rector\CodeQuality\Rector\If_\SimplifyIfElseToTernaryRector;
use Rector\Config\RectorConfig;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->rules([
SimplifyIfElseToTernaryRector::class,
SimplifyUselessVariableRector::class,
CompleteDynamicPropertiesRector::class,
]);
};