diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadInstanceOfRector/Fixture/skip_trait_this.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveDeadInstanceOfRector/Fixture/skip_trait_this.php.inc new file mode 100644 index 00000000000..ab89ae8ef6f --- /dev/null +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadInstanceOfRector/Fixture/skip_trait_this.php.inc @@ -0,0 +1,17 @@ +getExample() === false) { + $this->setExample('demo'); + } + } + } +} diff --git a/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php b/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php index 9c523d2b1f8..bbaacf94418 100644 --- a/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php +++ b/rules/DeadCode/NodeAnalyzer/SafeLeftTypeBooleanAndOrAnalyzer.php @@ -4,17 +4,16 @@ namespace Rector\DeadCode\NodeAnalyzer; -use PHPStan\Type\ObjectType; use PhpParser\Node; use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\BinaryOp\BooleanOr; +use PhpParser\Node\Expr\Instanceof_; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Expr\Variable; use PHPStan\Reflection\ClassReflection; use Rector\NodeAnalyzer\ExprAnalyzer; -use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\Reflection\ReflectionResolver; @@ -23,8 +22,7 @@ public function __construct( private readonly BetterNodeFinder $betterNodeFinder, private readonly ExprAnalyzer $exprAnalyzer, - private readonly ReflectionResolver $reflectionResolver, - private readonly NodeTypeResolver $nodeTypeResolver + private readonly ReflectionResolver $reflectionResolver ) { } @@ -54,7 +52,7 @@ public function isSafe(BooleanAnd|BooleanOr $booleanAnd): bool if ($classReflection instanceof ClassReflection && $classReflection->isTrait()) { return ! (bool) $this->betterNodeFinder->findFirst( $booleanAnd->left, - fn (Node $node): bool => $this->nodeTypeResolver->getType($node) instanceof ObjectType + static fn(Node $node): bool => $node instanceof Instanceof_ ); } diff --git a/rules/DeadCode/Rector/If_/RemoveDeadInstanceOfRector.php b/rules/DeadCode/Rector/If_/RemoveDeadInstanceOfRector.php index 19684cfe43e..85fda819275 100644 --- a/rules/DeadCode/Rector/If_/RemoveDeadInstanceOfRector.php +++ b/rules/DeadCode/Rector/If_/RemoveDeadInstanceOfRector.php @@ -4,6 +4,7 @@ namespace Rector\DeadCode\Rector\If_; +use PHPStan\Reflection\ClassReflection; use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Assign; @@ -21,6 +22,7 @@ use PHPStan\Type\MixedType; use Rector\NodeManipulator\IfManipulator; use Rector\Rector\AbstractRector; +use Rector\Reflection\ReflectionResolver; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -31,6 +33,7 @@ final class RemoveDeadInstanceOfRector extends AbstractRector { public function __construct( private readonly IfManipulator $ifManipulator, + private readonly ReflectionResolver $reflectionResolver ) { } @@ -148,6 +151,11 @@ private function isInstanceofTheSameType(Instanceof_ $instanceof): ?bool return null; } + $classReflection = $this->reflectionResolver->resolveClassReflection($instanceof); + if ($classReflection instanceof ClassReflection && $classReflection->isTrait()) { + return null; + } + $classType = $this->nodeTypeResolver->getType($instanceof->class); $exprType = $this->nodeTypeResolver->getNativeType($instanceof->expr);