From 24b09649810e38a8f1a32f81b94bfc830e5193a8 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 26 Sep 2026 20:31:33 +0700 Subject: [PATCH 1/3] [Renaming] Rename both in trait and class property itself on RenamePropertyRector --- .../rename_both_trait_and_class.php.inc | 55 +++++++++++++++++++ .../config/configured_rule.php | 5 ++ .../PropertyFetch/RenamePropertyRector.php | 29 ++++++++-- 3 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 rules-tests/Renaming/Rector/PropertyFetch/RenamePropertyRector/Fixture/rename_both_trait_and_class.php.inc diff --git a/rules-tests/Renaming/Rector/PropertyFetch/RenamePropertyRector/Fixture/rename_both_trait_and_class.php.inc b/rules-tests/Renaming/Rector/PropertyFetch/RenamePropertyRector/Fixture/rename_both_trait_and_class.php.inc new file mode 100644 index 00000000000..627ba2f3d8b --- /dev/null +++ b/rules-tests/Renaming/Rector/PropertyFetch/RenamePropertyRector/Fixture/rename_both_trait_and_class.php.inc @@ -0,0 +1,55 @@ +config = $this->defaultConfig; + } +} + +final class UseTraitInClass +{ + use InstanceConfigTrait; + + protected array $defaultConfig = [ + 'fields' => [], + ]; +} + +?> +----- +config = $this->defaultConfigNew; + } +} + +final class UseTraitInClass +{ + use InstanceConfigTrait; + + protected array $defaultConfigNew = [ + 'fields' => [], + ]; +} + +?> \ No newline at end of file diff --git a/rules-tests/Renaming/Rector/PropertyFetch/RenamePropertyRector/config/configured_rule.php b/rules-tests/Renaming/Rector/PropertyFetch/RenamePropertyRector/config/configured_rule.php index c49d413530f..17dae57d7dc 100644 --- a/rules-tests/Renaming/Rector/PropertyFetch/RenamePropertyRector/config/configured_rule.php +++ b/rules-tests/Renaming/Rector/PropertyFetch/RenamePropertyRector/config/configured_rule.php @@ -39,5 +39,10 @@ '_config', 'config' ), + new RenameProperty( + 'Rector\Tests\Renaming\Rector\PropertyFetch\RenamePropertyRector\Fixture\InstanceConfigTrait', + 'defaultConfig', + 'defaultConfigNew' + ), ]); }; diff --git a/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php b/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php index c995057363a..7e76e462a54 100644 --- a/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php +++ b/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php @@ -11,9 +11,11 @@ use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\Property; use PhpParser\Node\VarLikeIdentifier; +use PHPStan\Reflection\ClassReflection; use PHPStan\Type\ObjectType; use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\Rector\AbstractRector; +use Rector\Reflection\ReflectionResolver; use Rector\Renaming\ValueObject\RenameProperty; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -31,6 +33,11 @@ final class RenamePropertyRector extends AbstractRector implements ConfigurableR private bool $hasChanged = false; + public function __construct( + private readonly ReflectionResolver $reflectionResolver + ) { + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace defined old properties by new ones', [ @@ -83,6 +90,11 @@ public function configure(array $configuration): void private function renameProperty(ClassLike $classLike, RenameProperty $renameProperty): void { + $property = $classLike->getProperty($renameProperty->getOldProperty()); + if (! $property instanceof Property) { + return; + } + $classLikeName = (string) $this->getName($classLike); $renamePropertyObjectType = $renameProperty->getObjectType(); $className = $renamePropertyObjectType->getClassName(); @@ -92,12 +104,7 @@ private function renameProperty(ClassLike $classLike, RenameProperty $renameProp $isSuperType = $classNameObjectType->isSuperTypeOf($classLikeNameObjectType) ->yes(); - if ($classLikeName !== $className && ! $isSuperType) { - return; - } - - $property = $classLike->getProperty($renameProperty->getOldProperty()); - if (! $property instanceof Property) { + if ($classLikeName !== $className && ! $isSuperType && ! $this->isUsingTrait($classLike, $className)) { return; } @@ -111,6 +118,16 @@ private function renameProperty(ClassLike $classLike, RenameProperty $renameProp $property->props[0]->name = new VarLikeIdentifier($newProperty); } + private function isUsingTrait(ClassLike $classLike, string $traitName): bool + { + $classReflection = $this->reflectionResolver->resolveClassReflection($classLike); + if (! $classReflection instanceof ClassReflection) { + return false; + } + + return $classReflection->hasTraitUse($traitName); + } + private function refactorPropertyFetch( PropertyFetch|StaticPropertyFetch $propertyFetch ): null|PropertyFetch|StaticPropertyFetch { From a5d967e12c302e21f93db282e138c821cba76f23 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sat, 26 Sep 2026 13:33:12 +0000 Subject: [PATCH 2/3] [ci-review] Rector Rectify --- .../FileAndDirectoryFilter/FileAndDirectoryFilterTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/FileSystem/FileAndDirectoryFilter/FileAndDirectoryFilterTest.php b/tests/FileSystem/FileAndDirectoryFilter/FileAndDirectoryFilterTest.php index 26c974c21e9..f419bcc320c 100644 --- a/tests/FileSystem/FileAndDirectoryFilter/FileAndDirectoryFilterTest.php +++ b/tests/FileSystem/FileAndDirectoryFilter/FileAndDirectoryFilterTest.php @@ -26,7 +26,7 @@ public function testSeparateFilesAndDirectories(): void $this->assertCount(1, $files); $this->assertCount(1, $directories); - $this->assertSame($files, [__DIR__ . '/FileAndDirectoryFilterTest.php']); - $this->assertSame($directories, [__DIR__]); + $this->assertSame([__DIR__ . '/FileAndDirectoryFilterTest.php'], $files); + $this->assertSame([__DIR__], $directories); } } From e04cdcc00c98ad6f962e55df247c6e81ef0eb0b7 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sun, 27 Sep 2026 01:03:54 +0700 Subject: [PATCH 3/3] fix phpstan --- phpstan.neon | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/phpstan.neon b/phpstan.neon index 99adf237a33..bfa9e7ae794 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,5 +1,4 @@ includes: - - vendor/symplify/phpstan-rules/config/symplify-rules.neon - vendor/symplify/phpstan-rules/config/rector-rules.neon rules: @@ -422,3 +421,19 @@ parameters: - identifier: varTag.nativeType path: src/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser.php + + + - + identifier: symplify.noNullableServiceInConstructor + paths: + - src/NodeTypeResolver/PHPStan/ObjectWithoutClassTypeWithParentTypes.php + + - identifier: symplify.commandHasAsCommandAttribute + paths: + - src/Console/Command/ValidateConfigCommand.php + - src/Console/Command/WorkerCommand.php + - src/Console/Command/ProcessCommand.php + - src/Console/Command/ListRulesCommand.php + - src/Console/Command/CustomRuleCommand.php + - src/Console/Command/ComposerBasedCommand.php + - src/Console/Command/SetupCICommand.php \ No newline at end of file