diff --git a/packages/NodeTypeResolver/TypeAnalyzer/ArrayTypeAnalyzer.php b/packages/NodeTypeResolver/TypeAnalyzer/ArrayTypeAnalyzer.php index 79600c5f456..59472dc0300 100644 --- a/packages/NodeTypeResolver/TypeAnalyzer/ArrayTypeAnalyzer.php +++ b/packages/NodeTypeResolver/TypeAnalyzer/ArrayTypeAnalyzer.php @@ -22,7 +22,7 @@ use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\Core\PhpParser\ClassLikeAstResolver; +use Rector\Core\PhpParser\AstResolver; use Rector\Core\Reflection\ReflectionResolver; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\NodeTypeResolver; @@ -34,7 +34,7 @@ public function __construct( private readonly NodeTypeResolver $nodeTypeResolver, private readonly PhpDocInfoFactory $phpDocInfoFactory, private readonly ReflectionResolver $reflectionResolver, - private readonly ClassLikeAstResolver $classLikeAstResolver + private readonly AstResolver $astResolver ) { } @@ -112,7 +112,7 @@ private function isPropertyFetchWithArrayDocblockWithoutDefault(Expr $expr): boo } /** @var ClassLike $classLike */ - $classLike = $this->classLikeAstResolver->resolveClassFromClassReflection($classReflection); + $classLike = $this->astResolver->resolveClassFromClassReflection($classReflection); $property = $classLike->getProperty($propertyName); if (! $property instanceof Property) { @@ -148,7 +148,7 @@ private function isPropertyFetchWithArrayDefault(Expr $expr): bool } /** @var ClassLike $classLike */ - $classLike = $this->classLikeAstResolver->resolveClassFromClassReflection($classReflection); + $classLike = $this->astResolver->resolveClassFromClassReflection($classReflection); $propertyName = $this->nodeNameResolver->getName($expr->name); if ($propertyName === null) { diff --git a/packages/StaticTypeMapper/Naming/NameScopeFactory.php b/packages/StaticTypeMapper/Naming/NameScopeFactory.php index e61317182cf..f053cc5f50c 100644 --- a/packages/StaticTypeMapper/Naming/NameScopeFactory.php +++ b/packages/StaticTypeMapper/Naming/NameScopeFactory.php @@ -15,7 +15,7 @@ use PHPStan\Type\Generic\TemplateTypeMap; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\Core\PhpParser\ClassLikeAstResolver; +use Rector\Core\PhpParser\AstResolver; use Rector\Core\Reflection\ReflectionResolver; use Rector\Naming\Naming\UseImportsResolver; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -33,10 +33,9 @@ final class NameScopeFactory private ReflectionResolver $reflectionResolver; - private ClassLikeAstResolver $classLikeAstResolver; - public function __construct( private readonly UseImportsResolver $useImportsResolver, + private readonly AstResolver $astResolver ) { } @@ -46,13 +45,11 @@ public function __construct( public function autowire( PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper, - ReflectionResolver $reflectionResolver, - ClassLikeAstResolver $classLikeAstResolver + ReflectionResolver $reflectionResolver ): void { $this->phpDocInfoFactory = $phpDocInfoFactory; $this->staticTypeMapper = $staticTypeMapper; $this->reflectionResolver = $reflectionResolver; - $this->classLikeAstResolver = $classLikeAstResolver; } public function createNameScopeFromNodeWithoutTemplateTypes(Node $node): NameScope @@ -120,7 +117,7 @@ private function templateTemplateTypeMap(Node $node): TemplateTypeMap $classReflection = $this->reflectionResolver->resolveClassReflection($node); if ($classReflection instanceof ClassReflection) { - $classLike = $this->classLikeAstResolver->resolveClassFromClassReflection($classReflection); + $classLike = $this->astResolver->resolveClassFromClassReflection($classReflection); if ($classLike instanceof ClassLike) { $classTemplateTypes = $this->resolveTemplateTypesFromNode($classLike); diff --git a/phpstan.neon b/phpstan.neon index 6ebb7636612..7c47e3e5988 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -112,6 +112,7 @@ parameters: message: '#\$this as argument is not allowed\. Refactor method to service composition#' paths: - src/Rector/AbstractRector.php + - src/PhpParser/AstResolver.php - '#Property Rector\\Core\\PhpParser\\Node\\AssignAndBinaryMap\:\:\$binaryOpToAssignClasses \(array, class\-string\>\) does not accept array#' diff --git a/rules/Php71/NodeAnalyzer/CountableAnalyzer.php b/rules/Php71/NodeAnalyzer/CountableAnalyzer.php index 1538e6e7f5b..5f125f48e00 100644 --- a/rules/Php71/NodeAnalyzer/CountableAnalyzer.php +++ b/rules/Php71/NodeAnalyzer/CountableAnalyzer.php @@ -20,6 +20,7 @@ use PHPStan\Type\TypeWithClassName; use PHPStan\Type\UnionType; use Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer; +use Rector\Core\PhpParser\AstResolver; use Rector\Core\PhpParser\ClassLikeAstResolver; use Rector\Core\Reflection\ReflectionResolver; use Rector\NodeNameResolver\NodeNameResolver; @@ -35,7 +36,7 @@ public function __construct( private readonly PropertyFetchAnalyzer $propertyFetchAnalyzer, private readonly ConstructorAssignDetector $constructorAssignDetector, private readonly ReflectionResolver $reflectionResolver, - private readonly ClassLikeAstResolver $classLikeAstResolver + private readonly AstResolver $astResolver ) { } @@ -122,7 +123,7 @@ private function isIterableOrFilledAtConstruct( return false; } - $classLike = $this->classLikeAstResolver->resolveClassFromClassReflection($classReflection); + $classLike = $this->astResolver->resolveClassFromClassReflection($classReflection); if (! $classLike instanceof ClassLike) { return false; diff --git a/rules/Php80/NodeAnalyzer/PhpAttributeAnalyzer.php b/rules/Php80/NodeAnalyzer/PhpAttributeAnalyzer.php index b1e07d594d0..8b091d0e5af 100644 --- a/rules/Php80/NodeAnalyzer/PhpAttributeAnalyzer.php +++ b/rules/Php80/NodeAnalyzer/PhpAttributeAnalyzer.php @@ -15,6 +15,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; use PHPStan\Reflection\ReflectionProvider; +use Rector\Core\PhpParser\AstResolver; use Rector\Core\PhpParser\ClassLikeAstResolver; use Rector\NodeNameResolver\NodeNameResolver; use Rector\PhpAttribute\Enum\DocTagNodeState; @@ -22,7 +23,7 @@ final class PhpAttributeAnalyzer { public function __construct( - private readonly ClassLikeAstResolver $classLikeAstResolver, + private readonly AstResolver $astResolver, private readonly NodeNameResolver $nodeNameResolver, private readonly ReflectionProvider $reflectionProvider, ) { @@ -54,7 +55,7 @@ public function hasInheritedPhpAttribute(Class_ $class, string $attributeClass): $ancestorClassReflections = array_merge($classReflection->getParents(), $classReflection->getInterfaces()); foreach ($ancestorClassReflections as $ancestorClassReflection) { - $resolvedClass = $this->classLikeAstResolver->resolveClassFromClassReflection($ancestorClassReflection); + $resolvedClass = $this->astResolver->resolveClassFromClassReflection($ancestorClassReflection); if (! $resolvedClass instanceof Class_) { continue; diff --git a/rules/Privatization/Guard/ParentPropertyLookupGuard.php b/rules/Privatization/Guard/ParentPropertyLookupGuard.php index 1a58b7bf037..cffad4a4448 100644 --- a/rules/Privatization/Guard/ParentPropertyLookupGuard.php +++ b/rules/Privatization/Guard/ParentPropertyLookupGuard.php @@ -15,6 +15,7 @@ use Rector\Core\Enum\ObjectReference; use Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\Core\NodeManipulator\PropertyManipulator; +use Rector\Core\PhpParser\AstResolver; use Rector\Core\PhpParser\ClassLikeAstResolver; use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Util\Reflection\PrivatesAccessor; @@ -26,7 +27,7 @@ public function __construct( private readonly BetterNodeFinder $betterNodeFinder, private readonly NodeNameResolver $nodeNameResolver, private readonly PropertyFetchAnalyzer $propertyFetchAnalyzer, - private readonly ClassLikeAstResolver $classLikeAstResolver, + private readonly AstResolver $astResolver, private readonly PropertyManipulator $propertyManipulator, private readonly PrivatesAccessor $privatesAccessor ) { @@ -74,7 +75,7 @@ private function isFoundInParentClassMethods( string $propertyName, string $className ): bool { - $classLike = $this->classLikeAstResolver->resolveClassFromClassReflection($parentClassReflection); + $classLike = $this->astResolver->resolveClassFromClassReflection($parentClassReflection); if (! $classLike instanceof Class_) { return false; } diff --git a/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php b/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php index f677e65fe15..a84124ca194 100644 --- a/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php +++ b/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php @@ -8,6 +8,7 @@ use PhpParser\Node\Stmt\Property; use PHPStan\Reflection\ClassReflection; use PHPStan\Type\Type; +use Rector\Core\PhpParser\AstResolver; use Rector\Core\PhpParser\ClassLikeAstResolver; use Rector\NodeNameResolver\NodeNameResolver; use Rector\TypeDeclaration\TypeInferer\AssignToPropertyTypeInferer; @@ -17,14 +18,14 @@ final class AllAssignNodePropertyTypeInferer public function __construct( private readonly AssignToPropertyTypeInferer $assignToPropertyTypeInferer, private readonly NodeNameResolver $nodeNameResolver, - private readonly ClassLikeAstResolver $classLikeAstResolver + private readonly AstResolver $astResolver ) { } public function inferProperty(Property $property, ClassReflection $classReflection): ?Type { /** @var ClassLike $classLike */ - $classLike = $this->classLikeAstResolver->resolveClassFromClassReflection($classReflection); + $classLike = $this->astResolver->resolveClassFromClassReflection($classReflection); $propertyName = $this->nodeNameResolver->getName($property); return $this->assignToPropertyTypeInferer->inferPropertyInClassLike($property, $propertyName, $classLike); diff --git a/src/DependencyInjection/LazyContainerFactory.php b/src/DependencyInjection/LazyContainerFactory.php index 7dcff83f879..5dd4abb285f 100644 --- a/src/DependencyInjection/LazyContainerFactory.php +++ b/src/DependencyInjection/LazyContainerFactory.php @@ -30,7 +30,6 @@ use Rector\CodingStyle\ClassNameImport\ShortNameResolver; use Rector\Core\Configuration\Option; use Rector\Core\Configuration\Parameter\SimpleParameterProvider; -use Rector\Core\PhpParser\ClassLikeAstResolver; use Rector\Core\Reflection\ReflectionResolver; use Rector\Core\Util\Reflection\PrivatesAccessor; use Rector\NodeNameResolver\Contract\NodeNameResolverInterface; @@ -404,7 +403,6 @@ static function (NameScopeFactory $nameScopeFactory, Container $container): void $container->make(PhpDocInfoFactory::class), $container->make(StaticTypeMapper::class), $container->make(ReflectionResolver::class), - $container->make(ClassLikeAstResolver::class), ); } ); diff --git a/src/NodeManipulator/PropertyManipulator.php b/src/NodeManipulator/PropertyManipulator.php index 5078a4224d6..970ff512fe4 100644 --- a/src/NodeManipulator/PropertyManipulator.php +++ b/src/NodeManipulator/PropertyManipulator.php @@ -19,6 +19,7 @@ use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer; +use Rector\Core\PhpParser\AstResolver; use Rector\Core\PhpParser\ClassLikeAstResolver; use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\PhpParser\NodeFinder\PropertyFetchFinder; @@ -55,7 +56,7 @@ public function __construct( private readonly NodeTypeResolver $nodeTypeResolver, private readonly PromotedPropertyResolver $promotedPropertyResolver, private readonly ConstructorAssignDetector $constructorAssignDetector, - private readonly ClassLikeAstResolver $classLikeAstResolver, + private readonly AstResolver $astResolver, private readonly PropertyFetchAnalyzer $propertyFetchAnalyzer ) { } @@ -128,7 +129,7 @@ public function resolveExistingClassPropertyNameByType(Class_ $class, ObjectType public function isUsedByTrait(ClassReflection $classReflection, string $propertyName): bool { foreach ($classReflection->getTraits() as $traitUse) { - $trait = $this->classLikeAstResolver->resolveClassFromClassReflection($traitUse); + $trait = $this->astResolver->resolveClassFromClassReflection($traitUse); if (! $trait instanceof Trait_) { continue; } diff --git a/src/PhpParser/AstResolver.php b/src/PhpParser/AstResolver.php index 18a9678e911..f2048613976 100644 --- a/src/PhpParser/AstResolver.php +++ b/src/PhpParser/AstResolver.php @@ -201,7 +201,7 @@ public function resolveClassMethodFromCall(MethodCall | StaticCall $call): ?Clas public function resolveClassFromClassReflection( ClassReflection $classReflection ): Trait_ | Class_ | Interface_ | Enum_ | null { - return $this->classLikeAstResolver->resolveClassFromClassReflection($classReflection); + return $this->classLikeAstResolver->resolveClassFromClassReflection($classReflection, $this); } /** diff --git a/src/PhpParser/ClassLikeAstResolver.php b/src/PhpParser/ClassLikeAstResolver.php index 34e47c054fc..f5018c24d56 100644 --- a/src/PhpParser/ClassLikeAstResolver.php +++ b/src/PhpParser/ClassLikeAstResolver.php @@ -13,26 +13,21 @@ use PHPStan\Reflection\ClassReflection; use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; -use Symfony\Contracts\Service\Attribute\Required; +/** + * @internal called from AstResolver + */ final class ClassLikeAstResolver { - private AstResolver $astResolver; - public function __construct( private readonly BetterNodeFinder $betterNodeFinder, private readonly NodeNameResolver $nodeNameResolver, ) { } - #[Required] - public function autowire(AstResolver $astResolver): void - { - $this->astResolver = $astResolver; - } - public function resolveClassFromClassReflection( - ClassReflection $classReflection + ClassReflection $classReflection, + AstResolver $astResolver ): Trait_ | Class_ | Interface_ | Enum_ | null { if ($classReflection->isBuiltin()) { return null; @@ -45,7 +40,7 @@ public function resolveClassFromClassReflection( return null; } - $stmts = $this->astResolver->parseFileNameToDecoratedNodes($fileName); + $stmts = $astResolver->parseFileNameToDecoratedNodes($fileName); if ($stmts === []) { return null; }