diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/skip_mixed_mixed.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/skip_mixed_mixed.php.inc new file mode 100644 index 00000000000..6dc6d75a169 --- /dev/null +++ b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/skip_mixed_mixed.php.inc @@ -0,0 +1,17 @@ +run(['item1', 'item2']); + + $this->run([$mixed, $mixed]); + } + + private function run(array $items) + { + } +} diff --git a/rules/Privatization/TypeManipulator/TypeNormalizer.php b/rules/Privatization/TypeManipulator/TypeNormalizer.php index 540dcd44a8c..04b4e1b08c6 100644 --- a/rules/Privatization/TypeManipulator/TypeNormalizer.php +++ b/rules/Privatization/TypeManipulator/TypeNormalizer.php @@ -25,7 +25,7 @@ final class TypeNormalizer * @deprecated This method is deprecated and will be removed in the next major release. * Use @see generalizeConstantTypes() instead. */ - public function generalizeConstantBoolTypes(\PHPStan\Type\Type $type): Type + public function generalizeConstantBoolTypes(Type $type): Type { return $this->generalizeConstantTypes($type); } diff --git a/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector.php b/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector.php index f1ccc16733e..19c3ac93acf 100644 --- a/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector.php @@ -154,11 +154,9 @@ public function refactor(Node $node): ?Node if ($yields !== []) { $yieldType = $this->yieldTypeResolver->resolveFromYieldNodes($yields, $dataProviderClassMethod); - if ($yieldType instanceof FullyQualifiedGenericObjectType) { - if ($yieldType->getClassName() === 'Generator') { - // most likely, a static iterator is used in data test fixtures - $yieldType = new FullyQualifiedGenericObjectType('Iterator', $yieldType->getTypes()); - } + if ($yieldType instanceof FullyQualifiedGenericObjectType && $yieldType->getClassName() === 'Generator') { + // most likely, a static iterator is used in data test fixtures + $yieldType = new FullyQualifiedGenericObjectType('Iterator', $yieldType->getTypes()); } $this->addGeneratedTypeReturnDocblockType($yieldType, $classMethodPhpDocInfo, $dataProviderClassMethod); diff --git a/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php b/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php index 49267be1e19..12ce60a5b09 100644 --- a/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php @@ -7,6 +7,9 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Class_; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; +use PHPStan\Type\ArrayType; +use PHPStan\Type\IntegerType; +use PHPStan\Type\MixedType; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; @@ -119,6 +122,12 @@ public function refactor(Node $node): ?Node $normalizedResolvedParameterType = $this->typeNormalizer->generalizeConstantTypes( $resolvedParameterType ); + + // most likely mixed, skip + if ($this->isArrayMixed($normalizedResolvedParameterType)) { + continue; + } + $arrayDocTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPHPStanPhpDocTypeNode( $normalizedResolvedParameterType ); @@ -137,4 +146,17 @@ public function refactor(Node $node): ?Node return $node; } + + private function isArrayMixed(Type $type): bool + { + if (! $type instanceof ArrayType) { + return false; + } + + if (! $type->getItemType() instanceof MixedType) { + return false; + } + + return $type->getKeyType() instanceof IntegerType; + } }