diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/NamedArgs/flipped_args.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/NamedArgs/flipped_args.php.inc new file mode 100644 index 00000000000..d4f8d672eea --- /dev/null +++ b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/NamedArgs/flipped_args.php.inc @@ -0,0 +1,39 @@ +run(names: ['John', 'Doe'], items: [123, 456]); + } + + private function run(array $items, array $names) + { + } +} + +?> +----- +run(names: ['John', 'Doe'], items: [123, 456]); + } + + /** + * @param int[] $items + * @param string[] $names + */ + private function run(array $items, array $names) + { + } +} + +?> diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/NamedArgs/named_arg.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/NamedArgs/named_arg.php.inc new file mode 100644 index 00000000000..28214e8d5b3 --- /dev/null +++ b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector/Fixture/NamedArgs/named_arg.php.inc @@ -0,0 +1,38 @@ +run(items: ['item1', 'item2']); + } + + private function run(array $items) + { + } +} + +?> +----- +run(items: ['item1', 'item2']); + } + + /** + * @param string[] $items + */ + private function run(array $items) + { + } +} + +?> diff --git a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php index 751ccaab5cd..d8a120838c0 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php +++ b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php @@ -58,7 +58,7 @@ public function resolveStrictTypesFromCalls(array $calls): array /** * @param MethodCall[]|StaticCall[] $calls - * @return array + * @return array */ public function resolveTypesFromCalls(array $calls): array { @@ -67,7 +67,7 @@ public function resolveTypesFromCalls(array $calls): array foreach ($calls as $call) { foreach ($call->args as $position => $arg) { if ($this->shouldSkipArg($arg)) { - return []; + continue; } /** @var Arg $arg */ @@ -76,7 +76,13 @@ public function resolveTypesFromCalls(array $calls): array continue; } - $staticTypesByArgumentPosition[$position][] = $this->resolveArgValueType($arg); + if ($arg->name instanceof Identifier) { + $positionOrName = $arg->name->toString(); + } else { + $positionOrName = $position; + } + + $staticTypesByArgumentPosition[$positionOrName][] = $this->resolveArgValueType($arg); } } @@ -206,11 +212,7 @@ private function shouldSkipArg(Arg|VariadicPlaceholder $arg): bool return true; } - if ($arg->unpack) { - return true; - } - - return $arg->name instanceof Identifier; + return $arg->unpack; } private function isEmptyArray(Expr $expr): bool diff --git a/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php b/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php index 301ebdbf5f9..36408389a68 100644 --- a/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php @@ -107,7 +107,7 @@ public function refactor(Node $node): ?Node continue; } - $resolvedParameterType = $classMethodParameterTypes[$parameterPosition] ?? null; + $resolvedParameterType = $classMethodParameterTypes[$parameterPosition] ?? $classMethodParameterTypes[$parameterName] ?? null; if (! $resolvedParameterType instanceof Type) { continue; }