From aec723ac24c070de490746375e25197c2060fd00 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 22 Dec 2025 14:17:09 +0100 Subject: [PATCH] [dx] warn about deprecated beforeTraverse() method once FileNode is ready --- composer-dependency-analyser.php | 2 ++ phpstan.neon | 2 ++ src/Console/Command/ProcessCommand.php | 1 + src/Reporting/DeprecatedRulesReporter.php | 21 +++++++++++++++++++++ 4 files changed, 26 insertions(+) diff --git a/composer-dependency-analyser.php b/composer-dependency-analyser.php index 9b360269026..8ee1533e5eb 100644 --- a/composer-dependency-analyser.php +++ b/composer-dependency-analyser.php @@ -17,6 +17,8 @@ // ensure use version ^3.2.0 ->ignoreErrorsOnPackage('composer/pcre', [ErrorType::UNUSED_DEPENDENCY]) + ->ignoreErrorsOnPath(__DIR__ . '/src/Reporting/DeprecatedRulesReporter.php', [ErrorType::UNKNOWN_CLASS]) + ->ignoreErrorsOnPaths([ __DIR__ . '/stubs', __DIR__ . '/tests', diff --git a/phpstan.neon b/phpstan.neon index cac98bc58f4..616fe4cdfa7 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -160,6 +160,8 @@ parameters: - src/Validation/RectorConfigValidator.php # for phpunit version check - src/Testing/PHPUnit/AbstractLazyTestCase.php + # future node class exists check + - src/Reporting/DeprecatedRulesReporter.php # use of internal phpstan classes - diff --git a/src/Console/Command/ProcessCommand.php b/src/Console/Command/ProcessCommand.php index 18047df392d..03907c86892 100644 --- a/src/Console/Command/ProcessCommand.php +++ b/src/Console/Command/ProcessCommand.php @@ -182,6 +182,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->deprecatedRulesReporter->reportDeprecatedRules(); $this->deprecatedRulesReporter->reportDeprecatedSkippedRules(); $this->deprecatedRulesReporter->reportDeprecatedNodeTypes(); + $this->deprecatedRulesReporter->reportDeprecatedRectorUnsupportedMethods(); $this->missConfigurationReporter->reportSkippedNeverRegisteredRules(); diff --git a/src/Reporting/DeprecatedRulesReporter.php b/src/Reporting/DeprecatedRulesReporter.php index 972e3aa2fc4..5f941be6faa 100644 --- a/src/Reporting/DeprecatedRulesReporter.php +++ b/src/Reporting/DeprecatedRulesReporter.php @@ -4,12 +4,14 @@ namespace Rector\Reporting; +use Rector\PhpParserNode\FileNode; use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; use Rector\Configuration\Option; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\Contract\Rector\RectorInterface; use Rector\PhpParser\Enum\NodeGroup; +use ReflectionMethod; use Symfony\Component\Console\Style\SymfonyStyle; final readonly class DeprecatedRulesReporter @@ -56,6 +58,25 @@ public function reportDeprecatedSkippedRules(): void } } + public function reportDeprecatedRectorUnsupportedMethods(): void + { + // to be added in related PR + if (! class_exists(FileNode::class)) { + return; + } + + foreach ($this->rectors as $rector) { + $beforeTraverseMethodReflection = new ReflectionMethod($rector, 'beforeTraverse'); + if ($beforeTraverseMethodReflection->getDeclaringClass()->getName() === $rector::class) { + $this->symfonyStyle->warning(sprintf( + 'Rector rule "%s" uses deprecated "beforeTraverse" method. It should not be used, as will be marked as final. Not part of RectorInterface contract. Use "%s" to hook into file-level changes instead.', + $rector::class, + FileNode::class + )); + } + } + } + public function reportDeprecatedNodeTypes(): void { // helper property to avoid reporting multiple times