rector/packages/ReadWrite/ReadNodeAnalyzer/LocalPropertyFetchReadNodeAnalyzer.php
Tomas Votruba 96112cb1f0 Updated Rector to commit 2da49992ccc8e6d4b20e92a5833316d381921391
2da49992cc [Downgrade] [PHP 7.2] Make DowngradeParameterTypeWideningRector always downgrade to phpdoc type (#390)
2021-07-05 22:50:18 +00:00

64 lines
2.2 KiB
PHP

<?php
declare (strict_types=1);
namespace Rector\ReadWrite\ReadNodeAnalyzer;
use PhpParser\Node;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Stmt\Class_;
use Rector\Core\PhpParser\NodeFinder\PropertyFetchFinder;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\ReadWrite\Contract\ReadNodeAnalyzerInterface;
final class LocalPropertyFetchReadNodeAnalyzer implements \Rector\ReadWrite\Contract\ReadNodeAnalyzerInterface
{
/**
* @var \Rector\ReadWrite\ReadNodeAnalyzer\JustReadExprAnalyzer
*/
private $justReadExprAnalyzer;
/**
* @var \Rector\Core\PhpParser\NodeFinder\PropertyFetchFinder
*/
private $propertyFetchFinder;
/**
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
public function __construct(\Rector\ReadWrite\ReadNodeAnalyzer\JustReadExprAnalyzer $justReadExprAnalyzer, \Rector\Core\PhpParser\NodeFinder\PropertyFetchFinder $propertyFetchFinder, \Rector\NodeNameResolver\NodeNameResolver $nodeNameResolver)
{
$this->justReadExprAnalyzer = $justReadExprAnalyzer;
$this->propertyFetchFinder = $propertyFetchFinder;
$this->nodeNameResolver = $nodeNameResolver;
}
/**
* @param \PhpParser\Node $node
*/
public function supports($node) : bool
{
return $node instanceof \PhpParser\Node\Expr\PropertyFetch;
}
/**
* @param \PhpParser\Node $node
*/
public function isRead($node) : bool
{
$class = $node->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CLASS_NODE);
if (!$class instanceof \PhpParser\Node\Stmt\Class_) {
// assume worse to keep node protected
return \true;
}
$propertyName = $this->nodeNameResolver->getName($node->name);
if ($propertyName === null) {
// assume worse to keep node protected
return \true;
}
$propertyFetches = $this->propertyFetchFinder->findLocalPropertyFetchesByName($class, $propertyName);
foreach ($propertyFetches as $propertyFetch) {
if ($this->justReadExprAnalyzer->isReadContext($propertyFetch)) {
return \true;
}
}
return \false;
}
}