From d5eec9bfc0f83e866f7b076c3d76f5499b749b38 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 14 Oct 2025 23:47:09 +0700 Subject: [PATCH 1/2] [DeadCode] Do not remove parenthess on RemoveConcatAutocastRector --- .../Fixture/do_not_remove_parentheses.php.inc | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 rules-tests/DeadCode/Rector/Concat/RemoveConcatAutocastRector/Fixture/do_not_remove_parentheses.php.inc diff --git a/rules-tests/DeadCode/Rector/Concat/RemoveConcatAutocastRector/Fixture/do_not_remove_parentheses.php.inc b/rules-tests/DeadCode/Rector/Concat/RemoveConcatAutocastRector/Fixture/do_not_remove_parentheses.php.inc new file mode 100644 index 00000000000..0a2c26f8961 --- /dev/null +++ b/rules-tests/DeadCode/Rector/Concat/RemoveConcatAutocastRector/Fixture/do_not_remove_parentheses.php.inc @@ -0,0 +1,27 @@ + +----- + From b6dbbee91ff0cf6ea5b12045ec984f971c8fc065 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 15 Oct 2025 00:20:05 +0700 Subject: [PATCH 2/2] fix --- .../Fixture/do_not_remove_parentheses.php.inc | 2 +- .../Concat/RemoveConcatAutocastRector.php | 23 ++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/rules-tests/DeadCode/Rector/Concat/RemoveConcatAutocastRector/Fixture/do_not_remove_parentheses.php.inc b/rules-tests/DeadCode/Rector/Concat/RemoveConcatAutocastRector/Fixture/do_not_remove_parentheses.php.inc index 0a2c26f8961..126248703ec 100644 --- a/rules-tests/DeadCode/Rector/Concat/RemoveConcatAutocastRector/Fixture/do_not_remove_parentheses.php.inc +++ b/rules-tests/DeadCode/Rector/Concat/RemoveConcatAutocastRector/Fixture/do_not_remove_parentheses.php.inc @@ -6,7 +6,7 @@ class DoNotRemoveParentheses { public function run($value) { - return "Hello, " . (string)($value['name'] ?? 'World'); + return "Hello, " . (string) ($value['name'] ?? 'World'); } } diff --git a/rules/DeadCode/Rector/Concat/RemoveConcatAutocastRector.php b/rules/DeadCode/Rector/Concat/RemoveConcatAutocastRector.php index 1f81650d7d0..2ab1a6b09f7 100644 --- a/rules/DeadCode/Rector/Concat/RemoveConcatAutocastRector.php +++ b/rules/DeadCode/Rector/Concat/RemoveConcatAutocastRector.php @@ -6,8 +6,10 @@ use PhpParser\Node; use PhpParser\Node\Expr; +use PhpParser\Node\Expr\BinaryOp; use PhpParser\Node\Expr\BinaryOp\Concat; use PhpParser\Node\Expr\Cast\String_; +use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -72,6 +74,25 @@ public function refactor(Node $node): ?Node private function removeStringCast(Expr $expr): Expr { - return $expr instanceof String_ ? $expr->expr : $expr; + if (! $expr instanceof String_) { + return $expr; + } + + $targetExpr = $expr->expr; + $tokens = $this->file->getOldTokens(); + + if ($expr->expr instanceof BinaryOp) { + $castStartTokenPos = $expr->getStartTokenPos(); + $targetExprStartTokenPos = $targetExpr->getStartTokenPos(); + + while (++$castStartTokenPos < $targetExprStartTokenPos) { + if (isset($tokens[$castStartTokenPos]) && (string) $tokens[$castStartTokenPos] === '(') { + $targetExpr->setAttribute(AttributeKey::WRAPPED_IN_PARENTHESES, true); + break; + } + } + } + + return $targetExpr; } }