diff --git a/rules/CodeQuality/NodeAnalyzer/ExplicitBoolConditionResolver.php b/rules/CodeQuality/NodeAnalyzer/ExplicitBoolConditionResolver.php index d093f992dcc..b4addf4c949 100644 --- a/rules/CodeQuality/NodeAnalyzer/ExplicitBoolConditionResolver.php +++ b/rules/CodeQuality/NodeAnalyzer/ExplicitBoolConditionResolver.php @@ -5,8 +5,12 @@ namespace Rector\CodeQuality\NodeAnalyzer; use PhpParser\Node\Expr; +use PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Expr\Cast\Bool_; +use PhpParser\Node\Expr\Empty_; +use PhpParser\Node\Expr\Instanceof_; +use PhpParser\Node\Expr\Isset_; use PhpParser\Node\Expr\Ternary; use PhpParser\Node\Stmt\ElseIf_; use PhpParser\Node\Stmt\If_; @@ -40,6 +44,11 @@ public function resolve(If_|ElseIf_|Ternary $node): ?ExplicitBoolCondition return null; } + // cheap bail - these shapes can never be a nullable object, skip costly native type resolution + if ($this->isNeverNullableObject($conditionNode)) { + return null; + } + $conditionStaticType = $this->nodeTypeResolver->getNativeType($conditionNode); if ($conditionStaticType instanceof MixedType || $conditionStaticType->isBoolean()->yes()) { return null; @@ -47,4 +56,12 @@ public function resolve(If_|ElseIf_|Ternary $node): ?ExplicitBoolCondition return new ExplicitBoolCondition($conditionNode, $isNegated); } + + private function isNeverNullableObject(Expr $expr): bool + { + return $expr instanceof BinaryOp + || $expr instanceof Instanceof_ + || $expr instanceof Empty_ + || $expr instanceof Isset_; + } }