From 9811962c708958aad4262000ff3095b1ddc18fbe Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 21 Mar 2024 18:38:10 +0000 Subject: [PATCH] Updated Rector to commit b4eb883e9110f50607ce2eed629c237b5e7e7356 https://github.com/rectorphp/rector-src/commit/b4eb883e9110f50607ce2eed629c237b5e7e7356 [DeadCode] Skip isset() from property fetch from docblock on RemoveAlwaysTrueIfConditionRector (#5754) --- .../SafeLeftTypeBooleanAndOrAnalyzer.php | 48 +++++++++++++++++++ .../If_/ReduceAlwaysFalseIfOrRector.php | 23 +++------ .../If_/RemoveAlwaysTrueIfConditionRector.php | 12 ++++- src/Application/VersionResolver.php | 4 +- vendor/composer/autoload_classmap.php | 1 + vendor/composer/autoload_static.php | 1 + 6 files changed, 69 insertions(+), 20 deletions(-) create mode 100644 rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php diff --git a/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php b/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php new file mode 100644 index 00000000000..7672fef75bd --- /dev/null +++ b/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php @@ -0,0 +1,48 @@ +betterNodeFinder = $betterNodeFinder; + $this->exprAnalyzer = $exprAnalyzer; + } + /** + * @param \PhpParser\Node\Expr\BinaryOp\BooleanAnd|\PhpParser\Node\Expr\BinaryOp\BooleanOr $booleanAnd + */ + public function isSafe($booleanAnd) : bool + { + $hasNonTypedFromParam = (bool) $this->betterNodeFinder->findFirst($booleanAnd->left, function (Node $node) : bool { + return $node instanceof Variable && $this->exprAnalyzer->isNonTypedFromParam($node); + }); + if ($hasNonTypedFromParam) { + return \false; + } + // get type from Property and ArrayDimFetch is unreliable + return !(bool) $this->betterNodeFinder->findFirst($booleanAnd->left, static function (Node $node) : bool { + return $node instanceof PropertyFetch || $node instanceof StaticPropertyFetch || $node instanceof ArrayDimFetch; + }); + } +} diff --git a/rules/DeadCode/Rector/If_/ReduceAlwaysFalseIfOrRector.php b/rules/DeadCode/Rector/If_/ReduceAlwaysFalseIfOrRector.php index 835d56b9ce6..3c741f2504b 100644 --- a/rules/DeadCode/Rector/If_/ReduceAlwaysFalseIfOrRector.php +++ b/rules/DeadCode/Rector/If_/ReduceAlwaysFalseIfOrRector.php @@ -5,11 +5,9 @@ namespace Rector\DeadCode\Rector\If_; use PhpParser\Node; use PhpParser\Node\Expr\BinaryOp\BooleanOr; -use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\If_; use PHPStan\Type\Constant\ConstantBooleanType; -use Rector\NodeAnalyzer\ExprAnalyzer; -use Rector\PhpParser\Node\BetterNodeFinder; +use Rector\DeadCode\NodeAnalyzer\SafeLeftTypeBooleanAndOrAnalyzer; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -20,18 +18,12 @@ final class ReduceAlwaysFalseIfOrRector extends AbstractRector { /** * @readonly - * @var \Rector\PhpParser\Node\BetterNodeFinder + * @var \Rector\DeadCode\NodeAnalyzer\SafeLeftTypeBooleanAndOrAnalyzer */ - private $betterNodeFinder; - /** - * @readonly - * @var \Rector\NodeAnalyzer\ExprAnalyzer - */ - private $exprAnalyzer; - public function __construct(BetterNodeFinder $betterNodeFinder, ExprAnalyzer $exprAnalyzer) + private $safeLeftTypeBooleanAndOrAnalyzer; + public function __construct(SafeLeftTypeBooleanAndOrAnalyzer $safeLeftTypeBooleanAndOrAnalyzer) { - $this->betterNodeFinder = $betterNodeFinder; - $this->exprAnalyzer = $exprAnalyzer; + $this->safeLeftTypeBooleanAndOrAnalyzer = $safeLeftTypeBooleanAndOrAnalyzer; } public function getRuleDefinition() : RuleDefinition { @@ -86,10 +78,7 @@ CODE_SAMPLE if ($conditionStaticType->getValue()) { return null; } - $hasNonTypedFromParam = $this->betterNodeFinder->findFirst($booleanOr->left, function (Node $node) : bool { - return $node instanceof Variable && $this->exprAnalyzer->isNonTypedFromParam($node); - }); - if ($hasNonTypedFromParam instanceof Node) { + if (!$this->safeLeftTypeBooleanAndOrAnalyzer->isSafe($booleanOr)) { return null; } $node->cond = $booleanOr->right; diff --git a/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php b/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php index 53b4dfdf20e..5dada4970d4 100644 --- a/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php +++ b/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php @@ -16,6 +16,7 @@ use PhpParser\Node\Stmt\If_; use PhpParser\NodeTraverser; use PHPStan\Reflection\ClassReflection; use PHPStan\Type\Constant\ConstantBooleanType; +use Rector\DeadCode\NodeAnalyzer\SafeLeftTypeBooleanAndOrAnalyzer; use Rector\NodeAnalyzer\ExprAnalyzer; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\Rector\AbstractRector; @@ -42,11 +43,17 @@ final class RemoveAlwaysTrueIfConditionRector extends AbstractRector * @var \Rector\PhpParser\Node\BetterNodeFinder */ private $betterNodeFinder; - public function __construct(ReflectionResolver $reflectionResolver, ExprAnalyzer $exprAnalyzer, BetterNodeFinder $betterNodeFinder) + /** + * @readonly + * @var \Rector\DeadCode\NodeAnalyzer\SafeLeftTypeBooleanAndOrAnalyzer + */ + private $safeLeftTypeBooleanAndOrAnalyzer; + public function __construct(ReflectionResolver $reflectionResolver, ExprAnalyzer $exprAnalyzer, BetterNodeFinder $betterNodeFinder, SafeLeftTypeBooleanAndOrAnalyzer $safeLeftTypeBooleanAndOrAnalyzer) { $this->reflectionResolver = $reflectionResolver; $this->exprAnalyzer = $exprAnalyzer; $this->betterNodeFinder = $betterNodeFinder; + $this->safeLeftTypeBooleanAndOrAnalyzer = $safeLeftTypeBooleanAndOrAnalyzer; } public function getRuleDefinition() : RuleDefinition { @@ -166,6 +173,9 @@ CODE_SAMPLE if (!$leftType->getValue()) { return null; } + if (!$this->safeLeftTypeBooleanAndOrAnalyzer->isSafe($booleanAnd)) { + return null; + } $if->cond = $booleanAnd->right; return $if; } diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index 938a50f0631..592eddf76b2 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 = 'dc69b1a963dc78ea9fe4ab07b70bc0716e1be341'; + public const PACKAGE_VERSION = 'b4eb883e9110f50607ce2eed629c237b5e7e7356'; /** * @api * @var string */ - public const RELEASE_DATE = '2024-03-21 15:36:33'; + public const RELEASE_DATE = '2024-03-22 01:35:52'; /** * @var int */ diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index a66072f4e6d..4b1bece7f8f 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -1238,6 +1238,7 @@ return array( 'Rector\\DeadCode\\NodeAnalyzer\\ExprUsedInNodeAnalyzer' => $baseDir . '/rules/DeadCode/NodeAnalyzer/ExprUsedInNodeAnalyzer.php', 'Rector\\DeadCode\\NodeAnalyzer\\IsClassMethodUsedAnalyzer' => $baseDir . '/rules/DeadCode/NodeAnalyzer/IsClassMethodUsedAnalyzer.php', 'Rector\\DeadCode\\NodeAnalyzer\\PropertyWriteonlyAnalyzer' => $baseDir . '/rules/DeadCode/NodeAnalyzer/PropertyWriteonlyAnalyzer.php', + 'Rector\\DeadCode\\NodeAnalyzer\\SafeLeftTypeBooleanAndOrAnalyzer' => $baseDir . '/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php', 'Rector\\DeadCode\\NodeAnalyzer\\UsedVariableNameAnalyzer' => $baseDir . '/rules/DeadCode/NodeAnalyzer/UsedVariableNameAnalyzer.php', 'Rector\\DeadCode\\NodeCollector\\UnusedParameterResolver' => $baseDir . '/rules/DeadCode/NodeCollector/UnusedParameterResolver.php', 'Rector\\DeadCode\\NodeManipulator\\ControllerClassMethodManipulator' => $baseDir . '/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.php', diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index c8571ed2e80..9afb4fae3c7 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -1457,6 +1457,7 @@ class ComposerStaticInit67be42e0079886f0083b7116ae1de531 'Rector\\DeadCode\\NodeAnalyzer\\ExprUsedInNodeAnalyzer' => __DIR__ . '/../..' . '/rules/DeadCode/NodeAnalyzer/ExprUsedInNodeAnalyzer.php', 'Rector\\DeadCode\\NodeAnalyzer\\IsClassMethodUsedAnalyzer' => __DIR__ . '/../..' . '/rules/DeadCode/NodeAnalyzer/IsClassMethodUsedAnalyzer.php', 'Rector\\DeadCode\\NodeAnalyzer\\PropertyWriteonlyAnalyzer' => __DIR__ . '/../..' . '/rules/DeadCode/NodeAnalyzer/PropertyWriteonlyAnalyzer.php', + 'Rector\\DeadCode\\NodeAnalyzer\\SafeLeftTypeBooleanAndOrAnalyzer' => __DIR__ . '/../..' . '/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php', 'Rector\\DeadCode\\NodeAnalyzer\\UsedVariableNameAnalyzer' => __DIR__ . '/../..' . '/rules/DeadCode/NodeAnalyzer/UsedVariableNameAnalyzer.php', 'Rector\\DeadCode\\NodeCollector\\UnusedParameterResolver' => __DIR__ . '/../..' . '/rules/DeadCode/NodeCollector/UnusedParameterResolver.php', 'Rector\\DeadCode\\NodeManipulator\\ControllerClassMethodManipulator' => __DIR__ . '/../..' . '/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.php',