diff --git a/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php b/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php index 667bbcfaf5a..73aeb562e37 100644 --- a/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php +++ b/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php @@ -13,9 +13,9 @@ use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; use Rector\BetterPhpDocParser\Comment\CommentsMerger; use Rector\CodeQuality\NodeManipulator\ExprBoolCaster; +use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\Core\Contract\PhpParser\NodePrinterInterface; use Rector\Core\Rector\AbstractRector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -53,53 +53,58 @@ if (strpos($docToken->getContent(), "\n") === false) { return false; CODE_SAMPLE -, 'return strpos($docToken->getContent(), "\\n") === false;')]); +, <<<'CODE_SAMPLE' +return strpos($docToken->getContent(), "\n") === false; +CODE_SAMPLE +)]); } /** * @return array> */ public function getNodeTypes() : array { - return [If_::class]; + return [StmtsAwareInterface::class]; } /** - * @param If_ $node + * @param StmtsAwareInterface $node */ public function refactor(Node $node) : ?Node { - if ($this->shouldSkip($node)) { + if ($node->stmts === null) { return null; } - /** @var Return_ $ifInnerNode */ - $ifInnerNode = $node->stmts[0]; - /** @var Return_ $nextNode */ - $nextNode = $node->getAttribute(AttributeKey::NEXT_NODE); - $innerIfInnerNode = $ifInnerNode->expr; - if (!$innerIfInnerNode instanceof Expr) { - return null; - } - if ($this->valueResolver->isTrue($innerIfInnerNode)) { - $newReturnNode = $this->processReturnTrue($node, $nextNode); - } elseif ($this->valueResolver->isFalse($innerIfInnerNode)) { - /** @var Expr $expr */ - $expr = $nextNode->expr; - if ($node->cond instanceof NotIdentical && $this->valueResolver->isTrue($expr)) { - $node->cond = new Identical($node->cond->left, $node->cond->right); - $newReturnNode = $this->processReturnTrue($node, $nextNode); - } else { - $newReturnNode = $this->processReturnFalse($node, $nextNode); + foreach ($node->stmts as $key => $stmt) { + if (!$stmt instanceof Return_) { + continue; } - } else { - return null; + $previousStmt = $node->stmts[$key - 1] ?? null; + if (!$previousStmt instanceof If_) { + continue; + } + $if = $previousStmt; + if ($this->shouldSkipIfAndReturn($previousStmt, $stmt)) { + continue; + } + $return = $stmt; + /** @var Return_ $ifInnerNode */ + $ifInnerNode = $if->stmts[0]; + $innerIfInnerNode = $ifInnerNode->expr; + if (!$innerIfInnerNode instanceof Expr) { + continue; + } + $newReturn = $this->resolveReturn($innerIfInnerNode, $if, $return); + if (!$newReturn instanceof Return_) { + continue; + } + $this->commentsMerger->keepComments($newReturn, [$if, $return, $ifInnerNode]); + // remove previous IF + unset($node->stmts[$key - 1]); + $node->stmts[$key] = $newReturn; + return $node; } - if (!$newReturnNode instanceof Return_) { - return null; - } - $this->commentsMerger->keepComments($newReturnNode, [$node, $ifInnerNode, $nextNode, $newReturnNode]); - $this->removeNode($nextNode); - return $newReturnNode; + return null; } - private function shouldSkip(If_ $if) : bool + private function shouldSkipIfAndReturn(If_ $if, Return_ $return) : bool { if ($if->elseifs !== []) { return \true; @@ -117,20 +122,16 @@ CODE_SAMPLE if (!$this->valueResolver->isTrueOrFalse($returnedExpr)) { return \true; } - $nextNode = $if->getAttribute(AttributeKey::NEXT_NODE); - if (!$nextNode instanceof Return_) { - return \true; - } - if (!$nextNode->expr instanceof Expr) { + if (!$return->expr instanceof Expr) { return \true; } // negate + negate → skip for now if (!$this->valueResolver->isFalse($returnedExpr)) { - return !$this->valueResolver->isTrueOrFalse($nextNode->expr); + return !$this->valueResolver->isTrueOrFalse($return->expr); } $condString = $this->nodePrinter->print($if->cond); if (\strpos($condString, '!=') === \false) { - return !$this->valueResolver->isTrueOrFalse($nextNode->expr); + return !$this->valueResolver->isTrueOrFalse($return->expr); } return !$if->cond instanceof NotIdentical; } @@ -187,4 +188,20 @@ CODE_SAMPLE // return must have value return $ifInnerNode->expr instanceof Expr; } + private function resolveReturn(Expr $innerExpr, If_ $if, Return_ $return) : ?Return_ + { + if ($this->valueResolver->isTrue($innerExpr)) { + return $this->processReturnTrue($if, $return); + } + if ($this->valueResolver->isFalse($innerExpr)) { + /** @var Expr $expr */ + $expr = $return->expr; + if ($if->cond instanceof NotIdentical && $this->valueResolver->isTrue($expr)) { + $if->cond = new Identical($if->cond->left, $if->cond->right); + return $this->processReturnTrue($if, $return); + } + return $this->processReturnFalse($if, $return); + } + return null; + } } diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index 93b9ba12515..47f64ec2e5e 100644 --- a/src/Application/VersionResolver.php +++ b/src/Application/VersionResolver.php @@ -19,12 +19,12 @@ final class VersionResolver * @api * @var string */ - public const PACKAGE_VERSION = 'a87a9d8e026c3499c980facf1bf24bd51b69c924'; + public const PACKAGE_VERSION = 'e1f19806fb24f507172f8e8b17ebd51c159b3fe6'; /** * @api * @var string */ - public const RELEASE_DATE = '2023-05-21 15:12:55'; + public const RELEASE_DATE = '2023-05-21 16:29:38'; /** * @var int */ diff --git a/vendor/autoload.php b/vendor/autoload.php index c16d55b98b7..5543f2f503b 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -22,4 +22,4 @@ if (PHP_VERSION_ID < 50600) { require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit1abb730cf791a93437dfd16b3894cb75::getLoader(); +return ComposerAutoloaderInit6d2634a272cd261cf6d27f0d423db670::getLoader(); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index b10d21e47f8..88309afe366 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit1abb730cf791a93437dfd16b3894cb75 +class ComposerAutoloaderInit6d2634a272cd261cf6d27f0d423db670 { private static $loader; @@ -22,17 +22,17 @@ class ComposerAutoloaderInit1abb730cf791a93437dfd16b3894cb75 return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInit1abb730cf791a93437dfd16b3894cb75', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInit6d2634a272cd261cf6d27f0d423db670', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit1abb730cf791a93437dfd16b3894cb75', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInit6d2634a272cd261cf6d27f0d423db670', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit1abb730cf791a93437dfd16b3894cb75::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInit6d2634a272cd261cf6d27f0d423db670::getInitializer($loader)); $loader->setClassMapAuthoritative(true); $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInit1abb730cf791a93437dfd16b3894cb75::$files; + $filesToLoad = \Composer\Autoload\ComposerStaticInit6d2634a272cd261cf6d27f0d423db670::$files; $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index e69d91d632c..6d170c11931 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInit1abb730cf791a93437dfd16b3894cb75 +class ComposerStaticInit6d2634a272cd261cf6d27f0d423db670 { public static $files = array ( 'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php', @@ -3115,9 +3115,9 @@ class ComposerStaticInit1abb730cf791a93437dfd16b3894cb75 public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit1abb730cf791a93437dfd16b3894cb75::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit1abb730cf791a93437dfd16b3894cb75::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit1abb730cf791a93437dfd16b3894cb75::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInit6d2634a272cd261cf6d27f0d423db670::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit6d2634a272cd261cf6d27f0d423db670::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit6d2634a272cd261cf6d27f0d423db670::$classMap; }, null, ClassLoader::class); }