diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_mixed_array.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_mixed_array.php.inc new file mode 100644 index 00000000000..f40c5d067d2 --- /dev/null +++ b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_mixed_array.php.inc @@ -0,0 +1,55 @@ + +----- + diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/skip_override_dummy_array_mixed_on_public.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/skip_override_dummy_array_mixed_on_public.php.inc new file mode 100644 index 00000000000..f24521e0c00 --- /dev/null +++ b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/skip_override_dummy_array_mixed_on_public.php.inc @@ -0,0 +1,22 @@ +run([2512, 3423]); + + $this->run([324, 534]); + } + + /** + * @param mixed[] $items + */ + public function run(array $items) + { + } +} + +?> diff --git a/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php b/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php index 2a15152e16a..e7c8d4776a3 100644 --- a/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php +++ b/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php @@ -4,6 +4,7 @@ namespace Rector\CodeQuality\Rector\If_; +use PhpParser\Token; use PhpParser\Node; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Else_; @@ -79,7 +80,7 @@ public function refactor(Node $node): ?Node } /** - * @param mixed[] $oldTokens + * @param Token[] $oldTokens */ private function isIfConditionFollowedByOpeningCurlyBracket(If_|ElseIf_|Else_ $if, array $oldTokens): bool { diff --git a/rules/Php55/Rector/String_/StringClassNameToClassConstantRector.php b/rules/Php55/Rector/String_/StringClassNameToClassConstantRector.php index e3a8fb81dfd..859d6d21a3c 100644 --- a/rules/Php55/Rector/String_/StringClassNameToClassConstantRector.php +++ b/rules/Php55/Rector/String_/StringClassNameToClassConstantRector.php @@ -147,7 +147,7 @@ public function refactor(Node $node): Concat|ClassConstFetch|null|int } /** - * @param mixed[] $configuration + * @param array $configuration */ public function configure(array $configuration): void { diff --git a/rules/Php70/EregToPcreTransformer.php b/rules/Php70/EregToPcreTransformer.php index 88ba0af813e..6b2a48deaa6 100644 --- a/rules/Php70/EregToPcreTransformer.php +++ b/rules/Php70/EregToPcreTransformer.php @@ -204,7 +204,7 @@ private function normalize(string $content, bool $normalizeUnprintableChar): str } /** - * @param mixed[] $r + * @param array $r */ private function processBracket(string $content, int $i, int $l, array &$r, int $rr): int { @@ -284,7 +284,7 @@ private function _ere2pcre_escape(string $content): string } /** - * @param mixed[] $r + * @param array $r */ private function processCurlyBracket(string $s, int $i, array &$r, int $rr): int { diff --git a/rules/Php74/Rector/LNumber/AddLiteralSeparatorToNumberRector.php b/rules/Php74/Rector/LNumber/AddLiteralSeparatorToNumberRector.php index 3055a259aa0..e36597b6326 100644 --- a/rules/Php74/Rector/LNumber/AddLiteralSeparatorToNumberRector.php +++ b/rules/Php74/Rector/LNumber/AddLiteralSeparatorToNumberRector.php @@ -44,7 +44,7 @@ final class AddLiteralSeparatorToNumberRector extends AbstractRector implements private int $limitValue = self::DEFAULT_LIMIT_VALUE; /** - * @param mixed[] $configuration + * @param array $configuration */ public function configure(array $configuration): void { diff --git a/rules/Php81/Rector/Class_/SpatieEnumClassToEnumRector.php b/rules/Php81/Rector/Class_/SpatieEnumClassToEnumRector.php index 5e3de25c541..921a628a9c1 100644 --- a/rules/Php81/Rector/Class_/SpatieEnumClassToEnumRector.php +++ b/rules/Php81/Rector/Class_/SpatieEnumClassToEnumRector.php @@ -93,7 +93,7 @@ public function refactor(Node $node): ?Enum_ } /** - * @param mixed[] $configuration + * @param array $configuration */ public function configure(array $configuration): void { diff --git a/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php b/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php index fd39705fbdb..e3e0c681933 100644 --- a/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php +++ b/rules/Php82/Rector/Param/AddSensitiveParameterAttributeRector.php @@ -36,7 +36,7 @@ public function __construct( } /** - * @param mixed[] $configuration + * @param array $configuration */ public function configure(array $configuration): void { diff --git a/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php b/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php index 88e7f24c2c7..6855933ca0c 100644 --- a/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php +++ b/rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php @@ -121,7 +121,7 @@ public function getNodeTypes(): array } /** - * @param mixed[] $configuration + * @param array $configuration */ public function configure(array $configuration): void { diff --git a/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.php b/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.php index 72509ce12a0..742da71d056 100644 --- a/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.php +++ b/rules/Strict/Rector/AbstractFalsyScalarRuleFixerRector.php @@ -24,7 +24,7 @@ abstract class AbstractFalsyScalarRuleFixerRector extends AbstractRector impleme protected bool $treatAsNonEmpty = false; /** - * @param mixed[] $configuration + * @param array $configuration */ public function configure(array $configuration): void { diff --git a/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php b/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php index a71becd6994..3e1749681e2 100644 --- a/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php @@ -7,6 +7,7 @@ use PhpParser\Node; use PhpParser\Node\Param; use PhpParser\Node\Stmt\Class_; +use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; @@ -106,6 +107,13 @@ public function refactor(Node $node): ?Node continue; } + if ($parameterTagValueNode instanceof ParamTagValueNode + && $classMethod->isPublic() && + $this->usefulArrayTagNodeAnalyzer->isMixedArray($parameterTagValueNode->type)) { + // on public method, skip if there is mixed[], as caller can be anything + continue; + } + $resolvedParameterType = $classMethodParameterTypes[$parameterPosition] ?? $classMethodParameterTypes[$parameterName] ?? null; if (! $resolvedParameterType instanceof Type) { continue; diff --git a/rules/TypeDeclarationDocblocks/TagNodeAnalyzer/UsefulArrayTagNodeAnalyzer.php b/rules/TypeDeclarationDocblocks/TagNodeAnalyzer/UsefulArrayTagNodeAnalyzer.php index 8f54666886e..e52def88f7c 100644 --- a/rules/TypeDeclarationDocblocks/TagNodeAnalyzer/UsefulArrayTagNodeAnalyzer.php +++ b/rules/TypeDeclarationDocblocks/TagNodeAnalyzer/UsefulArrayTagNodeAnalyzer.php @@ -8,6 +8,8 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; +use PHPStan\PhpDocParser\Ast\Type\TypeNode; +use Rector\BetterPhpDocParser\ValueObject\Type\SpacingAwareArrayTypeNode; final class UsefulArrayTagNodeAnalyzer { @@ -19,9 +21,14 @@ public function isUsefulArrayTag(null|ReturnTagValueNode|ParamTagValueNode|VarTa $type = $tagValueNode->type; if (! $type instanceof IdentifierTypeNode) { - return true; + return ! $this->isMixedArray($type); } return $type->name !== 'array'; } + + public function isMixedArray(TypeNode $typeNode): bool + { + return $typeNode instanceof SpacingAwareArrayTypeNode && $typeNode->type instanceof IdentifierTypeNode && $typeNode->type->name === 'mixed'; + } } diff --git a/src/BetterPhpDocParser/Printer/RemoveNodesStartAndEndResolver.php b/src/BetterPhpDocParser/Printer/RemoveNodesStartAndEndResolver.php index 5b0b0666983..bab55bc40b4 100644 --- a/src/BetterPhpDocParser/Printer/RemoveNodesStartAndEndResolver.php +++ b/src/BetterPhpDocParser/Printer/RemoveNodesStartAndEndResolver.php @@ -13,7 +13,7 @@ final class RemoveNodesStartAndEndResolver { /** - * @param mixed[] $tokens + * @param array $tokens * @return StartAndEnd[] */ public function resolve(PhpDocNode $originalPhpDocNode, PhpDocNode $currentPhpDocNode, array $tokens): array diff --git a/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/CurlyListNode.php b/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/CurlyListNode.php index a8c3c9bdf54..233578cb552 100644 --- a/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/CurlyListNode.php +++ b/src/BetterPhpDocParser/ValueObject/PhpDoc/DoctrineAnnotation/CurlyListNode.php @@ -27,7 +27,7 @@ public function __toString(): string } /** - * @param mixed[] $array + * @param ArrayItemNode[] $array */ private function implode(array $array): string { diff --git a/src/Caching/ValueObject/CacheItem.php b/src/Caching/ValueObject/CacheItem.php index d1d5dd9614a..f344bd82b72 100644 --- a/src/Caching/ValueObject/CacheItem.php +++ b/src/Caching/ValueObject/CacheItem.php @@ -17,7 +17,7 @@ public function __construct( } /** - * @param mixed[] $properties + * @param array $properties */ public static function __set_state(array $properties): self { diff --git a/src/ValueObject/Error/SystemError.php b/src/ValueObject/Error/SystemError.php index 4722858079f..213dd49e2d1 100644 --- a/src/ValueObject/Error/SystemError.php +++ b/src/ValueObject/Error/SystemError.php @@ -63,7 +63,7 @@ public function jsonSerialize(): array } /** - * @param mixed[] $json + * @param array $json */ public static function decode(array $json): self {