From 2e22a31380622422c89210aa52b468c8e6beb23c Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sun, 12 Oct 2025 23:47:45 +0200 Subject: [PATCH 1/2] add fixture --- .../Fixture/constant_variable.php.inc | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/constant_variable.php.inc diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/constant_variable.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/constant_variable.php.inc new file mode 100644 index 00000000000..a92cded66b0 --- /dev/null +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/constant_variable.php.inc @@ -0,0 +1,29 @@ + +----- + From ae87e5cefd1a7abff29981bf5890e7d20d2f7082 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 13 Oct 2025 09:57:32 +0200 Subject: [PATCH 2/2] add constant string support to AddParamStringTypeFromSprintfUseRector --- .../Fixture/constant_variable.php.inc | 4 ++-- .../Stmt/RemoveConditionExactReturnRector.php | 2 -- .../NodeAnalyzer/VariableInSprintfMaskMatcher.php | 15 ++++++++++----- .../AddParamStringTypeFromSprintfUseRector.php | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/constant_variable.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/constant_variable.php.inc index a92cded66b0..ee917caad7f 100644 --- a/rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/constant_variable.php.inc +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector/Fixture/constant_variable.php.inc @@ -6,7 +6,7 @@ final class ConstantVariable { public function test(string $input, $name) { - $message = $input . 'is %s'; + $message = 'My name is %s'; return sprintf($message, $name); } } @@ -21,7 +21,7 @@ final class ConstantVariable { public function test(string $input, string $name) { - $message = $input . 'is %s'; + $message = 'My name is %s'; return sprintf($message, $name); } } diff --git a/rules/DeadCode/Rector/Stmt/RemoveConditionExactReturnRector.php b/rules/DeadCode/Rector/Stmt/RemoveConditionExactReturnRector.php index b7ccb574b5a..b9f76999273 100644 --- a/rules/DeadCode/Rector/Stmt/RemoveConditionExactReturnRector.php +++ b/rules/DeadCode/Rector/Stmt/RemoveConditionExactReturnRector.php @@ -8,8 +8,6 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\BinaryOp\Equal; use PhpParser\Node\Expr\BinaryOp\Identical; -use PhpParser\Node\Expr\MethodCall; -use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; diff --git a/rules/TypeDeclaration/NodeAnalyzer/VariableInSprintfMaskMatcher.php b/rules/TypeDeclaration/NodeAnalyzer/VariableInSprintfMaskMatcher.php index b69a16007b9..e0200020f0b 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/VariableInSprintfMaskMatcher.php +++ b/rules/TypeDeclaration/NodeAnalyzer/VariableInSprintfMaskMatcher.php @@ -8,17 +8,20 @@ use PhpParser\Node\Arg; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Variable; -use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use Rector\NodeNameResolver\NodeNameResolver; +use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\PhpParser\Node\BetterNodeFinder; +use Rector\PhpParser\Node\Value\ValueResolver; final readonly class VariableInSprintfMaskMatcher { public function __construct( private BetterNodeFinder $betterNodeFinder, private NodeNameResolver $nodeNameResolver, + private NodeTypeResolver $nodeTypeResolver, + private ValueResolver $valueResolver, ) { } @@ -43,14 +46,16 @@ public function matchMask(ClassMethod|Function_ $functionLike, string $variableN /** @var Arg $messageArg */ $messageArg = array_shift($args); - if (! $messageArg->value instanceof String_) { + + $type = $this->nodeTypeResolver->getType($messageArg->value); + + $messageValue = $this->valueResolver->getValue($messageArg->value); + if (! is_string($messageValue)) { continue; } - $string = $messageArg->value; - // match all %s, %d types by position - $masks = Strings::match($string->value, '#%[sd]#'); + $masks = Strings::match($messageValue, '#%[sd]#'); foreach ($args as $position => $arg) { if (! $arg->value instanceof Variable) { diff --git a/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php b/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php index 1b5bc35f8c8..4b6bdc6a10d 100644 --- a/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php +++ b/rules/TypeDeclaration/Rector/ClassMethod/AddParamStringTypeFromSprintfUseRector.php @@ -23,7 +23,7 @@ final class AddParamStringTypeFromSprintfUseRector extends AbstractRector { public function __construct( private readonly VariableInSprintfMaskMatcher $variableInSprintfMaskMatcher, - private readonly ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard + private readonly ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, ) { }