From 0d0894845e4c12161ffc671e281fe1f105d76a45 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 10 Dec 2025 03:09:30 +0700 Subject: [PATCH 1/2] [Php81] Skip on Param default on ArrayToFirstClassCallableRector --- .../Fixture/skip_on_param.php.inc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 rules-tests/Php81/Rector/Array_/ArrayToFirstClassCallableRector/Fixture/skip_on_param.php.inc diff --git a/rules-tests/Php81/Rector/Array_/ArrayToFirstClassCallableRector/Fixture/skip_on_param.php.inc b/rules-tests/Php81/Rector/Array_/ArrayToFirstClassCallableRector/Fixture/skip_on_param.php.inc new file mode 100644 index 00000000000..4cdfe7e2d4c --- /dev/null +++ b/rules-tests/Php81/Rector/Array_/ArrayToFirstClassCallableRector/Fixture/skip_on_param.php.inc @@ -0,0 +1,14 @@ + Date: Wed, 10 Dec 2025 03:14:22 +0700 Subject: [PATCH 2/2] fix --- .../ArrayToFirstClassCallableRector.php | 4 +++ .../LazyContainerFactory.php | 2 ++ src/NodeTypeResolver/Node/AttributeKey.php | 5 +++ .../NodeVisitor/ParamDefaultNodeVisitor.php | 35 +++++++++++++++++++ 4 files changed, 46 insertions(+) create mode 100644 src/PhpParser/NodeVisitor/ParamDefaultNodeVisitor.php diff --git a/rules/Php81/Rector/Array_/ArrayToFirstClassCallableRector.php b/rules/Php81/Rector/Array_/ArrayToFirstClassCallableRector.php index 12c8e180cd9..390cd36d440 100644 --- a/rules/Php81/Rector/Array_/ArrayToFirstClassCallableRector.php +++ b/rules/Php81/Rector/Array_/ArrayToFirstClassCallableRector.php @@ -113,6 +113,10 @@ public function refactor(Node $node): StaticCall|MethodCall|null return null; } + if ($node->getAttribute(AttributeKey::IS_PARAM_DEFAULT)) { + return null; + } + $args = [new VariadicPlaceholder()]; if ($callerExpr instanceof ClassConstFetch) { $type = $this->getType($callerExpr->class); diff --git a/src/DependencyInjection/LazyContainerFactory.php b/src/DependencyInjection/LazyContainerFactory.php index b86956123f3..9379d8cb6b2 100644 --- a/src/DependencyInjection/LazyContainerFactory.php +++ b/src/DependencyInjection/LazyContainerFactory.php @@ -125,6 +125,7 @@ use Rector\PhpParser\NodeVisitor\ContextNodeVisitor; use Rector\PhpParser\NodeVisitor\GlobalVariableNodeVisitor; use Rector\PhpParser\NodeVisitor\NameNodeVisitor; +use Rector\PhpParser\NodeVisitor\ParamDefaultNodeVisitor; use Rector\PhpParser\NodeVisitor\PhpVersionConditionNodeVisitor; use Rector\PhpParser\NodeVisitor\PropertyOrClassConstDefaultNodeVisitor; use Rector\PhpParser\NodeVisitor\StaticVariableNodeVisitor; @@ -253,6 +254,7 @@ final class LazyContainerFactory NameNodeVisitor::class, StaticVariableNodeVisitor::class, PropertyOrClassConstDefaultNodeVisitor::class, + ParamDefaultNodeVisitor::class, ClassConstFetchNodeVisitor::class, ]; diff --git a/src/NodeTypeResolver/Node/AttributeKey.php b/src/NodeTypeResolver/Node/AttributeKey.php index d3c93956907..fc29bc182fa 100644 --- a/src/NodeTypeResolver/Node/AttributeKey.php +++ b/src/NodeTypeResolver/Node/AttributeKey.php @@ -217,6 +217,11 @@ final class AttributeKey */ public const IS_PARAM_VAR = 'is_param_var'; + /** + * @var string + */ + public const IS_PARAM_DEFAULT = 'is_param_default'; + /** * @var string */ diff --git a/src/PhpParser/NodeVisitor/ParamDefaultNodeVisitor.php b/src/PhpParser/NodeVisitor/ParamDefaultNodeVisitor.php new file mode 100644 index 00000000000..9f48c62aac0 --- /dev/null +++ b/src/PhpParser/NodeVisitor/ParamDefaultNodeVisitor.php @@ -0,0 +1,35 @@ +default instanceof Expr) { + return null; + } + + SimpleNodeTraverser::decorateWithAttributeValue( + $node->default, + AttributeKey::IS_PARAM_DEFAULT, + true + ); + + return null; + } +}