From de7ccb37c64b01df5924e2e45a48bbdc01f2b962 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 22 Oct 2026 13:18:57 +0200 Subject: [PATCH 1/2] [Transform] Deprecate ConstFetchToClassConstFetchRector as niche and never used --- .../ConstFetchToClassConstFetchTest.php | 28 -------------- .../Fixture/fixture1.php.inc | 11 ------ .../config/configured_rule.php | 14 ------- .../ConstFetchToClassConstFetchRector.php | 38 ++++++------------- 4 files changed, 11 insertions(+), 80 deletions(-) delete mode 100644 rules-tests/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector/ConstFetchToClassConstFetchTest.php delete mode 100644 rules-tests/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector/Fixture/fixture1.php.inc delete mode 100644 rules-tests/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector/config/configured_rule.php diff --git a/rules-tests/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector/ConstFetchToClassConstFetchTest.php b/rules-tests/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector/ConstFetchToClassConstFetchTest.php deleted file mode 100644 index ddffb95a70a..00000000000 --- a/rules-tests/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector/ConstFetchToClassConstFetchTest.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/ConstFetch/ConstFetchToClassConstFetchRector/Fixture/fixture1.php.inc b/rules-tests/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector/Fixture/fixture1.php.inc deleted file mode 100644 index bab293eeed8..00000000000 --- a/rules-tests/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector/Fixture/fixture1.php.inc +++ /dev/null @@ -1,11 +0,0 @@ -ruleWithConfiguration(ConstFetchToClassConstFetchRector::class, [ - new ConstFetchToClassConstFetch('CONTEXT_COURSE', 'core\context\course', 'LEVEL'), - ]); -}; diff --git a/rules/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector.php b/rules/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector.php index deeba50f368..28d220346e4 100644 --- a/rules/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector.php +++ b/rules/Transform/Rector/ConstFetch/ConstFetchToClassConstFetchRector.php @@ -7,23 +7,19 @@ use PhpParser\Node; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\ConstFetch; +use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; use Rector\Contract\Rector\ConfigurableRectorInterface; +use Rector\Exception\ShouldNotHappenException; use Rector\Rector\AbstractRector; use Rector\RuleDoc\CodeSample\ConfiguredCodeSample; use Rector\RuleDoc\RuleDefinition; use Rector\Transform\ValueObject\ConstFetchToClassConstFetch; -use Webmozart\Assert\Assert; /** - * @see Rector\Tests\Transform\Rector\ConstFetch\ConstFetchToClassConstFetchRector\ConstFetchToClassConstFetchTest + * @deprecated This rule is deprecated, as too niche and never used. A global const name can be reused across unrelated contexts and does not map cleanly to a single class constant. Use a custom rule scoped to your exact case instead. */ -final class ConstFetchToClassConstFetchRector extends AbstractRector implements ConfigurableRectorInterface +final class ConstFetchToClassConstFetchRector extends AbstractRector implements ConfigurableRectorInterface, DeprecatedInterface { - /** - * @var array - */ - private array $constFetchToClassConstsByOldName = []; - public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Change const fetch to class const fetch', [ @@ -43,28 +39,16 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?ClassConstFetch { - $constName = $this->getName($node); - if ($constName === null) { - return null; - } - - foreach ($this->constFetchToClassConstsByOldName[strtolower($constName)] ?? [] as $constFetchToClassConst) { - return $this->nodeFactory->createClassConstFetch( - $constFetchToClassConst->getNewClassName(), - $constFetchToClassConst->getNewConstName() - ); - } - - return null; + throw new ShouldNotHappenException(sprintf( + '"%s" rule is deprecated, as too niche and never used; use a custom rule scoped to your exact case instead', + self::class + )); } + /** + * @param mixed[] $configuration + */ public function configure(array $configuration): void { - Assert::allIsAOf($configuration, ConstFetchToClassConstFetch::class); - - $this->constFetchToClassConstsByOldName = []; - foreach ($configuration as $constFetchToClassConst) { - $this->constFetchToClassConstsByOldName[strtolower($constFetchToClassConst->getOldConstName())][] = $constFetchToClassConst; - } } } From 535e6f5aea4b4d53e317b3e217677d60607c6bb8 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 22 Oct 2026 13:20:35 +0200 Subject: [PATCH 2/2] mark ConstFetchToClassConstFetch VO as @api to skip unused-public --- rules/Transform/ValueObject/ConstFetchToClassConstFetch.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rules/Transform/ValueObject/ConstFetchToClassConstFetch.php b/rules/Transform/ValueObject/ConstFetchToClassConstFetch.php index dac185a81d5..c9079318c2f 100644 --- a/rules/Transform/ValueObject/ConstFetchToClassConstFetch.php +++ b/rules/Transform/ValueObject/ConstFetchToClassConstFetch.php @@ -6,6 +6,9 @@ use Rector\Validation\RectorAssert; +/** + * @api kept for deprecated ConstFetchToClassConstFetchRector code sample + */ final readonly class ConstFetchToClassConstFetch { public function __construct(