[Core] Use ReflectionResolver to get ClassReflection when possible (#2226)

* [Core] Use ReflectionResolver to get ClassReflection when possible

* on ClassDependencyManipulator

* on ParentClassMethodTypeOverrideGuard

* on AddPropertyTypeDeclarationRector

* on ReturnTypeFromReturnNewRector

* on ParamTypeByMethodCallTypeRector

* [ci-review] Rector Rectify

* on ParamTypeByParentCallTypeRector

* on ClassMethodParamVendorLockResolver

* on AddVoidReturnTypeWhereNoReturnRector

* on PropertyTypeOverrideGuard

* on AddInterfaceByTraitRector

* LocallyCalledStaticMethodToNonStaticRector

* on MakePropertyTypedGuard

* on FinalizeClassesWithoutChildrenRector

* on ClassMethodReturnTypeOverrideGuard

* on PrivatizeFinalClassMethodRector

* scope fix

* [ci-review] Rector Rectify

* class

* [ci-review] Rector Rectify

* on ClassMethodReturnVendorLockResolver

* on CurrentAndParentClassMethodComparator

* on CurrentAndParentClassMethodComparator

* on DowngradeStringReturnTypeOnToStringRector

* on DowngradeStaticTypeDeclarationRector

* on DowngradeContravariantArgumentTypeRector

* on DowngradeSelfTypeDeclarationRector

* [ci-review] Rector Rectify

* on RemoveUnusedPrivateClassConstantRector

* [ci-review] Rector Rectify

* on SetterNodeReturnTypeInfererTypeInferer

* [ci-review] Rector Rectify

* [ci-review] Rector Rectify

* fix

Co-authored-by: GitHub Action <action@github.com>
This commit is contained in:
Abdul Malik Ikhsan 2022-05-04 17:37:56 +07:00 committed by GitHub
parent 6327904617
commit 129ce269d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 127 additions and 256 deletions

View File

@ -5,11 +5,10 @@ declare(strict_types=1);
namespace Rector\VendorLocker\NodeVendorLocker;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Symplify\SmartFileSystem\Normalizer\PathNormalizer;
final class ClassMethodParamVendorLockResolver
@ -17,7 +16,8 @@ final class ClassMethodParamVendorLockResolver
public function __construct(
private readonly NodeNameResolver $nodeNameResolver,
private readonly PathNormalizer $pathNormalizer,
private readonly FamilyRelationsAnalyzer $familyRelationsAnalyzer
private readonly FamilyRelationsAnalyzer $familyRelationsAnalyzer,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -30,7 +30,7 @@ final class ClassMethodParamVendorLockResolver
return true;
}
$classReflection = $this->resolveClassReflection($classMethod);
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return false;
}
@ -46,7 +46,7 @@ final class ClassMethodParamVendorLockResolver
return true;
}
$classReflection = $this->resolveClassReflection($classMethod);
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return false;
}
@ -84,16 +84,6 @@ final class ClassMethodParamVendorLockResolver
return false;
}
private function resolveClassReflection(ClassMethod $classMethod): ClassReflection | null
{
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return null;
}
return $scope->getClassReflection();
}
/**
* Has interface even in our project?
* Better skip it, as PHPStan has access only to just analyzed classes.

View File

@ -7,9 +7,7 @@ namespace Rector\VendorLocker\NodeVendorLocker;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Stmt\ClassMethod;
//use PHPStan\Analyser\Scope;
use PhpParser\Node\Stmt\Return_;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ReflectionProvider;
use PHPStan\Type\ArrayType;
@ -17,9 +15,9 @@ use PHPStan\Type\Generic\GenericClassStringType;
use PHPStan\Type\MixedType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\PhpParser\AstResolver;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
@ -38,7 +36,8 @@ final class ClassMethodReturnTypeOverrideGuard
private readonly ReflectionProvider $reflectionProvider,
private readonly FamilyRelationsAnalyzer $familyRelationsAnalyzer,
private readonly BetterNodeFinder $betterNodeFinder,
private readonly AstResolver $astResolver
private readonly AstResolver $astResolver,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -54,14 +53,9 @@ final class ClassMethodReturnTypeOverrideGuard
return true;
}
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return false;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
throw new ShouldNotHappenException();
return true;
}
$childrenClassReflections = $this->familyRelationsAnalyzer->getChildrenOfClassReflection($classReflection);
@ -73,7 +67,7 @@ final class ClassMethodReturnTypeOverrideGuard
return true;
}
if ($this->shouldSkipHasChildNoReturn($childrenClassReflections, $classMethod, $scope)) {
if ($this->shouldSkipHasChildNoReturn($childrenClassReflections, $classMethod)) {
return true;
}
@ -98,12 +92,11 @@ final class ClassMethodReturnTypeOverrideGuard
/**
* @param ClassReflection[] $childrenClassReflections
*/
private function shouldSkipHasChildNoReturn(
array $childrenClassReflections,
ClassMethod $classMethod,
Scope $scope
): bool {
private function shouldSkipHasChildNoReturn(array $childrenClassReflections, ClassMethod $classMethod): bool
{
$methodName = $this->nodeNameResolver->getName($classMethod);
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
foreach ($childrenClassReflections as $childClassReflection) {
if (! $childClassReflection->hasMethod($methodName)) {
continue;
@ -126,14 +119,9 @@ final class ClassMethodReturnTypeOverrideGuard
private function shouldSkipChaoticClassMethods(ClassMethod $classMethod): bool
{
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return false;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return false;
return true;
}
foreach (self::CHAOTIC_CLASS_METHOD_NAMES as $chaoticClass => $chaoticMethodNames) {

View File

@ -5,28 +5,23 @@ declare(strict_types=1);
namespace Rector\VendorLocker\NodeVendorLocker;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\FunctionVariantWithPhpDocs;
use PHPStan\Type\MixedType;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
final class ClassMethodReturnVendorLockResolver
{
public function __construct(
private readonly NodeNameResolver $nodeNameResolver
private readonly NodeNameResolver $nodeNameResolver,
private readonly ReflectionResolver $reflectionResolver
) {
}
public function isVendorLocked(ClassMethod $classMethod): bool
{
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return false;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return false;
}

View File

@ -5,7 +5,6 @@ declare(strict_types=1);
namespace Rector\VendorLocker;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\FunctionVariantWithPhpDocs;
use PHPStan\Reflection\MethodReflection;
@ -13,9 +12,9 @@ use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use Rector\Core\PhpParser\AstResolver;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\Core\ValueObject\MethodName;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\TypeDeclaration\TypeInferer\ParamTypeInferer;
use Symplify\SmartFileSystem\Normalizer\PathNormalizer;
@ -25,7 +24,8 @@ final class ParentClassMethodTypeOverrideGuard
private readonly NodeNameResolver $nodeNameResolver,
private readonly PathNormalizer $pathNormalizer,
private readonly AstResolver $astResolver,
private readonly ParamTypeInferer $paramTypeInferer
private readonly ParamTypeInferer $paramTypeInferer,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -68,10 +68,8 @@ final class ParentClassMethodTypeOverrideGuard
* - one of them in /vendor/ -> not allowed
* - both not in /vendor/ -> allowed
*/
/** @var Scope $scope */
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
/** @var ClassReflection $currentClassReflection */
$currentClassReflection = $scope->getClassReflection();
$currentClassReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
/** @var string $currentFileName */
$currentFileName = $currentClassReflection->getFileName();
@ -121,20 +119,15 @@ final class ParentClassMethodTypeOverrideGuard
public function getParentClassMethod(ClassMethod $classMethod): ?MethodReflection
{
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return null;
}
/** @var string $methodName */
$methodName = $this->nodeNameResolver->getName($classMethod);
$classReflection = $scope->getClassReflection();
if (! $classReflection instanceof ClassReflection) {
return null;
}
$parentClassReflections = array_merge($classReflection->getParents(), $classReflection->getInterfaces());
foreach ($parentClassReflections as $parentClassReflection) {
if (! $parentClassReflection->hasNativeMethod($methodName)) {
continue;

View File

@ -16,6 +16,7 @@ use PHPStan\Reflection\ParametersAcceptorSelector;
use Rector\Core\Enum\ObjectReference;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\PhpParser\Comparing\NodeComparator;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\DeadCode\Comparator\Parameter\ParameterDefaultsComparator;
use Rector\DeadCode\Comparator\Parameter\ParameterTypeComparator;
use Rector\NodeNameResolver\NodeNameResolver;
@ -27,7 +28,8 @@ final class CurrentAndParentClassMethodComparator
private readonly NodeNameResolver $nodeNameResolver,
private readonly ParameterDefaultsComparator $parameterDefaultsComparator,
private readonly ParameterTypeComparator $parameterTypeComparator,
private readonly NodeComparator $nodeComparator
private readonly NodeComparator $nodeComparator,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -94,12 +96,7 @@ final class CurrentAndParentClassMethodComparator
ClassMethod $classMethod,
StaticCall $staticCall
): bool {
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return false;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return false;
}

View File

@ -11,16 +11,15 @@ use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\StaticCall;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use Rector\Core\PhpParser\AstResolver;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\PhpParser\Node\Value\ValueResolver;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\NodeCollector\NodeAnalyzer\ArrayCallableMethodMatcher;
use Rector\NodeCollector\ValueObject\ArrayCallable;
use Rector\NodeCollector\ValueObject\ArrayCallableDynamicMethod;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
final class IsClassMethodUsedAnalyzer
{
@ -30,7 +29,8 @@ final class IsClassMethodUsedAnalyzer
private readonly BetterNodeFinder $betterNodeFinder,
private readonly ValueResolver $valueResolver,
private readonly ArrayCallableMethodMatcher $arrayCallableMethodMatcher,
private readonly CallCollectionAnalyzer $callCollectionAnalyzer
private readonly CallCollectionAnalyzer $callCollectionAnalyzer,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -149,12 +149,7 @@ final class IsClassMethodUsedAnalyzer
private function doesMethodExistInTrait(ClassMethod $classMethod, string $classMethodName): bool
{
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return false;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return false;
}

View File

@ -6,12 +6,11 @@ namespace Rector\DeadCode\Rector\ClassConst;
use PhpParser\Node;
use PhpParser\Node\Stmt\ClassConst;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use Rector\Core\NodeAnalyzer\EnumAnalyzer;
use Rector\Core\NodeManipulator\ClassConstManipulator;
use Rector\Core\Rector\AbstractRector;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\Core\Reflection\ReflectionResolver;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@ -23,6 +22,7 @@ final class RemoveUnusedPrivateClassConstantRector extends AbstractRector
public function __construct(
private readonly ClassConstManipulator $classConstManipulator,
private readonly EnumAnalyzer $enumAnalyzer,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -70,12 +70,7 @@ CODE_SAMPLE
return null;
}
$scope = $node->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return null;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($node);
if (! $classReflection instanceof ClassReflection) {
return null;
}

View File

@ -9,12 +9,11 @@ use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\Core\ValueObject\MethodName;
use Rector\DeadCode\NodeAnalyzer\IsClassMethodUsedAnalyzer;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@ -24,7 +23,8 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
final class RemoveUnusedPrivateMethodRector extends AbstractRector
{
public function __construct(
private readonly IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer
private readonly IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -92,12 +92,7 @@ CODE_SAMPLE
private function shouldSkip(ClassMethod $classMethod): bool
{
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return true;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return true;
}

View File

@ -6,12 +6,11 @@ namespace Rector\DowngradePhp70\Rector\ClassMethod;
use PhpParser\Node;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Type\ThisType;
use Rector\BetterPhpDocParser\PhpDocParser\PhpDocFromTypeDeclarationDecorator;
use Rector\Core\Rector\AbstractRector;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\Core\Reflection\ReflectionResolver;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@ -22,6 +21,7 @@ final class DowngradeSelfTypeDeclarationRector extends AbstractRector
{
public function __construct(
private readonly PhpDocFromTypeDeclarationDecorator $phpDocFromTypeDeclarationDecorator,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -71,12 +71,7 @@ CODE_SAMPLE
*/
public function refactor(Node $node): ?Node
{
$scope = $node->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return null;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($node);
if (! $classReflection instanceof ClassReflection) {
return null;
}

View File

@ -10,13 +10,12 @@ use PhpParser\Node\Param;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Function_;
use PhpParser\Node\UnionType;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger;
use Rector\Core\NodeAnalyzer\ParamAnalyzer;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\Core\ValueObject\MethodName;
use Rector\NodeTypeResolver\Node\AttributeKey;
use ReflectionMethod;
use ReflectionNamedType;
use ReflectionParameter;
@ -32,7 +31,8 @@ final class DowngradeContravariantArgumentTypeRector extends AbstractRector
{
public function __construct(
private readonly PhpDocTypeChanger $phpDocTypeChanger,
private readonly ParamAnalyzer $paramAnalyzer
private readonly ParamAnalyzer $paramAnalyzer,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -134,13 +134,7 @@ CODE_SAMPLE
private function getDifferentParamTypeFromAncestorClass(Param $param, ClassMethod|Function_ $functionLike): ?string
{
$scope = $functionLike->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
// possibly trait
return null;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($functionLike);
if (! $classReflection instanceof ClassReflection) {
return null;
}

View File

@ -11,7 +11,6 @@ use PhpParser\Node\Name;
use PhpParser\Node\NullableType;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\UnionType;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\Php\PhpMethodReflection;
use PHPStan\Type\MixedType;
@ -20,6 +19,7 @@ use PHPStan\Type\ThisType;
use PHPStan\Type\Type;
use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\DeadCode\PhpDoc\TagRemover\ReturnTagRemover;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\PHPStanStaticTypeMapper\Enum\TypeKind;
@ -38,7 +38,8 @@ final class DowngradeCovariantReturnTypeRector extends AbstractRector
public function __construct(
private readonly PhpDocTypeChanger $phpDocTypeChanger,
private readonly PrivatesCaller $privatesCaller,
private readonly ReturnTagRemover $returnTagRemover
private readonly ReturnTagRemover $returnTagRemover,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -148,13 +149,7 @@ CODE_SAMPLE
ClassMethod $classMethod,
UnionType | NullableType | Name | Identifier | ComplexType $returnTypeNode
): Type {
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
// possibly trait
return new MixedType();
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return new MixedType();
}

View File

@ -6,12 +6,11 @@ namespace Rector\DowngradePhp80\Rector\ClassMethod;
use PhpParser\Node;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Type\StaticType;
use Rector\BetterPhpDocParser\PhpDocParser\PhpDocFromTypeDeclarationDecorator;
use Rector\Core\Rector\AbstractRector;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\Core\Reflection\ReflectionResolver;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@ -22,6 +21,7 @@ final class DowngradeStaticTypeDeclarationRector extends AbstractRector
{
public function __construct(
private readonly PhpDocFromTypeDeclarationDecorator $phpDocFromTypeDeclarationDecorator,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -71,12 +71,7 @@ CODE_SAMPLE
*/
public function refactor(Node $node): ?Node
{
$scope = $node->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return null;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($node);
if (! $classReflection instanceof ClassReflection) {
return null;
}

View File

@ -7,12 +7,11 @@ namespace Rector\DowngradePhp80\Rector\ClassMethod;
use PhpParser\Node;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Type\MixedType;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\FamilyTree\NodeAnalyzer\ClassChildAnalyzer;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@ -22,7 +21,8 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
final class DowngradeStringReturnTypeOnToStringRector extends AbstractRector
{
public function __construct(
private readonly ClassChildAnalyzer $classChildAnalyzer
private readonly ClassChildAnalyzer $classChildAnalyzer,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -103,12 +103,7 @@ CODE_SAMPLE
return true;
}
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return true;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return true;
}

View File

@ -5,12 +5,11 @@ declare(strict_types=1);
namespace Rector\Php74\Guard;
use PhpParser\Node\Stmt\Property;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use Rector\Core\NodeAnalyzer\PropertyAnalyzer;
use Rector\Core\NodeManipulator\PropertyManipulator;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\Privatization\Guard\ParentPropertyLookupGuard;
final class MakePropertyTypedGuard
@ -19,7 +18,8 @@ final class MakePropertyTypedGuard
private readonly NodeNameResolver $nodeNameResolver,
private readonly PropertyAnalyzer $propertyAnalyzer,
private readonly PropertyManipulator $propertyManipulator,
private readonly ParentPropertyLookupGuard $parentPropertyLookupGuard
private readonly ParentPropertyLookupGuard $parentPropertyLookupGuard,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -33,12 +33,7 @@ final class MakePropertyTypedGuard
return false;
}
$scope = $property->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return false;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($property);
if (! $classReflection instanceof ClassReflection) {
return false;
}

View File

@ -6,10 +6,9 @@ namespace Rector\Privatization\Rector\ClassMethod;
use PhpParser\Node;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use Rector\Core\Rector\AbstractRector;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\Privatization\NodeManipulator\VisibilityManipulator;
use Rector\Privatization\VisibilityGuard\ClassMethodVisibilityGuard;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
@ -23,6 +22,7 @@ final class PrivatizeFinalClassMethodRector extends AbstractRector
public function __construct(
private readonly ClassMethodVisibilityGuard $classMethodVisibilityGuard,
private readonly VisibilityManipulator $visibilityManipulator,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -67,20 +67,15 @@ CODE_SAMPLE
*/
public function refactor(Node $node): ?Node
{
$scope = $node->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return null;
}
if ($scope->isInTrait()) {
return null;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($node);
if (! $classReflection instanceof ClassReflection) {
return null;
}
if (! $classReflection->isClass()) {
return null;
}
if (! $classReflection->isFinal()) {
return null;
}

View File

@ -7,12 +7,11 @@ namespace Rector\Privatization\Rector\Class_;
use PhpParser\Node;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt\Class_;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use Rector\Core\NodeAnalyzer\ClassAnalyzer;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\Privatization\NodeManipulator\VisibilityManipulator;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@ -42,6 +41,7 @@ final class FinalizeClassesWithoutChildrenRector extends AbstractRector
private readonly ClassAnalyzer $classAnalyzer,
private readonly FamilyRelationsAnalyzer $familyRelationsAnalyzer,
private readonly VisibilityManipulator $visibilityManipulator,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -106,12 +106,7 @@ CODE_SAMPLE
return null;
}
$scope = $node->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return null;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($node);
if (! $classReflection instanceof ClassReflection) {
return null;
}

View File

@ -10,11 +10,10 @@ use PhpParser\Node\Expr\StaticCall;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Type\ObjectType;
use Rector\Core\Rector\AbstractRector;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\Privatization\NodeManipulator\VisibilityManipulator;
use Rector\Privatization\VisibilityGuard\ClassMethodVisibilityGuard;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
@ -28,6 +27,7 @@ final class LocallyCalledStaticMethodToNonStaticRector extends AbstractRector
public function __construct(
private readonly ClassMethodVisibilityGuard $classMethodVisibilityGuard,
private readonly VisibilityManipulator $visibilityManipulator,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -100,12 +100,7 @@ CODE_SAMPLE
return null;
}
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return null;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return null;
}

View File

@ -7,11 +7,10 @@ namespace Rector\Transform\Rector\Class_;
use PhpParser\Node;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt\Class_;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use Rector\Core\Contract\Rector\ConfigurableRectorInterface;
use Rector\Core\Rector\AbstractRector;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\Core\Reflection\ReflectionResolver;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
use Webmozart\Assert\Assert;
@ -26,6 +25,10 @@ final class AddInterfaceByTraitRector extends AbstractRector implements Configur
*/
private array $interfaceByTrait = [];
public function __construct(private readonly ReflectionResolver $reflectionResolver)
{
}
public function getRuleDefinition(): RuleDefinition
{
return new RuleDefinition('Add interface by used trait', [
@ -64,9 +67,7 @@ CODE_SAMPLE
*/
public function refactor(Node $node): ?Node
{
/** @var Scope $scope */
$scope = $node->getAttribute(AttributeKey::SCOPE);
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($node);
if (! $classReflection instanceof ClassReflection) {
return null;
}

View File

@ -5,32 +5,27 @@ declare(strict_types=1);
namespace Rector\TypeDeclaration\Guard;
use PhpParser\Node\Stmt\Property;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
final class PropertyTypeOverrideGuard
{
public function __construct(
private readonly NodeNameResolver $nodeNameResolver,
private readonly ReflectionResolver $reflectionResolver
) {
}
public function isLegal(Property $property): bool
{
$propertyName = $this->nodeNameResolver->getName($property);
$classReflection = $this->reflectionResolver->resolveClassReflection($property);
$propertyScope = $property->getAttribute(AttributeKey::SCOPE);
if (! $propertyScope instanceof Scope) {
return true;
}
$classReflection = $propertyScope->getClassReflection();
if (! $classReflection instanceof ClassReflection) {
return true;
}
$propertyName = $this->nodeNameResolver->getName($property);
foreach ($classReflection->getParents() as $parentClassReflection) {
$nativeReflectionClass = $parentClassReflection->getNativeReflection();

View File

@ -9,15 +9,14 @@ use PhpParser\Node\Expr\Closure;
use PhpParser\Node\Identifier;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Function_;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Type\NeverType;
use PHPStan\Type\VoidType;
use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger;
use Rector\Core\Contract\Rector\AllowEmptyConfigurableRectorInterface;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\Core\ValueObject\PhpVersionFeature;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\TypeDeclaration\TypeInferer\SilentVoidResolver;
use Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnVendorLockResolver;
use Rector\VersionBonding\Contract\MinPhpVersionInterface;
@ -40,7 +39,8 @@ final class AddVoidReturnTypeWhereNoReturnRector extends AbstractRector implemen
public function __construct(
private readonly SilentVoidResolver $silentVoidResolver,
private readonly ClassMethodReturnVendorLockResolver $classMethodReturnVendorLockResolver,
private readonly PhpDocTypeChanger $phpDocTypeChanger
private readonly PhpDocTypeChanger $phpDocTypeChanger,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -167,12 +167,7 @@ CODE_SAMPLE
private function isInsideFinalClass(ClassMethod $classMethod): bool
{
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return false;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return false;
}

View File

@ -18,9 +18,9 @@ use PhpParser\Node\Param;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\If_;
use PhpParser\Node\UnionType;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\TypeDeclaration\NodeAnalyzer\CallerParamMatcher;
use Rector\VendorLocker\ParentClassMethodTypeOverrideGuard;
@ -36,7 +36,8 @@ final class ParamTypeByMethodCallTypeRector extends AbstractRector
public function __construct(
private readonly CallerParamMatcher $callerParamMatcher,
private readonly SimpleCallableNodeTraverser $simpleCallableNodeTraverser,
private readonly ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard
private readonly ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -150,12 +151,7 @@ CODE_SAMPLE
return true;
}
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return true;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return true;
}

View File

@ -12,6 +12,7 @@ use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use Rector\Core\Enum\ObjectReference;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\TypeDeclaration\NodeAnalyzer\CallerParamMatcher;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
@ -23,7 +24,8 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
final class ParamTypeByParentCallTypeRector extends AbstractRector
{
public function __construct(
private readonly CallerParamMatcher $callerParamMatcher
private readonly CallerParamMatcher $callerParamMatcher,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -161,12 +163,7 @@ CODE_SAMPLE
return true;
}
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return true;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return true;
}

View File

@ -12,7 +12,6 @@ use PhpParser\Node\Name;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Function_;
use PhpParser\Node\Stmt\Return_;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ReflectionProvider;
use PHPStan\Type\ObjectType;
@ -20,8 +19,8 @@ use PHPStan\Type\StaticType;
use Rector\Core\Enum\ObjectReference;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\Core\ValueObject\PhpVersionFeature;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory;
use Rector\PHPStanStaticTypeMapper\Enum\TypeKind;
use Rector\StaticTypeMapper\ValueObject\Type\SelfStaticType;
@ -37,6 +36,7 @@ final class ReturnTypeFromReturnNewRector extends AbstractRector implements MinP
public function __construct(
private readonly TypeFactory $typeFactory,
private readonly ReflectionProvider $reflectionProvider,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -129,12 +129,7 @@ CODE_SAMPLE
}
if ($className === ObjectReference::STATIC()->getValue() || $className === ObjectReference::SELF()->getValue()) {
$scope = $new->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
throw new ShouldNotHappenException();
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($new);
if (! $classReflection instanceof ClassReflection) {
throw new ShouldNotHappenException();
}

View File

@ -6,13 +6,12 @@ namespace Rector\TypeDeclaration\Rector\Property;
use PhpParser\Node;
use PhpParser\Node\Stmt\Property;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Type\StringType;
use Rector\Core\Contract\Rector\ConfigurableRectorInterface;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\Rector\AbstractRector;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\PHPStanStaticTypeMapper\Enum\TypeKind;
use Rector\TypeDeclaration\ValueObject\AddPropertyTypeDeclaration;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
@ -29,6 +28,10 @@ final class AddPropertyTypeDeclarationRector extends AbstractRector implements C
*/
private array $addPropertyTypeDeclarations = [];
public function __construct(private readonly ReflectionResolver $reflectionResolver)
{
}
public function getRuleDefinition(): RuleDefinition
{
$configuration = [new AddPropertyTypeDeclaration('ParentClass', 'name', new StringType())];
@ -75,12 +78,7 @@ CODE_SAMPLE
return null;
}
$scope = $node->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
throw new ShouldNotHappenException();
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($node);
if (! $classReflection instanceof ClassReflection) {
return null;
}

View File

@ -7,7 +7,6 @@ namespace Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer;
use PhpParser\Node\FunctionLike;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\Property;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\Php\PhpPropertyReflection;
use PHPStan\Type\MixedType;
@ -15,6 +14,7 @@ use PHPStan\Type\Type;
use Rector\Core\NodeManipulator\FunctionLikeManipulator;
use Rector\Core\PhpParser\AstResolver;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory;
use Rector\TypeDeclaration\Contract\TypeInferer\ReturnTypeInfererInterface;
@ -27,7 +27,8 @@ final class SetterNodeReturnTypeInfererTypeInferer implements ReturnTypeInfererI
private readonly FunctionLikeManipulator $functionLikeManipulator,
private readonly TypeFactory $typeFactory,
private readonly BetterNodeFinder $betterNodeFinder,
private readonly AstResolver $astResolver
private readonly AstResolver $astResolver,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -39,18 +40,14 @@ final class SetterNodeReturnTypeInfererTypeInferer implements ReturnTypeInfererI
}
$returnedPropertyNames = $this->functionLikeManipulator->getReturnedLocalPropertyNames($functionLike);
$classReflection = $this->reflectionResolver->resolveClassReflection($classLike);
$scope = $classLike->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return new MixedType();
}
$classReflection = $scope->getClassReflection();
if (! $classReflection instanceof ClassReflection) {
return new MixedType();
}
$types = [];
$scope = $classLike->getAttribute(AttributeKey::SCOPE);
foreach ($returnedPropertyNames as $returnedPropertyName) {
if (! $classReflection->hasProperty($returnedPropertyName)) {
continue;

View File

@ -20,6 +20,7 @@ use Rector\Core\NodeAnalyzer\PropertyPresenceChecker;
use Rector\Core\NodeManipulator\Dependency\DependencyClassMethodDecorator;
use Rector\Core\Php\PhpVersionProvider;
use Rector\Core\PhpParser\Node\NodeFactory;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\Core\ValueObject\MethodName;
use Rector\Core\ValueObject\PhpVersionFeature;
use Rector\NodeNameResolver\NodeNameResolver;
@ -40,7 +41,8 @@ final class ClassDependencyManipulator
private readonly NodeNameResolver $nodeNameResolver,
private readonly NodesToRemoveCollector $nodesToRemoveCollector,
private readonly AutowiredClassMethodOrPropertyAnalyzer $autowiredClassMethodOrPropertyAnalyzer,
private readonly DependencyClassMethodDecorator $dependencyClassMethodDecorator
private readonly DependencyClassMethodDecorator $dependencyClassMethodDecorator,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -176,12 +178,7 @@ final class ClassDependencyManipulator
private function hasClassParentClassMethod(Class_ $class, string $methodName): bool
{
$scope = $class->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return false;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($class);
if (! $classReflection instanceof ClassReflection) {
return false;
}

View File

@ -11,15 +11,14 @@ use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Param;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Type\ObjectType;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\PhpParser\Comparing\NodeComparator;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\Core\ValueObject\MethodName;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\NodeTypeResolver\NodeTypeResolver;
final class ClassMethodManipulator
@ -29,7 +28,8 @@ final class ClassMethodManipulator
private readonly NodeNameResolver $nodeNameResolver,
private readonly NodeTypeResolver $nodeTypeResolver,
private readonly NodeComparator $nodeComparator,
private readonly FuncCallManipulator $funcCallManipulator
private readonly FuncCallManipulator $funcCallManipulator,
private readonly ReflectionResolver $reflectionResolver
) {
}
@ -87,12 +87,7 @@ final class ClassMethodManipulator
return false;
}
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
return false;
}
$classReflection = $scope->getClassReflection();
$classReflection = $this->reflectionResolver->resolveClassReflection($classMethod);
if (! $classReflection instanceof ClassReflection) {
return false;
}

View File

@ -12,8 +12,10 @@ use PhpParser\Node\Expr\StaticCall;
use PhpParser\Node\Expr\StaticPropertyFetch;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassConst;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Function_;
use PhpParser\Node\Stmt\Property;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
@ -56,8 +58,9 @@ final class ReflectionResolver
return $this->reflectionProvider->getClass($className);
}
public function resolveClassReflection(ClassMethod|Property $classMethod): ?ClassReflection
{
public function resolveClassReflection(
ClassMethod|Property|ClassLike|New_|Function_|ClassConst $classMethod
): ?ClassReflection {
$scope = $classMethod->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {