%PDF- %PDF-
| Direktori : /home2/vacivi36/vacivitta_bakcup/vendor/rector/rector/src/NodeAnalyzer/ |
| Current File : //home2/vacivi36/vacivitta_bakcup/vendor/rector/rector/src/NodeAnalyzer/PropertyFetchAnalyzer.php |
<?php
declare (strict_types=1);
namespace Rector\Core\NodeAnalyzer;
use PhpParser\Node;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\StaticPropertyFetch;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Param;
use PhpParser\Node\Stmt;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Property;
use Rector\Core\Enum\ObjectReference;
use Rector\Core\PhpParser\Comparing\NodeComparator;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\ValueObject\MethodName;
use Rector\NodeNameResolver\NodeNameResolver;
final class PropertyFetchAnalyzer
{
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
/**
* @readonly
* @var \Rector\Core\PhpParser\Comparing\NodeComparator
*/
private $nodeComparator;
public function __construct(\Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver, \Rector\Core\PhpParser\Node\BetterNodeFinder $betterNodeFinder, \Rector\Core\PhpParser\Comparing\NodeComparator $nodeComparator)
{
$this->nodeNameResolver = $nodeNameResolver;
$this->betterNodeFinder = $betterNodeFinder;
$this->nodeComparator = $nodeComparator;
}
public function isLocalPropertyFetch(\PhpParser\Node $node) : bool
{
if ($node instanceof \PhpParser\Node\Expr\PropertyFetch) {
if ($node->var instanceof \PhpParser\Node\Expr\MethodCall) {
return \false;
}
return $this->nodeNameResolver->isName($node->var, 'this');
}
if ($node instanceof \PhpParser\Node\Expr\StaticPropertyFetch) {
return $this->nodeNameResolver->isName($node->class, \Rector\Core\Enum\ObjectReference::SELF()->getValue());
}
return \false;
}
public function isLocalPropertyFetchName(\PhpParser\Node $node, string $desiredPropertyName) : bool
{
if (!$this->isLocalPropertyFetch($node)) {
return \false;
}
/** @var PropertyFetch|StaticPropertyFetch $node */
return $this->nodeNameResolver->isName($node->name, $desiredPropertyName);
}
public function containsLocalPropertyFetchName(\PhpParser\Node $node, string $propertyName) : bool
{
return (bool) $this->betterNodeFinder->findFirst($node, function (\PhpParser\Node $node) use($propertyName) : bool {
if (!$node instanceof \PhpParser\Node\Expr\PropertyFetch) {
return \false;
}
return $this->nodeNameResolver->isName($node->name, $propertyName);
});
}
/**
* @param \PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\StaticPropertyFetch $expr
*/
public function isPropertyToSelf($expr) : bool
{
if ($expr instanceof \PhpParser\Node\Expr\PropertyFetch && !$this->nodeNameResolver->isName($expr->var, 'this')) {
return \false;
}
if ($expr instanceof \PhpParser\Node\Expr\StaticPropertyFetch && !$this->nodeNameResolver->isName($expr->class, \Rector\Core\Enum\ObjectReference::SELF()->getValue())) {
return \false;
}
$class = $this->betterNodeFinder->findParentType($expr, \PhpParser\Node\Stmt\Class_::class);
if (!$class instanceof \PhpParser\Node\Stmt\Class_) {
return \false;
}
foreach ($class->getProperties() as $property) {
if (!$this->nodeNameResolver->areNamesEqual($property->props[0], $expr)) {
continue;
}
return \true;
}
return \false;
}
public function isPropertyFetch(\PhpParser\Node $node) : bool
{
if ($node instanceof \PhpParser\Node\Expr\PropertyFetch) {
return \true;
}
return $node instanceof \PhpParser\Node\Expr\StaticPropertyFetch;
}
/**
* Matches:
* "$this->someValue = $<variableName>;"
*/
public function isVariableAssignToThisPropertyFetch(\PhpParser\Node $node, string $variableName) : bool
{
if (!$node instanceof \PhpParser\Node\Expr\Assign) {
return \false;
}
if (!$node->expr instanceof \PhpParser\Node\Expr\Variable) {
return \false;
}
if (!$this->nodeNameResolver->isName($node->expr, $variableName)) {
return \false;
}
return $this->isLocalPropertyFetch($node->var);
}
/**
* @param \PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\StaticPropertyFetch|\PhpParser\Node\Stmt\Property $property
*/
public function isFilledByConstructParam($property) : bool
{
$class = $this->betterNodeFinder->findParentType($property, \PhpParser\Node\Stmt\Class_::class);
if (!$class instanceof \PhpParser\Node\Stmt\Class_) {
return \false;
}
$classMethod = $class->getMethod(\Rector\Core\ValueObject\MethodName::CONSTRUCT);
if (!$classMethod instanceof \PhpParser\Node\Stmt\ClassMethod) {
return \false;
}
$params = $classMethod->params;
if ($params === []) {
return \false;
}
$stmts = (array) $classMethod->stmts;
if ($stmts === []) {
return \false;
}
/** @var string $propertyName */
$propertyName = $property instanceof \PhpParser\Node\Stmt\Property ? $this->nodeNameResolver->getName($property->props[0]->name) : $this->nodeNameResolver->getName($property);
if ($property instanceof \PhpParser\Node\Stmt\Property) {
$kindPropertyFetch = $property->isStatic() ? \PhpParser\Node\Expr\StaticPropertyFetch::class : \PhpParser\Node\Expr\PropertyFetch::class;
} else {
$kindPropertyFetch = \get_class($property);
}
return $this->isParamFilledStmts($params, $stmts, $propertyName, $kindPropertyFetch);
}
/**
* @param string[] $propertyNames
*/
public function isLocalPropertyOfNames(\PhpParser\Node $node, array $propertyNames) : bool
{
if (!$this->isLocalPropertyFetch($node)) {
return \false;
}
/** @var PropertyFetch $node */
return $this->nodeNameResolver->isNames($node->name, $propertyNames);
}
/**
* @param Param[] $params
* @param Stmt[] $stmts
*/
private function isParamFilledStmts(array $params, array $stmts, string $propertyName, string $kindPropertyFetch) : bool
{
foreach ($params as $param) {
$paramVariable = $param->var;
$isAssignWithParamVarName = $this->betterNodeFinder->findFirst($stmts, function (\PhpParser\Node $node) use($propertyName, $paramVariable, $kindPropertyFetch) : bool {
if (!$node instanceof \PhpParser\Node\Expr\Assign) {
return \false;
}
if ($kindPropertyFetch !== \get_class($node->var)) {
return \false;
}
if (!$this->nodeNameResolver->isName($node->var, $propertyName)) {
return \false;
}
return $this->nodeComparator->areNodesEqual($node->expr, $paramVariable);
});
if ($isAssignWithParamVarName !== null) {
return \true;
}
}
return \false;
}
}