From 6e0809f15234d47dcaae300594459a2ff50dadcb Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 15 Jan 2026 19:43:25 +0700 Subject: [PATCH 1/3] [Php74] Skip closure in attribute on ClosureToArrowFunctionRector --- rules/Php74/Rector/Closure/ClosureToArrowFunctionRector.php | 4 ++++ src/NodeTypeResolver/Node/AttributeKey.php | 5 +++++ src/PhpParser/NodeVisitor/ContextNodeVisitor.php | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/rules/Php74/Rector/Closure/ClosureToArrowFunctionRector.php b/rules/Php74/Rector/Closure/ClosureToArrowFunctionRector.php index 2216cd5906a..416d7af0913 100644 --- a/rules/Php74/Rector/Closure/ClosureToArrowFunctionRector.php +++ b/rules/Php74/Rector/Closure/ClosureToArrowFunctionRector.php @@ -73,6 +73,10 @@ public function refactor(Node $node): ?Node return null; } + if ($node->getAttribute(AttributeKey::IS_CLOSURE_IN_ATTRIBUTE) === true) { + return null; + } + $attributes = $node->getAttributes(); unset($attributes[AttributeKey::ORIGINAL_NODE]); diff --git a/src/NodeTypeResolver/Node/AttributeKey.php b/src/NodeTypeResolver/Node/AttributeKey.php index 46a6d5a0037..6febed2c55f 100644 --- a/src/NodeTypeResolver/Node/AttributeKey.php +++ b/src/NodeTypeResolver/Node/AttributeKey.php @@ -187,6 +187,11 @@ final class AttributeKey */ public const IS_ARRAY_IN_ATTRIBUTE = 'is_array_in_attribute'; + /** + * @var string + */ + public const IS_CLOSURE_IN_ATTRIBUTE = 'is_closure_in_attribute'; + /** * @var string */ diff --git a/src/PhpParser/NodeVisitor/ContextNodeVisitor.php b/src/PhpParser/NodeVisitor/ContextNodeVisitor.php index 37d187aeb2c..4d147b6a9cb 100644 --- a/src/PhpParser/NodeVisitor/ContextNodeVisitor.php +++ b/src/PhpParser/NodeVisitor/ContextNodeVisitor.php @@ -145,6 +145,10 @@ static function (Node $subNode): null { $subNode->setAttribute(AttributeKey::IS_ARRAY_IN_ATTRIBUTE, true); } + if ($subNode instanceof Closure) { + $subNode->setAttribute(AttributeKey::IS_CLOSURE_IN_ATTRIBUTE, true); + } + return null; } ); From 5066d72970a4403f69d6a71e95683cc51c6ecfb3 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 15 Jan 2026 19:43:28 +0700 Subject: [PATCH 2/3] [Php74] Skip closure in attribute on ClosureToArrowFunctionRector --- .../Fixture/skip_inside_attribute.php.inc | 14 ++++++++++++++ .../Fixture/dynamic_value.php | 13 +++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 rules-tests/Php74/Rector/Closure/ClosureToArrowFunctionRector/Fixture/skip_inside_attribute.php.inc create mode 100644 rules-tests/Php83/Rector/FuncCall/CombineHostPortLdapUriRector/Fixture/dynamic_value.php diff --git a/rules-tests/Php74/Rector/Closure/ClosureToArrowFunctionRector/Fixture/skip_inside_attribute.php.inc b/rules-tests/Php74/Rector/Closure/ClosureToArrowFunctionRector/Fixture/skip_inside_attribute.php.inc new file mode 100644 index 00000000000..72e9b75296c --- /dev/null +++ b/rules-tests/Php74/Rector/Closure/ClosureToArrowFunctionRector/Fixture/skip_inside_attribute.php.inc @@ -0,0 +1,14 @@ + From b1cb0563eacdaa0dc7e25e9276d6cb560a80ddf4 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 15 Jan 2026 19:44:02 +0700 Subject: [PATCH 3/3] [Php74] Skip closure in attribute on ClosureToArrowFunctionRector --- .../Fixture/dynamic_value.php | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 rules-tests/Php83/Rector/FuncCall/CombineHostPortLdapUriRector/Fixture/dynamic_value.php diff --git a/rules-tests/Php83/Rector/FuncCall/CombineHostPortLdapUriRector/Fixture/dynamic_value.php b/rules-tests/Php83/Rector/FuncCall/CombineHostPortLdapUriRector/Fixture/dynamic_value.php deleted file mode 100644 index 686e7017de2..00000000000 --- a/rules-tests/Php83/Rector/FuncCall/CombineHostPortLdapUriRector/Fixture/dynamic_value.php +++ /dev/null @@ -1,13 +0,0 @@ -