From 7c8a603f2b725908e5f476e951d9ae0ff49f65f6 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 13 Oct 2025 13:43:09 +0200 Subject: [PATCH 1/3] add closure support to AddParamStringTypeFromSprintfUseRector --- .../Fixture/cover_closure.php.inc | 33 +++++++++++++++++++ .../VariableInSprintfMaskMatcher.php | 3 +- ...AddParamStringTypeFromSprintfUseRector.php | 7 ++-- 3 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/cover_closure.php.inc diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/cover_closure.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/cover_closure.php.inc new file mode 100644 index 00000000000..0ef5f6bd900 --- /dev/null +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/cover_closure.php.inc @@ -0,0 +1,33 @@ + +----- + diff --git a/rules/TypeDeclaration/NodeAnalyzer/VariableInSprintfMaskMatcher.php b/rules/TypeDeclaration/NodeAnalyzer/VariableInSprintfMaskMatcher.php index 5c6a54cdbf8..ec82735e904 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/VariableInSprintfMaskMatcher.php +++ b/rules/TypeDeclaration/NodeAnalyzer/VariableInSprintfMaskMatcher.php @@ -6,6 +6,7 @@ use Nette\Utils\Strings; use PhpParser\Node\Arg; +use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\ClassMethod; @@ -28,7 +29,7 @@ public function __construct( } - public function matchMask(ClassMethod|Function_ $functionLike, string $variableName, string $mask): bool + public function matchMask(ClassMethod|Function_|Closure $functionLike, string $variableName, string $mask): bool { $funcCalls = $this->betterNodeFinder->findInstancesOfScoped((array) $functionLike->stmts, FuncCall::class); $funcCalls = array_values( diff --git a/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php b/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php index 4b6bdc6a10d..bff5d93c46e 100644 --- a/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php +++ b/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; +use PhpParser\Node\Expr\Closure; use PhpParser\Node\Identifier; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\ClassMethod; @@ -61,13 +62,13 @@ public function formatMessage(string $name) */ public function getNodeTypes(): array { - return [ClassMethod::class, Function_::class]; + return [ClassMethod::class, Function_::class, Closure::class]; } /** - * @param ClassMethod|Function_ $node + * @param ClassMethod|Function_|Closure $node */ - public function refactor(Node $node): ClassMethod|Function_|null + public function refactor(Node $node): ClassMethod|Function_|Closure|null { if ($node->stmts === null) { return null; From 9f0aa26fde48880a61941f855fdc932d698280d8 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 13 Oct 2025 13:46:35 +0200 Subject: [PATCH 2/3] add clarrow function fixxture --- .../Fixture/add_arrow_function.php.inc | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/add_arrow_function.php.inc diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/add_arrow_function.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/add_arrow_function.php.inc new file mode 100644 index 00000000000..702d3b9509a --- /dev/null +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/add_arrow_function.php.inc @@ -0,0 +1,27 @@ + sprintf('Hello %s', $name); + } +} + +?> +----- + sprintf('Hello %s', $name); + } +} + +?> From d5d6f292e5c346e7fb6c0527f32bcc54c2097917 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 13 Oct 2025 13:49:54 +0200 Subject: [PATCH 3/3] add arrow support to AddParamStringTypeFromSprintfUseRector --- .../VariableInSprintfMaskMatcher.php | 16 +++++++++++++--- .../AddParamStringTypeFromSprintfUseRector.php | 9 +++++---- .../Output/GitHubOutputFormatter.php | 6 +++++- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/rules/TypeDeclaration/NodeAnalyzer/VariableInSprintfMaskMatcher.php b/rules/TypeDeclaration/NodeAnalyzer/VariableInSprintfMaskMatcher.php index ec82735e904..91f2f697a38 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/VariableInSprintfMaskMatcher.php +++ b/rules/TypeDeclaration/NodeAnalyzer/VariableInSprintfMaskMatcher.php @@ -6,6 +6,7 @@ use Nette\Utils\Strings; use PhpParser\Node\Arg; +use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Variable; @@ -29,9 +30,18 @@ public function __construct( } - public function matchMask(ClassMethod|Function_|Closure $functionLike, string $variableName, string $mask): bool - { - $funcCalls = $this->betterNodeFinder->findInstancesOfScoped((array) $functionLike->stmts, FuncCall::class); + public function matchMask( + ClassMethod|Function_|Closure|ArrowFunction $functionLike, + string $variableName, + string $mask + ): bool { + if ($functionLike instanceof ArrowFunction) { + $stmts = [$functionLike->expr]; + } else { + $stmts = (array) $functionLike->stmts; + } + + $funcCalls = $this->betterNodeFinder->findInstancesOfScoped($stmts, FuncCall::class); $funcCalls = array_values( array_filter($funcCalls, fn (FuncCall $funcCall): bool => $this->nodeNameResolver->isName( $funcCall->name, diff --git a/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php b/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php index bff5d93c46e..4260b60f0ab 100644 --- a/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php +++ b/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; +use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Identifier; use PhpParser\Node\Scalar\String_; @@ -62,15 +63,15 @@ public function formatMessage(string $name) */ public function getNodeTypes(): array { - return [ClassMethod::class, Function_::class, Closure::class]; + return [ClassMethod::class, Function_::class, Closure::class, ArrowFunction::class]; } /** - * @param ClassMethod|Function_|Closure $node + * @param ClassMethod|Function_|Closure|ArrowFunction $node */ - public function refactor(Node $node): ClassMethod|Function_|Closure|null + public function refactor(Node $node): ClassMethod|Function_|Closure|ArrowFunction|null { - if ($node->stmts === null) { + if ($node instanceof ClassMethod && $node->stmts === null) { return null; } diff --git a/src/ChangesReporting/Output/GitHubOutputFormatter.php b/src/ChangesReporting/Output/GitHubOutputFormatter.php index 56633532276..6ba0e99aa7e 100644 --- a/src/ChangesReporting/Output/GitHubOutputFormatter.php +++ b/src/ChangesReporting/Output/GitHubOutputFormatter.php @@ -131,7 +131,11 @@ private function sanitizeAnnotationProperties(array $annotationProperties): stri ); $sanitizedProperties = array_map( - fn (string $key, string|int|null $value): string => sprintf('%s=%s', $key, $this->sanitizeAnnotationProperty($value)), + fn (string $key, string|int|null $value): string => sprintf( + '%s=%s', + $key, + $this->sanitizeAnnotationProperty($value) + ), array_keys($nonNullProperties), $nonNullProperties );