From 70934be61391c0d5666b0ac2649067a49bc5f6d4 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 27 Sep 2025 21:20:36 +0700 Subject: [PATCH 1/3] [TypeDeclarationDocblocks] Skip mixed[] from empty array on ClassMethodArrayDocblockParamFromLocalCallsRector --- .../Fixture/skip_mixed_from_empty_array.php.inc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/skip_mixed_from_empty_array.php.inc diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/skip_mixed_from_empty_array.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/skip_mixed_from_empty_array.php.inc new file mode 100644 index 00000000000..9be7dcde250 --- /dev/null +++ b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/skip_mixed_from_empty_array.php.inc @@ -0,0 +1,16 @@ +run($data); + } + + private function run(array $data) + { + } +} From 30d97913b06099122f6f0565a8c927af38e22d3c Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 27 Sep 2025 21:26:26 +0700 Subject: [PATCH 2/3] Fix --- rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php index 2c5f1d7334d..812754f5360 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php +++ b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php @@ -13,7 +13,9 @@ use PhpParser\Node\VariadicPlaceholder; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\ArrayType; +use PHPStan\Type\Constant\ConstantArrayType; use PHPStan\Type\MixedType; +use PHPStan\Type\NeverType; use PHPStan\Type\ObjectType; use PHPStan\Type\ThisType; use PHPStan\Type\Type; @@ -223,13 +225,13 @@ private function isEmptyArray(Expr $expr): bool private function isArrayMixedMixedType(Type $type): bool { if (! $type instanceof ArrayType) { - return false; + return $type instanceof ConstantArrayType && $type->getIterableKeyType() instanceof NeverType; } - if (! $type->getItemType() instanceof MixedType) { + if (! $type->getItemType() instanceof MixedType && ! $type->getItemType() instanceof NeverType) { return false; } - return $type->getKeyType() instanceof MixedType; + return $type->getKeyType() instanceof MixedType || $type->getKeyType() instanceof NeverType; } } From 48f7b00d5d79f4f0d3789ea95b3866ef86b874bb Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 27 Sep 2025 21:32:46 +0700 Subject: [PATCH 3/3] fix --- rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php index 812754f5360..751ccaab5cd 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php +++ b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php @@ -224,8 +224,8 @@ private function isEmptyArray(Expr $expr): bool private function isArrayMixedMixedType(Type $type): bool { - if (! $type instanceof ArrayType) { - return $type instanceof ConstantArrayType && $type->getIterableKeyType() instanceof NeverType; + if (! $type instanceof ArrayType && ! $type instanceof ConstantArrayType) { + return false; } if (! $type->getItemType() instanceof MixedType && ! $type->getItemType() instanceof NeverType) {