From 5bdd61fd7d0962a6040715926f27b682ea550781 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Tue, 25 Aug 2026 07:49:11 +0100 Subject: [PATCH 1/2] [DI] Replace registerTagged with entropy autodiscover for order-independent service collections --- .../LazyContainerFactory.php | 94 +------------------ 1 file changed, 4 insertions(+), 90 deletions(-) diff --git a/src/DependencyInjection/LazyContainerFactory.php b/src/DependencyInjection/LazyContainerFactory.php index 106d8159204..dec126b7586 100644 --- a/src/DependencyInjection/LazyContainerFactory.php +++ b/src/DependencyInjection/LazyContainerFactory.php @@ -34,19 +34,6 @@ use Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser\PlainValueParser; use Rector\Caching\Cache; use Rector\Caching\CacheFactory; -use Rector\ChangesReporting\Contract\Output\OutputFormatterInterface; -use Rector\ChangesReporting\Output\ConsoleOutputFormatter; -use Rector\ChangesReporting\Output\GitHubOutputFormatter; -use Rector\ChangesReporting\Output\GitlabOutputFormatter; -use Rector\ChangesReporting\Output\JsonOutputFormatter; -use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter\AliasClassNameImportSkipVoter; -use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter\ClassLikeNameClassNameImportSkipVoter; -use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter\FullyQualifiedNameClassNameImportSkipVoter; -use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter\OriginalNameImportSkipVoter; -use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter\ReservedClassNameImportSkipVoter; -use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter\ShortClassImportSkipVoter; -use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter\UsesClassNameImportSkipVoter; -use Rector\CodingStyle\Contract\ClassNameImport\ClassNameImportSkipVoterInterface; use Rector\Config\RectorConfig; use Rector\Configuration\ConfigurationRuleFilter; use Rector\Configuration\RenamedClassesDataCollector; @@ -72,25 +59,9 @@ use Rector\NodeNameResolver\NodeNameResolver\PropertyNameResolver; use Rector\NodeNameResolver\NodeNameResolver\UseNameResolver; use Rector\NodeNameResolver\NodeNameResolver\VariableNameResolver; -use Rector\NodeTypeResolver\Contract\NodeTypeResolverInterface; use Rector\NodeTypeResolver\DependencyInjection\PHPStanServicesFactory; use Rector\NodeTypeResolver\NodeTypeResolver; -use Rector\NodeTypeResolver\NodeTypeResolver\CastTypeResolver; -use Rector\NodeTypeResolver\NodeTypeResolver\ClassAndInterfaceTypeResolver; -use Rector\NodeTypeResolver\NodeTypeResolver\ClassConstFetchTypeResolver; -use Rector\NodeTypeResolver\NodeTypeResolver\IdentifierTypeResolver; -use Rector\NodeTypeResolver\NodeTypeResolver\NameTypeResolver; -use Rector\NodeTypeResolver\NodeTypeResolver\NewTypeResolver; -use Rector\NodeTypeResolver\NodeTypeResolver\ParamTypeResolver; -use Rector\NodeTypeResolver\NodeTypeResolver\PropertyFetchTypeResolver; -use Rector\NodeTypeResolver\NodeTypeResolver\PropertyTypeResolver; -use Rector\NodeTypeResolver\NodeTypeResolver\ScalarTypeResolver; -use Rector\NodeTypeResolver\NodeTypeResolver\StaticCallMethodCallTypeResolver; -use Rector\NodeTypeResolver\NodeTypeResolver\TraitTypeResolver; use Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocatorProvider\DynamicSourceLocatorProvider; -use Rector\Php80\AttributeDecorator\DoctrineConverterAttributeDecorator; -use Rector\Php80\AttributeDecorator\SensioParamConverterAttributeDecorator; -use Rector\Php80\Contract\ConverterAttributeDecoratorInterface; use Rector\PhpAttribute\AnnotationToAttributeMapper; use Rector\PhpAttribute\AnnotationToAttributeMapper\ArrayAnnotationToAttributeMapper; use Rector\PhpAttribute\AnnotationToAttributeMapper\ArrayItemNodeAnnotationToAttributeMapper; @@ -246,19 +217,6 @@ final class LazyContainerFactory UnionPhpDocTypeMapper::class, ]; - /** - * @var array> - */ - private const array CLASS_NAME_IMPORT_SKIPPER_CLASSES = [ - AliasClassNameImportSkipVoter::class, - ClassLikeNameClassNameImportSkipVoter::class, - FullyQualifiedNameClassNameImportSkipVoter::class, - UsesClassNameImportSkipVoter::class, - ReservedClassNameImportSkipVoter::class, - ShortClassImportSkipVoter::class, - OriginalNameImportSkipVoter::class, - ]; - /** * @var array> */ @@ -315,34 +273,6 @@ final class LazyContainerFactory PhpVersionFactory::class, ]; - /** - * @var array> - */ - private const array OUTPUT_FORMATTER_CLASSES = [ - ConsoleOutputFormatter::class, - JsonOutputFormatter::class, - GitlabOutputFormatter::class, - GitHubOutputFormatter::class, - ]; - - /** - * @var array> - */ - private const array NODE_TYPE_RESOLVER_CLASSES = [ - CastTypeResolver::class, - StaticCallMethodCallTypeResolver::class, - ClassAndInterfaceTypeResolver::class, - IdentifierTypeResolver::class, - NameTypeResolver::class, - NewTypeResolver::class, - ParamTypeResolver::class, - PropertyFetchTypeResolver::class, - ClassConstFetchTypeResolver::class, - PropertyTypeResolver::class, - ScalarTypeResolver::class, - TraitTypeResolver::class, - ]; - /** * @var array> */ @@ -357,14 +287,6 @@ final class LazyContainerFactory ExprNodeMapper::class, ]; - /** - * @var array> - */ - private const array CONVERTER_ATTRIBUTE_DECORATOR_CLASSES = [ - SensioParamConverterAttributeDecorator::class, - DoctrineConverterAttributeDecorator::class, - ]; - /** * @api used as next rectorConfig factory */ @@ -488,11 +410,7 @@ static function (UnionTypeMapper $unionTypeMapper) use ($rectorConfig): void { private function registerNodeNameResolvers(RectorConfig $rectorConfig): void { // node name resolvers - $this->registerTagged( - $rectorConfig, - self::CONVERTER_ATTRIBUTE_DECORATOR_CLASSES, - ConverterAttributeDecoratorInterface::class - ); + $rectorConfig->autodiscover(__DIR__ . '/../../rules/Php80/AttributeDecorator'); } private function registerRectorAutowiring(RectorConfig $rectorConfig): void @@ -546,13 +464,9 @@ private function registerTaggedServices(RectorConfig $rectorConfig): void $this->registerTagged($rectorConfig, self::TYPE_MAPPER_CLASSES, TypeMapperInterface::class); $this->registerTagged($rectorConfig, self::PHPDOC_TYPE_MAPPER_CLASSES, PhpDocTypeMapperInterface::class); $this->registerTagged($rectorConfig, self::NODE_NAME_RESOLVER_CLASSES, NodeNameResolverInterface::class); - $this->registerTagged($rectorConfig, self::NODE_TYPE_RESOLVER_CLASSES, NodeTypeResolverInterface::class); - $this->registerTagged($rectorConfig, self::OUTPUT_FORMATTER_CLASSES, OutputFormatterInterface::class); - $this->registerTagged( - $rectorConfig, - self::CLASS_NAME_IMPORT_SKIPPER_CLASSES, - ClassNameImportSkipVoterInterface::class - ); + $rectorConfig->autodiscover(__DIR__ . '/../NodeTypeResolver/NodeTypeResolver'); + $rectorConfig->autodiscover(__DIR__ . '/../ChangesReporting/Output'); + $rectorConfig->autodiscover(__DIR__ . '/../../rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter'); $rectorConfig->singleton( SymfonyStyle::class, From c9c93b22ac0d2108ec25ee6073a24dbbef1df1dd Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Tue, 25 Aug 2026 07:54:46 +0100 Subject: [PATCH 2/2] [CI] Skip autodiscovered service interfaces in class-leak check --- .github/workflows/code_analysis.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/code_analysis.yaml b/.github/workflows/code_analysis.yaml index 2a98d02241b..6d10909705d 100644 --- a/.github/workflows/code_analysis.yaml +++ b/.github/workflows/code_analysis.yaml @@ -53,7 +53,7 @@ jobs: - name: 'Active Classes' run: | - vendor/bin/class-leak check bin config src rules utils --skip-suffix "Rector" --skip-type="Rector\\Utils\\Compiler\\Unprefixer" --skip-type="Rector\\NodeCollector\\BinaryOpConditionsCollector" --skip-type="Rector\\Set\\Contract\\SetListInterface" --skip-type="Rector\\DependencyInjection\\PHPStan\\RichParserFactory" --skip-type="Rector\\Utils\\PHPStan\\Tests\\Rule\\SingleServiceRegistrationRule\\Source\\DuplicateRegistrationFactory" --skip-type="Rector\\Utils\\PHPStan\\Tests\\Rule\\SingleServiceRegistrationRule\\Source\\SingleRegistrationFactory" + vendor/bin/class-leak check bin config src rules utils --skip-suffix "Rector" --skip-type="Rector\\Utils\\Compiler\\Unprefixer" --skip-type="Rector\\NodeCollector\\BinaryOpConditionsCollector" --skip-type="Rector\\Set\\Contract\\SetListInterface" --skip-type="Rector\\DependencyInjection\\PHPStan\\RichParserFactory" --skip-type="Rector\\Utils\\PHPStan\\Tests\\Rule\\SingleServiceRegistrationRule\\Source\\DuplicateRegistrationFactory" --skip-type="Rector\\Utils\\PHPStan\\Tests\\Rule\\SingleServiceRegistrationRule\\Source\\SingleRegistrationFactory" --skip-type="Rector\\ChangesReporting\\Contract\\Output\\OutputFormatterInterface" --skip-type="Rector\\NodeTypeResolver\\Contract\\NodeTypeResolverInterface" --skip-type="Rector\\CodingStyle\\Contract\\ClassNameImport\\ClassNameImportSkipVoterInterface" --skip-type="Rector\\Php80\\Contract\\ConverterAttributeDecoratorInterface" - name: 'Compatible PHPStan versions'