diff --git a/rules-tests/DeadCode/Rector/Cast/RecastingRemovalRector/Fixture/skip_with_set_get_magic.php.inc b/rules-tests/DeadCode/Rector/Cast/RecastingRemovalRector/Fixture/skip_with_set_get_magic.php.inc new file mode 100644 index 00000000000..d69527736e8 --- /dev/null +++ b/rules-tests/DeadCode/Rector/Cast/RecastingRemovalRector/Fixture/skip_with_set_get_magic.php.inc @@ -0,0 +1,31 @@ +data[$name])) { + return $this->data[$name]; + } + } + + public function __set($name, $value) + { + $this->data[$name] = (object) $value; + } +} + +class SkipWithSetGetMagic +{ + public function run(AConfig $config) + { + $config->property = []; + var_dump([] === (array) $config->property); + } +} + +?> diff --git a/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php b/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php index e5c819be36d..a693adde970 100644 --- a/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php +++ b/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php @@ -25,6 +25,7 @@ use PHPStan\Type\ObjectType; use PHPStan\Type\StringType; use PHPStan\Type\Type; +use PHPStan\Type\UnionType; use Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; @@ -121,7 +122,14 @@ private function shouldSkip(Expr $expr): bool /** @var PropertyFetch|StaticPropertyFetch $expr */ $phpPropertyReflection = $this->reflectionResolver->resolvePropertyReflectionFromPropertyFetch($expr); if (! $phpPropertyReflection instanceof PhpPropertyReflection) { - return false; + $propertyType = $expr instanceof StaticPropertyFetch + ? $this->nodeTypeResolver->resolve($expr->class) + : $this->nodeTypeResolver->resolve($expr->var); + + // need to UnionType check due rectify with RecastingRemovalRector + CountOnNullRector + // cause add (array) cast on $node->args + // on union $node types FuncCall|MethodCall|StaticCall + return ! $propertyType instanceof UnionType; } $nativeType = $phpPropertyReflection->getNativeType();