From 767188643ac1bb301dd4eef20de4714ac6363400 Mon Sep 17 00:00:00 2001 From: Dawid Parafinski Date: Mon, 16 Sep 2024 15:56:44 +0200 Subject: [PATCH] IBX-8534: Added rule for replacing interfaces --- src/contracts/Sets/ibexa-50.php | 9 +++ src/lib/Rule/ReplaceInterfaceRector.php | 74 +++++++++++++++++++ .../Fixture/some_class.php.inc | 19 +++++ .../ReplaceInterfaceRectorTest.php | 34 +++++++++ .../config/configured_rule.php | 21 ++++++ .../Fixture/rename_variation_interface.inc | 23 ++++++ 6 files changed, 180 insertions(+) create mode 100644 src/lib/Rule/ReplaceInterfaceRector.php create mode 100644 tests/lib/Rule/ReplaceInterfaceRector/Fixture/some_class.php.inc create mode 100644 tests/lib/Rule/ReplaceInterfaceRector/ReplaceInterfaceRectorTest.php create mode 100644 tests/lib/Rule/ReplaceInterfaceRector/config/configured_rule.php create mode 100644 tests/lib/Sets/Ibexa50/Fixture/rename_variation_interface.inc diff --git a/src/contracts/Sets/ibexa-50.php b/src/contracts/Sets/ibexa-50.php index fd2c335..075c21f 100644 --- a/src/contracts/Sets/ibexa-50.php +++ b/src/contracts/Sets/ibexa-50.php @@ -10,6 +10,7 @@ use Ibexa\Rector\Rule\PropertyToGetterRector; use Ibexa\Rector\Rule\RemoveArgumentFromMethodCallRector; +use Ibexa\Rector\Rule\ReplaceInterfaceRector; use Rector\Config\RectorConfig; use Rector\Renaming\Rector\ClassConstFetch\RenameClassConstFetchRector; use Rector\Renaming\Rector\MethodCall\RenameMethodRector; @@ -114,4 +115,12 @@ ], ] ); + + $rectorConfig->ruleWithConfiguration( + ReplaceInterfaceRector::class, + [ + 'to_replace' => 'Ibexa\Bundle\Core\Imagine\VariationPathGenerator', + 'replace_with' => 'Ibexa\Contracts\Core\Variation\VariationPathGenerator', + ] + ); }; diff --git a/src/lib/Rule/ReplaceInterfaceRector.php b/src/lib/Rule/ReplaceInterfaceRector.php new file mode 100644 index 0000000..41e1481 --- /dev/null +++ b/src/lib/Rule/ReplaceInterfaceRector.php @@ -0,0 +1,74 @@ +> + */ + public function getNodeTypes(): array + { + return [Class_::class]; + } + + /** + * @param \PhpParser\Node\Stmt\Class_ $node + */ + public function refactor(Node $node): ?Node + { + foreach ($node->implements as $key => $implement) { + if ($this->isName($implement, $this->interfaceToBeReplaced)) { + $node->implements[$key] = new Name($this->interfaceToReplaceWith); + } + } + + return $node; + } + + public function configure(array $configuration): void + { + $this->interfaceToBeReplaced = $configuration['to_replace']; + $this->interfaceToReplaceWith = $configuration['replace_with']; + } +} diff --git a/tests/lib/Rule/ReplaceInterfaceRector/Fixture/some_class.php.inc b/tests/lib/Rule/ReplaceInterfaceRector/Fixture/some_class.php.inc new file mode 100644 index 0000000..4ac3240 --- /dev/null +++ b/tests/lib/Rule/ReplaceInterfaceRector/Fixture/some_class.php.inc @@ -0,0 +1,19 @@ + +----- + diff --git a/tests/lib/Rule/ReplaceInterfaceRector/ReplaceInterfaceRectorTest.php b/tests/lib/Rule/ReplaceInterfaceRector/ReplaceInterfaceRectorTest.php new file mode 100644 index 0000000..71e8c45 --- /dev/null +++ b/tests/lib/Rule/ReplaceInterfaceRector/ReplaceInterfaceRectorTest.php @@ -0,0 +1,34 @@ +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/tests/lib/Rule/ReplaceInterfaceRector/config/configured_rule.php b/tests/lib/Rule/ReplaceInterfaceRector/config/configured_rule.php new file mode 100644 index 0000000..83ceb97 --- /dev/null +++ b/tests/lib/Rule/ReplaceInterfaceRector/config/configured_rule.php @@ -0,0 +1,21 @@ +ruleWithConfiguration( + ReplaceInterfaceRector::class, + [ + 'to_replace' => 'SomeInterface', + 'replace_with' => 'SomeOtherInterface' + ] + ); +}; diff --git a/tests/lib/Sets/Ibexa50/Fixture/rename_variation_interface.inc b/tests/lib/Sets/Ibexa50/Fixture/rename_variation_interface.inc new file mode 100644 index 0000000..731cdb7 --- /dev/null +++ b/tests/lib/Sets/Ibexa50/Fixture/rename_variation_interface.inc @@ -0,0 +1,23 @@ + +----- +