diff --git a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php index 6a365469820..b393a1907f2 100644 --- a/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php +++ b/packages/VendorLocker/ParentClassMethodTypeOverrideGuard.php @@ -5,12 +5,11 @@ namespace Rector\VendorLocker; use PhpParser\Node\Stmt\ClassMethod; -use PHPStan\BetterReflection\Reflection\ReflectionClass; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\MethodReflection; use PHPStan\Type\Type; +use Rector\Core\Reflection\ClassReflectionAnalyzer; use Rector\Core\Reflection\ReflectionResolver; -use Rector\Core\Util\Reflection\PrivatesAccessor; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\TypeComparator\TypeComparator; use Rector\StaticTypeMapper\StaticTypeMapper; @@ -23,7 +22,7 @@ public function __construct( private readonly ReflectionResolver $reflectionResolver, private readonly TypeComparator $typeComparator, private readonly StaticTypeMapper $staticTypeMapper, - private readonly PrivatesAccessor $privatesAccessor, + private readonly ClassReflectionAnalyzer $classReflectionAnalyzer ) { } @@ -102,14 +101,6 @@ private function resolveParentClassMethod(ClassMethod $classMethod): ?MethodRefl private function hasClassParent(ClassReflection $classReflection): bool { - // XXX rework this hack, after https://github.com/phpstan/phpstan-src/pull/2563 landed - $nativeReflection = $classReflection->getNativeReflection(); - $betterReflectionClass = $this->privatesAccessor->getPrivateProperty( - $nativeReflection, - 'betterReflectionClass' - ); - /** @var ReflectionClass $betterReflectionClass */ - $parentClassName = $betterReflectionClass->getParentClassName(); - return $parentClassName !== null; + return $this->classReflectionAnalyzer->resolveParentClassName($classReflection) !== null; } } diff --git a/rules-tests/Php80/Rector/ClassMethod/AddParamBasedOnParentClassMethodRector/Fixture/skip_enum.php.inc b/rules-tests/Php80/Rector/ClassMethod/AddParamBasedOnParentClassMethodRector/Fixture/skip_enum.php.inc new file mode 100644 index 00000000000..960557ce639 --- /dev/null +++ b/rules-tests/Php80/Rector/ClassMethod/AddParamBasedOnParentClassMethodRector/Fixture/skip_enum.php.inc @@ -0,0 +1,20 @@ +getNativeReflection(); - $betterReflectionClass = $this->privatesAccessor->getPrivateProperty( - $nativeReflection, - 'betterReflectionClass' - ); - /** @var ReflectionClass $betterReflectionClass */ - $parentClassName = $betterReflectionClass->getParentClassName(); - + $parentClassName = $this->classReflectionAnalyzer->resolveParentClassName($classReflection); if ($parentClassName === null) { return true; } diff --git a/src/PhpParser/Node/Value/ValueResolver.php b/src/PhpParser/Node/Value/ValueResolver.php index 5281a36d36a..22cda99fd74 100644 --- a/src/PhpParser/Node/Value/ValueResolver.php +++ b/src/PhpParser/Node/Value/ValueResolver.php @@ -14,7 +14,6 @@ use PhpParser\Node\Scalar\MagicConst\Dir; use PhpParser\Node\Scalar\MagicConst\File; use PHPStan\Analyser\Scope; -use PHPStan\BetterReflection\Reflection\ReflectionClass; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\Constant\ConstantArrayType; @@ -24,8 +23,8 @@ use Rector\Core\Exception\ShouldNotHappenException; use Rector\Core\NodeAnalyzer\ConstFetchAnalyzer; use Rector\Core\Provider\CurrentFileProvider; +use Rector\Core\Reflection\ClassReflectionAnalyzer; use Rector\Core\Reflection\ReflectionResolver; -use Rector\Core\Util\Reflection\PrivatesAccessor; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeResolver; @@ -46,7 +45,7 @@ public function __construct( private readonly ReflectionProvider $reflectionProvider, private readonly CurrentFileProvider $currentFileProvider, private readonly ReflectionResolver $reflectionResolver, - private readonly PrivatesAccessor $privatesAccessor + private readonly ClassReflectionAnalyzer $classReflectionAnalyzer ) { } @@ -334,16 +333,8 @@ private function resolveClassFromSelfStaticParent(ClassConstFetch $classConstFet ); } - // XXX rework this hack, after https://github.com/phpstan/phpstan-src/pull/2563 landed // ensure parent class name still resolved even not autoloaded - $nativeReflection = $classReflection->getNativeReflection(); - $betterReflectionClass = $this->privatesAccessor->getPrivateProperty( - $nativeReflection, - 'betterReflectionClass' - ); - /** @var ReflectionClass $betterReflectionClass */ - $parentClassName = $betterReflectionClass->getParentClassName(); - + $parentClassName = $this->classReflectionAnalyzer->resolveParentClassName($classReflection); if ($parentClassName === null) { throw new ShouldNotHappenException(); } diff --git a/src/Reflection/ClassReflectionAnalyzer.php b/src/Reflection/ClassReflectionAnalyzer.php new file mode 100644 index 00000000000..b46a181041d --- /dev/null +++ b/src/Reflection/ClassReflectionAnalyzer.php @@ -0,0 +1,32 @@ +getNativeReflection(); + if ($nativeReflection instanceof ReflectionEnum) { + return null; + } + + $betterReflectionClass = $this->privatesAccessor->getPrivateProperty( + $nativeReflection, + 'betterReflectionClass' + ); + /** @var ReflectionClass $betterReflectionClass */ + return $betterReflectionClass->getParentClassName(); + } +}