From 27885425c27d1e3aea1a8f9b84182b3ee763468d Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sun, 23 Jun 2024 02:08:53 +0900 Subject: [PATCH] [Renaming] Add RenameAttributeRector --- .../Fixture/fixture.php.inc | 31 ++++++ .../Fixture/multiple-places.php.inc | 33 ++++++ .../RenameAttributeRectorTest.php | 28 +++++ .../Source/NextRoute.php | 8 ++ .../Source/SimpleRoute.php | 8 ++ .../config/configured_rule.php | 16 +++ .../Rector/Class_/RenameAttributeRector.php | 105 ++++++++++++++++++ .../Renaming/ValueObject/RenameAttribute.php | 27 +++++ 8 files changed, 256 insertions(+) create mode 100644 rules-tests/Renaming/Rector/Class_/RenameAttributeRector/Fixture/fixture.php.inc create mode 100644 rules-tests/Renaming/Rector/Class_/RenameAttributeRector/Fixture/multiple-places.php.inc create mode 100644 rules-tests/Renaming/Rector/Class_/RenameAttributeRector/RenameAttributeRectorTest.php create mode 100644 rules-tests/Renaming/Rector/Class_/RenameAttributeRector/Source/NextRoute.php create mode 100644 rules-tests/Renaming/Rector/Class_/RenameAttributeRector/Source/SimpleRoute.php create mode 100644 rules-tests/Renaming/Rector/Class_/RenameAttributeRector/config/configured_rule.php create mode 100644 rules/Renaming/Rector/Class_/RenameAttributeRector.php create mode 100644 rules/Renaming/ValueObject/RenameAttribute.php diff --git a/rules-tests/Renaming/Rector/Class_/RenameAttributeRector/Fixture/fixture.php.inc b/rules-tests/Renaming/Rector/Class_/RenameAttributeRector/Fixture/fixture.php.inc new file mode 100644 index 00000000000..84eaeebce43 --- /dev/null +++ b/rules-tests/Renaming/Rector/Class_/RenameAttributeRector/Fixture/fixture.php.inc @@ -0,0 +1,31 @@ + +----- + diff --git a/rules-tests/Renaming/Rector/Class_/RenameAttributeRector/Fixture/multiple-places.php.inc b/rules-tests/Renaming/Rector/Class_/RenameAttributeRector/Fixture/multiple-places.php.inc new file mode 100644 index 00000000000..d829c458e74 --- /dev/null +++ b/rules-tests/Renaming/Rector/Class_/RenameAttributeRector/Fixture/multiple-places.php.inc @@ -0,0 +1,33 @@ + +----- + diff --git a/rules-tests/Renaming/Rector/Class_/RenameAttributeRector/RenameAttributeRectorTest.php b/rules-tests/Renaming/Rector/Class_/RenameAttributeRector/RenameAttributeRectorTest.php new file mode 100644 index 00000000000..7ff30edac8a --- /dev/null +++ b/rules-tests/Renaming/Rector/Class_/RenameAttributeRector/RenameAttributeRectorTest.php @@ -0,0 +1,28 @@ +doTestFile($filePath); + } + + public static function provideData(): Iterator + { + return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/configured_rule.php'; + } +} diff --git a/rules-tests/Renaming/Rector/Class_/RenameAttributeRector/Source/NextRoute.php b/rules-tests/Renaming/Rector/Class_/RenameAttributeRector/Source/NextRoute.php new file mode 100644 index 00000000000..c8840b57fe5 --- /dev/null +++ b/rules-tests/Renaming/Rector/Class_/RenameAttributeRector/Source/NextRoute.php @@ -0,0 +1,8 @@ +ruleWithConfiguration(RenameAttributeRector::class, [ + new \Rector\Renaming\ValueObject\RenameAttribute( + 'Rector\Tests\Renaming\Rector\Class_\RenameAttributeRector\Source\SimpleRoute', + 'Rector\Tests\Renaming\Rector\Class_\RenameAttributeRector\Source\NextRoute' + ), + ]); +}; diff --git a/rules/Renaming/Rector/Class_/RenameAttributeRector.php b/rules/Renaming/Rector/Class_/RenameAttributeRector.php new file mode 100644 index 00000000000..6f4dc328b6e --- /dev/null +++ b/rules/Renaming/Rector/Class_/RenameAttributeRector.php @@ -0,0 +1,105 @@ +> + */ + public function getNodeTypes(): array + { + return [Class_::class, ClassMethod::class, Property::class]; + } + + /** + * @param Class_|ClassMethod|Property $node + */ + public function refactor(Node $node): ?\PhpParser\Node + { + $hasChanged = false; + + foreach ($node->attrGroups as $attrGroup) { + foreach ($attrGroup->attrs as $attr) { + foreach ($this->renameAttributes as $renameAttribute) { + if ($this->isName($attr->name, $renameAttribute->getOldAttribute())) { + $attr->name = new FullyQualified($renameAttribute->getNewAttribute()); + + $hasChanged = true; + } + } + } + } + + if ($hasChanged) { + return $node; + } + + return null; + } + + /** + * @param mixed[] $configuration + */ + public function configure(array $configuration): void + { + Assert::allIsAOf($configuration, RenameAttribute::class); + + $this->renameAttributes = $configuration; + } + + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::ATTRIBUTES; + } +} diff --git a/rules/Renaming/ValueObject/RenameAttribute.php b/rules/Renaming/ValueObject/RenameAttribute.php new file mode 100644 index 00000000000..285a84bc712 --- /dev/null +++ b/rules/Renaming/ValueObject/RenameAttribute.php @@ -0,0 +1,27 @@ +oldAttribute; + } + + public function getNewAttribute(): string + { + return $this->newAttribute; + } +}