[
MAINHACK
]
Mail Test
BC
Config Scan
HOME
Create...
New File
New Folder
Viewing / Editing File: ReflectionResolver.php
File is not writable. Editing disabled.
<?php declare (strict_types=1); namespace Rector\Reflection; use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; use PhpParser\Node\Expr\NullsafeMethodCall; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Name; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\FunctionReflection; use PHPStan\Reflection\MethodReflection; use PHPStan\Reflection\Php\PhpPropertyReflection; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\BenevolentUnionType; use PHPStan\Type\TypeCombinator; use PHPStan\Type\TypeWithClassName; use Rector\Exception\ShouldNotHappenException; use Rector\NodeAnalyzer\ClassAnalyzer; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\StaticTypeMapper\ValueObject\Type\ShortenedObjectType; use Rector\ValueObject\MethodName; final class ReflectionResolver { /** * @readonly * @var \PHPStan\Reflection\ReflectionProvider */ private $reflectionProvider; /** * @readonly * @var \Rector\NodeTypeResolver\NodeTypeResolver */ private $nodeTypeResolver; /** * @readonly * @var \Rector\NodeNameResolver\NodeNameResolver */ private $nodeNameResolver; /** * @readonly * @var \Rector\NodeAnalyzer\ClassAnalyzer */ private $classAnalyzer; /** * @readonly * @var \Rector\Reflection\MethodReflectionResolver */ private $methodReflectionResolver; public function __construct(ReflectionProvider $reflectionProvider, NodeTypeResolver $nodeTypeResolver, NodeNameResolver $nodeNameResolver, ClassAnalyzer $classAnalyzer, \Rector\Reflection\MethodReflectionResolver $methodReflectionResolver) { $this->reflectionProvider = $reflectionProvider; $this->nodeTypeResolver = $nodeTypeResolver; $this->nodeNameResolver = $nodeNameResolver; $this->classAnalyzer = $classAnalyzer; $this->methodReflectionResolver = $methodReflectionResolver; } /** * @api */ public function resolveClassAndAnonymousClass(ClassLike $classLike) : ClassReflection { if ($classLike instanceof Class_ && $this->classAnalyzer->isAnonymousClass($classLike)) { $classLikeScope = $classLike->getAttribute(AttributeKey::SCOPE); if (!$classLikeScope instanceof Scope) { throw new ShouldNotHappenException(); } return $this->reflectionProvider->getAnonymousClassReflection($classLike, $classLikeScope); } $className = (string) $this->nodeNameResolver->getName($classLike); return $this->reflectionProvider->getClass($className); } public function resolveClassReflection(?Node $node) : ?ClassReflection { if (!$node instanceof Node) { return null; } $scope = $node->getAttribute(AttributeKey::SCOPE); if (!$scope instanceof Scope) { return null; } return $scope->getClassReflection(); } /** * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\NullsafeMethodCall|\PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\StaticPropertyFetch $node */ public function resolveClassReflectionSourceObject($node) : ?ClassReflection { $objectType = $node instanceof StaticCall || $node instanceof StaticPropertyFetch ? $this->nodeTypeResolver->getType($node->class) : $this->nodeTypeResolver->getType($node->var); if (!$objectType instanceof TypeWithClassName) { return null; } $className = $objectType->getClassName(); if (!$this->reflectionProvider->hasClass($className)) { return null; } $classReflection = $this->reflectionProvider->getClass($className); if ($node instanceof PropertyFetch || $node instanceof StaticPropertyFetch) { $propertyName = (string) $this->nodeNameResolver->getName($node->name); if (!$classReflection->hasNativeProperty($propertyName)) { return null; } $property = $classReflection->getNativeProperty($propertyName); if ($property->isPrivate()) { return $classReflection; } if ($this->reflectionProvider->hasClass($property->getDeclaringClass()->getName())) { return $this->reflectionProvider->getClass($property->getDeclaringClass()->getName()); } return $classReflection; } $methodName = (string) $this->nodeNameResolver->getName($node->name); if (!$classReflection->hasNativeMethod($methodName)) { return null; } $extendedMethodReflection = $classReflection->getNativeMethod($methodName); if ($extendedMethodReflection->isPrivate()) { return $classReflection; } if ($this->reflectionProvider->hasClass($extendedMethodReflection->getDeclaringClass()->getName())) { return $this->reflectionProvider->getClass($extendedMethodReflection->getDeclaringClass()->getName()); } return $classReflection; } /** * @param class-string $className */ public function resolveMethodReflection(string $className, string $methodName, ?Scope $scope) : ?MethodReflection { return $this->methodReflectionResolver->resolveMethodReflection($className, $methodName, $scope); } public function resolveMethodReflectionFromStaticCall(StaticCall $staticCall) : ?MethodReflection { $objectType = $this->nodeTypeResolver->getType($staticCall->class); if ($objectType instanceof ShortenedObjectType) { /** @var array<class-string> $classNames */ $classNames = [$objectType->getFullyQualifiedName()]; } else { /** @var array<class-string> $classNames */ $classNames = $objectType->getObjectClassNames(); } $methodName = $this->nodeNameResolver->getName($staticCall->name); if ($methodName === null) { return null; } $scope = $staticCall->getAttribute(AttributeKey::SCOPE); foreach ($classNames as $className) { $methodReflection = $this->resolveMethodReflection($className, $methodName, $scope); if ($methodReflection instanceof MethodReflection) { return $methodReflection; } } return null; } public function resolveMethodReflectionFromMethodCall(MethodCall $methodCall) : ?MethodReflection { $callerType = $this->nodeTypeResolver->getType($methodCall->var); if ($callerType instanceof BenevolentUnionType) { $callerType = TypeCombinator::removeFalsey($callerType); } if (!$callerType instanceof TypeWithClassName) { return null; } $methodName = $this->nodeNameResolver->getName($methodCall->name); if ($methodName === null) { return null; } $scope = $methodCall->getAttribute(AttributeKey::SCOPE); return $this->resolveMethodReflection($callerType->getClassName(), $methodName, $scope); } /** * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\FuncCall|\PhpParser\Node\Expr\StaticCall $call * @return \PHPStan\Reflection\MethodReflection|\PHPStan\Reflection\FunctionReflection|null */ public function resolveFunctionLikeReflectionFromCall($call) { if ($call instanceof MethodCall) { return $this->resolveMethodReflectionFromMethodCall($call); } if ($call instanceof StaticCall) { return $this->resolveMethodReflectionFromStaticCall($call); } return $this->resolveFunctionReflectionFromFuncCall($call); } public function resolveMethodReflectionFromClassMethod(ClassMethod $classMethod, Scope $scope) : ?MethodReflection { $classReflection = $scope->getClassReflection(); if (!$classReflection instanceof ClassReflection) { return null; } $className = $classReflection->getName(); $methodName = $this->nodeNameResolver->getName($classMethod); return $this->resolveMethodReflection($className, $methodName, $scope); } public function resolveFunctionReflectionFromFunction(Function_ $function, Scope $scope) : ?FunctionReflection { $name = $this->nodeNameResolver->getName($function); if ($name === null) { return null; } $functionName = new Name($name); if ($this->reflectionProvider->hasFunction($functionName, $scope)) { return $this->reflectionProvider->getFunction($functionName, $scope); } return null; } public function resolveMethodReflectionFromNew(New_ $new) : ?MethodReflection { $newClassType = $this->nodeTypeResolver->getType($new->class); if (!$newClassType instanceof TypeWithClassName) { return null; } $scope = $new->getAttribute(AttributeKey::SCOPE); return $this->resolveMethodReflection($newClassType->getClassName(), MethodName::CONSTRUCT, $scope); } /** * @param \PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\StaticPropertyFetch $propertyFetch */ public function resolvePropertyReflectionFromPropertyFetch($propertyFetch) : ?PhpPropertyReflection { $propertyName = $this->nodeNameResolver->getName($propertyFetch->name); if ($propertyName === null) { return null; } $fetcheeType = $propertyFetch instanceof PropertyFetch ? $this->nodeTypeResolver->getType($propertyFetch->var) : $this->nodeTypeResolver->getType($propertyFetch->class); if (!$fetcheeType instanceof TypeWithClassName) { return null; } if (!$this->reflectionProvider->hasClass($fetcheeType->getClassName())) { return null; } $classReflection = $this->reflectionProvider->getClass($fetcheeType->getClassName()); if (!$classReflection->hasProperty($propertyName)) { return null; } $scope = $propertyFetch->getAttribute(AttributeKey::SCOPE); if ($scope instanceof Scope) { $propertyReflection = $classReflection->getProperty($propertyName, $scope); if ($propertyReflection instanceof PhpPropertyReflection) { return $propertyReflection; } return null; } return $classReflection->getNativeProperty($propertyName); } /** * @return \PHPStan\Reflection\FunctionReflection|\PHPStan\Reflection\MethodReflection|null */ private function resolveFunctionReflectionFromFuncCall(FuncCall $funcCall) { $scope = $funcCall->getAttribute(AttributeKey::SCOPE); if (!$funcCall->name instanceof Name) { return null; } if ($this->reflectionProvider->hasFunction($funcCall->name, $scope)) { return $this->reflectionProvider->getFunction($funcCall->name, $scope); } return null; } }
Save Changes
Cancel / Back
Close ×
Server Info
Hostname: premium264.web-hosting.com
Server IP: 69.57.162.13
PHP Version: 8.1.34
Server Software: LiteSpeed
System: Linux premium264.web-hosting.com 4.18.0-553.45.1.lve.el8.x86_64 #1 SMP Wed Mar 26 12:08:09 UTC 2025 x86_64
HDD Total: 97.87 GB
HDD Free: 73.59 GB
Domains on IP: N/A (Requires external lookup)
System Features
Safe Mode:
Off
disable_functions:
None
allow_url_fopen:
On
allow_url_include:
Off
magic_quotes_gpc:
Off
register_globals:
Off
open_basedir:
None
cURL:
Enabled
ZipArchive:
Enabled
MySQLi:
Enabled
PDO:
Enabled
wget:
Yes
curl (cmd):
Yes
perl:
Yes
python:
Yes (py3)
gcc:
No
pkexec:
No
git:
Yes
User Info
Username: kidscntx
User ID (UID): 1154
Group ID (GID): 1112
Script Owner UID: 1154
Current Dir Owner: N/A