mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-16 08:02:23 +00:00
[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:
parent
f92d5deca3
commit
fcb2dc6f33
|
@ -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)) {
|
||||
|
|
|
@ -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';
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -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';
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
]);
|
||||
};
|
Loading…
Reference in New Issue
Block a user