From e8e34cae5699ba330fd839b91fe6774db7546750 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 27 Sep 2025 15:23:30 +0700 Subject: [PATCH 1/8] [TypeDeclaration] Allow empty array to native array on AddMethodCallBasedStrictParamTypeRector --- .../Fixture/with_empty_array.php.inc | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 rules-tests/TypeDeclaration/Rector/ClassMethod/AddMethodCallBasedStrictParamTypeRector/Fixture/with_empty_array.php.inc diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/AddMethodCallBasedStrictParamTypeRector/Fixture/with_empty_array.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddMethodCallBasedStrictParamTypeRector/Fixture/with_empty_array.php.inc new file mode 100644 index 00000000000..934273ea39e --- /dev/null +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddMethodCallBasedStrictParamTypeRector/Fixture/with_empty_array.php.inc @@ -0,0 +1,39 @@ +process([]); + } + + private function process($data) + { + } +} + +?> +----- +process([]); + } + + private function process(array $data) + { + } +} + +?> From 482fbfac593ae5fb7ff1707ab8039650073cf99a Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 27 Sep 2025 15:24:15 +0700 Subject: [PATCH 2/8] Fix --- rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php index f0864011f8e..4090d4b79ee 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php +++ b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php @@ -45,12 +45,6 @@ public function resolveStrictTypesFromCalls(array $calls): array return []; } - /** @var Arg $arg */ - if ($this->isEmptyArray($arg->value)) { - // skip empty array, as it doesn't add any value - continue; - } - $staticTypesByArgumentPosition[$position][] = $this->resolveStrictArgValueType($arg); } } From f1af6f8a832113563493b4a8452ec0c26c3744c0 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 27 Sep 2025 15:27:34 +0700 Subject: [PATCH 3/8] Fix phpstan --- .../NodeAnalyzer/CallTypesResolver.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php index 4090d4b79ee..67a657db111 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php +++ b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php @@ -40,7 +40,11 @@ public function resolveStrictTypesFromCalls(array $calls): array $staticTypesByArgumentPosition = []; foreach ($calls as $call) { - foreach ($call->args as $position => $arg) { + if ($call->isFirstClassCallable()) { + return []; + } + + foreach ($call->getArgs() as $position => $arg) { if ($this->shouldSkipArg($arg)) { return []; } @@ -200,15 +204,11 @@ private function normalizeType(Type $argValueType): MixedType|ObjectType|Type } /** - * There is first class callable usage, or argument unpack, or named expr + * There is argument unpack, or named expr * simply returns array marks as unknown as can be anything and in any position */ - private function shouldSkipArg(Arg|VariadicPlaceholder $arg): bool + private function shouldSkipArg(Arg $arg): bool { - if ($arg instanceof VariadicPlaceholder) { - return true; - } - if ($arg->unpack) { return true; } From 3ae1da930ec38c0de7ed3597e3f35db288ee09a6 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sat, 27 Sep 2025 08:30:10 +0000 Subject: [PATCH 4/8] [ci-review] Rector Rectify --- rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php | 1 - 1 file changed, 1 deletion(-) diff --git a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php index 67a657db111..e0c322f4ade 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php +++ b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php @@ -10,7 +10,6 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Identifier; -use PhpParser\Node\VariadicPlaceholder; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\ArrayType; use PHPStan\Type\MixedType; From 81d62d8027db7ceed46d253e6c1d5d6892cf910e Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 27 Sep 2025 15:33:09 +0700 Subject: [PATCH 5/8] Fix phpstan --- rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php | 1 + 1 file changed, 1 insertion(+) diff --git a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php index e0c322f4ade..a8f3dc9acff 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php +++ b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php @@ -44,6 +44,7 @@ public function resolveStrictTypesFromCalls(array $calls): array } foreach ($call->getArgs() as $position => $arg) { + /** @var Arg $arg */ if ($this->shouldSkipArg($arg)) { return []; } From 6b3eb458f01527a2427c89ce77fa65b919faa815 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 27 Sep 2025 15:34:24 +0700 Subject: [PATCH 6/8] Fix phpstan --- .../NodeAnalyzer/CallTypesResolver.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php index a8f3dc9acff..ce2dbeaa62d 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php +++ b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php @@ -10,6 +10,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Identifier; +use PhpParser\Node\VariadicPlaceholder; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\ArrayType; use PHPStan\Type\MixedType; @@ -39,16 +40,12 @@ public function resolveStrictTypesFromCalls(array $calls): array $staticTypesByArgumentPosition = []; foreach ($calls as $call) { - if ($call->isFirstClassCallable()) { - return []; - } - foreach ($call->getArgs() as $position => $arg) { - /** @var Arg $arg */ if ($this->shouldSkipArg($arg)) { return []; } + /** @var Arg $arg */ $staticTypesByArgumentPosition[$position][] = $this->resolveStrictArgValueType($arg); } } @@ -77,6 +74,7 @@ public function resolveTypesFromCalls(array $calls): array continue; } + /** @var Arg $arg */ $staticTypesByArgumentPosition[$position][] = $this->resolveArgValueType($arg); } } @@ -204,11 +202,15 @@ private function normalizeType(Type $argValueType): MixedType|ObjectType|Type } /** - * There is argument unpack, or named expr + * There is first class callable usage, or argument unpack, or named expr * simply returns array marks as unknown as can be anything and in any position */ - private function shouldSkipArg(Arg $arg): bool + private function shouldSkipArg(Arg|VariadicPlaceholder $arg): bool { + if ($arg instanceof VariadicPlaceholder) { + return true; + } + if ($arg->unpack) { return true; } From e80360760a92c0f2dda763378b51841bd4fd2140 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 27 Sep 2025 15:34:39 +0700 Subject: [PATCH 7/8] Fix phpstan --- rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php | 1 - 1 file changed, 1 deletion(-) diff --git a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php index ce2dbeaa62d..be400b90756 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php +++ b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php @@ -74,7 +74,6 @@ public function resolveTypesFromCalls(array $calls): array continue; } - /** @var Arg $arg */ $staticTypesByArgumentPosition[$position][] = $this->resolveArgValueType($arg); } } From d1b77a480253ba0e0a32c7fe51b46417ca9c8325 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 27 Sep 2025 15:35:04 +0700 Subject: [PATCH 8/8] Fix phpstan --- rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php index be400b90756..cc19d5298b6 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php +++ b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php @@ -40,7 +40,7 @@ public function resolveStrictTypesFromCalls(array $calls): array $staticTypesByArgumentPosition = []; foreach ($calls as $call) { - foreach ($call->getArgs() as $position => $arg) { + foreach ($call->args as $position => $arg) { if ($this->shouldSkipArg($arg)) { return []; }