From 4144291cacc058968fbf9da0551bc14888bc0f43 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Tue, 11 Aug 2026 00:12:32 +0200 Subject: [PATCH] [deprecation] Deprecate AddInterfaceByTraitRector --- phpstan.neon | 1 + .../AddInterfaceByTraitRectorTest.php | 28 ----------- .../Fixture/fixture.php.inc | 25 ---------- .../Fixture/skip_existing.php.inc | 11 ----- .../skip_transitional_interface.php.inc | 11 ----- .../Source/AnotherTrait.php | 9 ---- .../Source/MiddleInterface.php | 10 ---- .../Source/SomeInterface.php | 10 ---- .../Source/SomeTrait.php | 10 ---- .../Source/TopMostInterface.php | 10 ---- .../config/configured_rule.php | 18 ------- .../Class_/AddInterfaceByTraitRector.php | 49 +++---------------- 12 files changed, 9 insertions(+), 183 deletions(-) delete mode 100644 rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/AddInterfaceByTraitRectorTest.php delete mode 100644 rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/Fixture/fixture.php.inc delete mode 100644 rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/Fixture/skip_existing.php.inc delete mode 100644 rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/Fixture/skip_transitional_interface.php.inc delete mode 100644 rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/Source/AnotherTrait.php delete mode 100644 rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/Source/MiddleInterface.php delete mode 100644 rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/Source/SomeInterface.php delete mode 100644 rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/Source/SomeTrait.php delete mode 100644 rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/Source/TopMostInterface.php delete mode 100644 rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/config/configured_rule.php diff --git a/phpstan.neon b/phpstan.neon index ebd330b357f..62e24c39aed 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -471,6 +471,7 @@ parameters: - '#Class "Rector\\Transform\\Rector\\FuncCall\\FuncCallToMethodCallRector" is missing @see annotation with test case class reference#' - '#Class "Rector\\Transform\\Rector\\Scalar\\ScalarValueToConstFetchRector" is missing @see annotation with test case class reference#' - '#Class "Rector\\DeadCode\\Rector\\ClassLike\\RemoveAnnotationRector" is missing @see annotation with test case class reference#' + - '#Class "Rector\\Transform\\Rector\\Class_\\AddInterfaceByTraitRector" is missing @see annotation with test case class reference#' # @todo fix in phpstan-rules - diff --git a/rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/AddInterfaceByTraitRectorTest.php b/rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/AddInterfaceByTraitRectorTest.php deleted file mode 100644 index 5ff498279c9..00000000000 --- a/rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/AddInterfaceByTraitRectorTest.php +++ /dev/null @@ -1,28 +0,0 @@ -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/Transform/Rector/Class_/AddInterfaceByTraitRector/Fixture/fixture.php.inc b/rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/Fixture/fixture.php.inc deleted file mode 100644 index 1e6fbde9018..00000000000 --- a/rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/Fixture/fixture.php.inc +++ /dev/null @@ -1,25 +0,0 @@ - ------ - diff --git a/rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/Fixture/skip_existing.php.inc b/rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/Fixture/skip_existing.php.inc deleted file mode 100644 index 63f7efc4a11..00000000000 --- a/rules-tests/Transform/Rector/Class_/AddInterfaceByTraitRector/Fixture/skip_existing.php.inc +++ /dev/null @@ -1,11 +0,0 @@ -ruleWithConfiguration(AddInterfaceByTraitRector::class, [ - SomeTrait::class => SomeInterface::class, - AnotherTrait::class => TopMostInterface::class, - ]); -}; diff --git a/rules/Transform/Rector/Class_/AddInterfaceByTraitRector.php b/rules/Transform/Rector/Class_/AddInterfaceByTraitRector.php index e44a0c60a85..b66b0ba0ea7 100644 --- a/rules/Transform/Rector/Class_/AddInterfaceByTraitRector.php +++ b/rules/Transform/Rector/Class_/AddInterfaceByTraitRector.php @@ -5,27 +5,19 @@ namespace Rector\Transform\Rector\Class_; use PhpParser\Node; -use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Class_; -use PHPStan\Reflection\ClassReflection; +use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; use Rector\Contract\Rector\ConfigurableRectorInterface; -use Rector\PHPStan\ScopeFetcher; +use Rector\Exception\ShouldNotHappenException; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use Webmozart\Assert\Assert; /** - * @api used in rector-doctrine - * @see \Rector\Tests\Transform\Rector\Class_\AddInterfaceByTraitRector\AddInterfaceByTraitRectorTest + * @deprecated This rule is deprecated, as too niche. Pairing a trait with an interface is specific to a single project or package, and the extra conditions it needs in practice are easier to express in a custom rule. */ -final class AddInterfaceByTraitRector extends AbstractRector implements ConfigurableRectorInterface +final class AddInterfaceByTraitRector extends AbstractRector implements ConfigurableRectorInterface, DeprecatedInterface { - /** - * @var array - */ - private array $interfaceByTrait = []; - public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Add interface by used trait', [ @@ -64,31 +56,10 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $scope = ScopeFetcher::fetch($node); - $classReflection = $scope->getClassReflection(); - if (! $classReflection instanceof ClassReflection) { - return null; - } - - $hasChanged = false; - foreach ($this->interfaceByTrait as $traitName => $interfaceName) { - if (! $classReflection->hasTraitUse($traitName)) { - continue; - } - - if ($classReflection->implementsInterface($interfaceName)) { - continue; - } - - $node->implements[] = new FullyQualified($interfaceName); - $hasChanged = true; - } - - if (! $hasChanged) { - return null; - } - - return $node; + throw new ShouldNotHappenException(sprintf( + '"%s" rule is deprecated, as too niche; use a custom rule scoped to your own trait and interface pair instead', + self::class + )); } /** @@ -96,9 +67,5 @@ public function refactor(Node $node): ?Node */ public function configure(array $configuration): void { - Assert::allString(array_keys($configuration)); - Assert::allString($configuration); - - $this->interfaceByTrait = $configuration; } }