From f32595d4689c1d8d6dd63d837cf7ec41fa0e8995 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 9 Feb 2026 10:54:40 +0700 Subject: [PATCH 1/4] [Symfony73] Skip with @Translate docblock on ConstraintOptionsToNamedArgumentsRector --- .../skip_with_translate_docblock.php.inc | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 rules-tests/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector/Fixture/skip_with_translate_docblock.php.inc diff --git a/rules-tests/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector/Fixture/skip_with_translate_docblock.php.inc b/rules-tests/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector/Fixture/skip_with_translate_docblock.php.inc new file mode 100644 index 000000000..e3d23847c --- /dev/null +++ b/rules-tests/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector/Fixture/skip_with_translate_docblock.php.inc @@ -0,0 +1,21 @@ +add('name', TextType::class, [ + 'constraints' => [ + new NotBlank(['message' => /** @Translate */ 'Name is required.']), + ], + ]); + } +} From 17f3979d026f538f8a6ff3efddaaf532236dca43 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 9 Feb 2026 10:56:39 +0700 Subject: [PATCH 2/4] fix --- ...onstraintOptionsToNamedArgumentsRector.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/rules/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector.php b/rules/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector.php index 48ef92f75..edef5d033 100644 --- a/rules/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector.php +++ b/rules/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector.php @@ -110,6 +110,7 @@ public function refactor(Node $node): ?Node $array = $node->args[0]->value; $namedArgs = []; + $oldTokens = $this->file->getOldTokens(); foreach ($array->items as $item) { if (! $item instanceof ArrayItem) { @@ -130,6 +131,24 @@ public function refactor(Node $node): ?Node continue; } + if ($item->key instanceof Expr) { + $lastTokenKey = $item->key->getEndTokenPos(); + $startTokenValue = $item->value->getStartTokenPos(); + + while ($lastTokenKey < $startTokenValue) { + ++$lastTokenKey; + + if (! isset($oldTokens[$lastTokenKey])) { + break; + } + + $token = $oldTokens[$lastTokenKey]; + if ($token->is(T_DOC_COMMENT)) { + return null; + } + } + } + $arg = new Arg($item->value); $arg->name = new Identifier($keyValue); From 28933ea4fe8db48f69d3a7c827be382a7b6058a9 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 9 Feb 2026 10:58:14 +0700 Subject: [PATCH 3/4] fix --- ...onstraintOptionsToNamedArgumentsRector.php | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/rules/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector.php b/rules/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector.php index edef5d033..f41884293 100644 --- a/rules/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector.php +++ b/rules/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector.php @@ -131,21 +131,19 @@ public function refactor(Node $node): ?Node continue; } - if ($item->key instanceof Expr) { - $lastTokenKey = $item->key->getEndTokenPos(); - $startTokenValue = $item->value->getStartTokenPos(); + $lastTokenKey = $item->key->getEndTokenPos(); + $startTokenValue = $item->value->getStartTokenPos(); - while ($lastTokenKey < $startTokenValue) { - ++$lastTokenKey; + while ($lastTokenKey < $startTokenValue) { + ++$lastTokenKey; - if (! isset($oldTokens[$lastTokenKey])) { - break; - } + if (! isset($oldTokens[$lastTokenKey])) { + break; + } - $token = $oldTokens[$lastTokenKey]; - if ($token->is(T_DOC_COMMENT)) { - return null; - } + $token = $oldTokens[$lastTokenKey]; + if ($token->is(T_DOC_COMMENT)) { + return null; } } From f9353339295285a721a627ec09c50694d9386ea4 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 9 Feb 2026 11:02:21 +0700 Subject: [PATCH 4/4] final touch: also skip comment --- .../skip_with_translate_comment.php.inc | 24 +++++++++++++++++++ ...onstraintOptionsToNamedArgumentsRector.php | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 rules-tests/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector/Fixture/skip_with_translate_comment.php.inc diff --git a/rules-tests/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector/Fixture/skip_with_translate_comment.php.inc b/rules-tests/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector/Fixture/skip_with_translate_comment.php.inc new file mode 100644 index 000000000..c313a1651 --- /dev/null +++ b/rules-tests/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector/Fixture/skip_with_translate_comment.php.inc @@ -0,0 +1,24 @@ +add('name', TextType::class, [ + 'constraints' => [ + new NotBlank(['message' => + // @Translate + 'Name is required.' + ]), + ], + ]); + } +} diff --git a/rules/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector.php b/rules/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector.php index f41884293..8e58dc5b7 100644 --- a/rules/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector.php +++ b/rules/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector.php @@ -142,7 +142,7 @@ public function refactor(Node $node): ?Node } $token = $oldTokens[$lastTokenKey]; - if ($token->is(T_DOC_COMMENT)) { + if ($token->is([T_DOC_COMMENT, T_COMMENT])) { return null; } }