From c7ea41612d0c845c010ae2ae0e9e14cca09a114f Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 28 Mar 2026 14:26:21 +0700 Subject: [PATCH 1/7] [Arguments] Skip self class const fetch inside this class itself on ReplaceArgumentDefaultValueRector --- .../Fixture/skip_self.php.inc | 13 +++++++++++++ .../config/configured_rule.php | 2 ++ .../Arguments/ArgumentDefaultValueReplacer.php | 18 ++++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 rules-tests/Arguments/Rector/ClassMethod/ReplaceArgumentDefaultValueRector/Fixture/skip_self.php.inc diff --git a/rules-tests/Arguments/Rector/ClassMethod/ReplaceArgumentDefaultValueRector/Fixture/skip_self.php.inc b/rules-tests/Arguments/Rector/ClassMethod/ReplaceArgumentDefaultValueRector/Fixture/skip_self.php.inc new file mode 100644 index 00000000000..5bdd4e5aac9 --- /dev/null +++ b/rules-tests/Arguments/Rector/ClassMethod/ReplaceArgumentDefaultValueRector/Fixture/skip_self.php.inc @@ -0,0 +1,13 @@ +getValueBefore() ) && $argValue === $replaceArgumentDefaultValue->getValueBefore()) { + $scope = ScopeFetcher::fetch($particularArg); + if ($scope->getClassReflection() instanceof ClassReflection + && $particularArg->value instanceof ClassConstFetch + && $particularArg->value->class instanceof Name + && $particularArg->value->class->isSpecialClassName()) { + $classReflection = $scope->getClassReflection(); + $type = $this->nodeTypeResolver->getType($particularArg->value->class); + if ($type instanceof FullyQualifiedObjectType && $classReflection->getName() === $type->getClassName()) { + return null; + } + } + $particularArg->value = $this->normalizeValue($replaceArgumentDefaultValue->getValueAfter()); return $expr; } From 046074b91c9eef6b6f8aa749d8f13e577ed82b09 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sat, 28 Mar 2026 07:29:57 +0000 Subject: [PATCH 2/7] [ci-review] Rector Rectify --- src/Caching/Config/FileHashComputer.php | 8 ++++---- src/Configuration/RectorConfigBuilder.php | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Caching/Config/FileHashComputer.php b/src/Caching/Config/FileHashComputer.php index 69905400560..ce084d61ec3 100644 --- a/src/Caching/Config/FileHashComputer.php +++ b/src/Caching/Config/FileHashComputer.php @@ -12,13 +12,13 @@ /** * Inspired by https://github.com/symplify/easy-coding-standard/blob/e598ab54686e416788f28fcfe007fd08e0f371d9/packages/changed-files-detector/src/FileHashComputer.php */ -final class FileHashComputer +final readonly class FileHashComputer { /** * @param CacheMetaExtensionInterface[] $cacheMetaExtensions */ public function __construct( - private readonly array $cacheMetaExtensions = [] + private array $cacheMetaExtensions = [] ) { } @@ -34,8 +34,8 @@ public function compute(string $filePath): string private function computeExtensionHash(): string { $extensionHash = ''; - foreach ($this->cacheMetaExtensions as $cacheMetaExtension) { - $extensionHash .= $cacheMetaExtension->getKey() . ':' . $cacheMetaExtension->getHash(); + foreach ($this->cacheMetaExtensions as $cacheMetumExtension) { + $extensionHash .= $cacheMetumExtension->getKey() . ':' . $cacheMetumExtension->getHash(); } return $extensionHash; diff --git a/src/Configuration/RectorConfigBuilder.php b/src/Configuration/RectorConfigBuilder.php index bb7c3c8b676..2a4963e29f0 100644 --- a/src/Configuration/RectorConfigBuilder.php +++ b/src/Configuration/RectorConfigBuilder.php @@ -322,8 +322,8 @@ public function __invoke(RectorConfig $rectorConfig): void $rectorConfig->containerCacheDirectory($this->containerCacheDirectory); } - foreach ($this->cacheMetaExtensions as $cacheMetaExtensionClass) { - $rectorConfig->cacheMetaExtension($cacheMetaExtensionClass); + foreach ($this->cacheMetaExtensions as $cacheMetumExtension) { + $rectorConfig->cacheMetaExtension($cacheMetumExtension); } if ($this->importNames || $this->importDocBlockNames) { From f846cd58af94e3222703bc6240664f794bc08eed Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 28 Mar 2026 14:40:30 +0700 Subject: [PATCH 3/7] allow from other base class --- rules/Arguments/ArgumentDefaultValueReplacer.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/rules/Arguments/ArgumentDefaultValueReplacer.php b/rules/Arguments/ArgumentDefaultValueReplacer.php index b806593ba73..8b3e53deacc 100644 --- a/rules/Arguments/ArgumentDefaultValueReplacer.php +++ b/rules/Arguments/ArgumentDefaultValueReplacer.php @@ -15,7 +15,6 @@ use PhpParser\Node\Expr\Variable; use PhpParser\Node\Name; use PhpParser\Node\Stmt\ClassMethod; -use PHPStan\Reflection\ClassReflection; use Rector\Arguments\Contract\ReplaceArgumentDefaultValueInterface; use Rector\Arguments\ValueObject\ReplaceArgumentDefaultValue; use Rector\NodeAnalyzer\ArgsAnalyzer; @@ -23,7 +22,6 @@ use Rector\PhpParser\AstResolver; use Rector\PhpParser\Node\NodeFactory; use Rector\PhpParser\Node\Value\ValueResolver; -use Rector\PHPStan\ScopeFetcher; use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType; final readonly class ArgumentDefaultValueReplacer @@ -159,14 +157,16 @@ private function processArgs( if (is_scalar( $replaceArgumentDefaultValue->getValueBefore() ) && $argValue === $replaceArgumentDefaultValue->getValueBefore()) { - $scope = ScopeFetcher::fetch($particularArg); - if ($scope->getClassReflection() instanceof ClassReflection - && $particularArg->value instanceof ClassConstFetch + if ($particularArg->value instanceof ClassConstFetch && $particularArg->value->class instanceof Name - && $particularArg->value->class->isSpecialClassName()) { - $classReflection = $scope->getClassReflection(); + && $particularArg->value->class->isSpecialClassName() + && is_string($replaceArgumentDefaultValue->getValueAfter()) + && str_contains($replaceArgumentDefaultValue->getValueAfter(), '::')) { + [$targetClass, $targetConstant] = explode('::', $replaceArgumentDefaultValue->getValueAfter()); $type = $this->nodeTypeResolver->getType($particularArg->value->class); - if ($type instanceof FullyQualifiedObjectType && $classReflection->getName() === $type->getClassName()) { + if ($type instanceof FullyQualifiedObjectType + && $type->getClassName() === $targetClass + && $particularArg->value->name->toString() === $targetConstant) { return null; } } From 0173dd004978cd96864cf5610f5c59909700540f Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 28 Mar 2026 14:40:37 +0700 Subject: [PATCH 4/7] allow from other base class --- .../Fixture/from_other_base_class.php.inc | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 rules-tests/Arguments/Rector/ClassMethod/ReplaceArgumentDefaultValueRector/Fixture/from_other_base_class.php.inc diff --git a/rules-tests/Arguments/Rector/ClassMethod/ReplaceArgumentDefaultValueRector/Fixture/from_other_base_class.php.inc b/rules-tests/Arguments/Rector/ClassMethod/ReplaceArgumentDefaultValueRector/Fixture/from_other_base_class.php.inc new file mode 100644 index 00000000000..489db75f211 --- /dev/null +++ b/rules-tests/Arguments/Rector/ClassMethod/ReplaceArgumentDefaultValueRector/Fixture/from_other_base_class.php.inc @@ -0,0 +1,31 @@ + +----- + \ No newline at end of file From 35f3bce20f1ebbff52d56115610d9c91b598ff14 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 28 Mar 2026 14:42:56 +0700 Subject: [PATCH 5/7] ensure verify normalized value --- rules/Arguments/ArgumentDefaultValueReplacer.php | 1 + 1 file changed, 1 insertion(+) diff --git a/rules/Arguments/ArgumentDefaultValueReplacer.php b/rules/Arguments/ArgumentDefaultValueReplacer.php index 8b3e53deacc..265f9082569 100644 --- a/rules/Arguments/ArgumentDefaultValueReplacer.php +++ b/rules/Arguments/ArgumentDefaultValueReplacer.php @@ -157,6 +157,7 @@ private function processArgs( if (is_scalar( $replaceArgumentDefaultValue->getValueBefore() ) && $argValue === $replaceArgumentDefaultValue->getValueBefore()) { + $normalizedValueAfter = $this->normalizeValue($replaceArgumentDefaultValue->getValueAfter()); if ($particularArg->value instanceof ClassConstFetch && $particularArg->value->class instanceof Name && $particularArg->value->class->isSpecialClassName() From c1d02ddc742f7bee77badfa29b975a93bac5be37 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 28 Mar 2026 14:43:11 +0700 Subject: [PATCH 6/7] ensure verify normalized value --- rules/Arguments/ArgumentDefaultValueReplacer.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rules/Arguments/ArgumentDefaultValueReplacer.php b/rules/Arguments/ArgumentDefaultValueReplacer.php index 265f9082569..e46e5fb31cd 100644 --- a/rules/Arguments/ArgumentDefaultValueReplacer.php +++ b/rules/Arguments/ArgumentDefaultValueReplacer.php @@ -161,6 +161,7 @@ private function processArgs( if ($particularArg->value instanceof ClassConstFetch && $particularArg->value->class instanceof Name && $particularArg->value->class->isSpecialClassName() + && $normalizedValueAfter instanceof ClassConstFetch && is_string($replaceArgumentDefaultValue->getValueAfter()) && str_contains($replaceArgumentDefaultValue->getValueAfter(), '::')) { [$targetClass, $targetConstant] = explode('::', $replaceArgumentDefaultValue->getValueAfter()); @@ -172,7 +173,7 @@ private function processArgs( } } - $particularArg->value = $this->normalizeValue($replaceArgumentDefaultValue->getValueAfter()); + $particularArg->value = $normalizedValueAfter; return $expr; } From a8f420855dbf8e8a289177ac589e94711d55fccb Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 28 Mar 2026 14:45:09 +0700 Subject: [PATCH 7/7] ensure verify normalized value --- rules/Arguments/ArgumentDefaultValueReplacer.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rules/Arguments/ArgumentDefaultValueReplacer.php b/rules/Arguments/ArgumentDefaultValueReplacer.php index e46e5fb31cd..d40d444db4b 100644 --- a/rules/Arguments/ArgumentDefaultValueReplacer.php +++ b/rules/Arguments/ArgumentDefaultValueReplacer.php @@ -13,6 +13,7 @@ use PhpParser\Node\Expr\New_; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\Variable; +use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Stmt\ClassMethod; use Rector\Arguments\Contract\ReplaceArgumentDefaultValueInterface; @@ -168,6 +169,7 @@ private function processArgs( $type = $this->nodeTypeResolver->getType($particularArg->value->class); if ($type instanceof FullyQualifiedObjectType && $type->getClassName() === $targetClass + && $particularArg->value->name instanceof Identifier && $particularArg->value->name->toString() === $targetConstant) { return null; }