rector/packages/NodeTypeResolver/NodeTypeResolver/PropertyTypeResolver.php

51 lines
1.5 KiB
PHP
Raw Normal View History

2019-10-13 05:59:52 +00:00
<?php
declare (strict_types=1);
namespace Rector\NodeTypeResolver\NodeTypeResolver;
2018-08-06 21:41:01 +00:00
use PhpParser\Node;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\Property;
use PHPStan\Type\Type;
use Rector\NodeTypeResolver\Contract\NodeTypeResolverInterface;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\NodeTypeResolver\NodeTypeResolver;
use RectorPrefix202302\Symfony\Contracts\Service\Attribute\Required;
2019-09-03 09:11:45 +00:00
/**
* @see \Rector\Tests\NodeTypeResolver\PerNodeTypeResolver\PropertyTypeResolver\PropertyTypeResolverTest
*
* @implements NodeTypeResolverInterface<Property>
2019-09-03 09:11:45 +00:00
*/
final class PropertyTypeResolver implements NodeTypeResolverInterface
2018-08-06 21:41:01 +00:00
{
/**
* @var \Rector\NodeTypeResolver\NodeTypeResolver
2018-08-06 21:41:01 +00:00
*/
2018-08-13 21:25:54 +00:00
private $nodeTypeResolver;
2020-01-27 22:30:40 +00:00
/**
* @required
*/
public function autowire(NodeTypeResolver $nodeTypeResolver) : void
2020-01-27 22:30:40 +00:00
{
$this->nodeTypeResolver = $nodeTypeResolver;
}
2018-08-06 21:41:01 +00:00
/**
* @return array<class-string<Node>>
2018-08-06 21:41:01 +00:00
*/
public function getNodeClasses() : array
2018-08-06 21:41:01 +00:00
{
return [Property::class];
2018-08-06 21:41:01 +00:00
}
/**
* @param Property $node
2018-08-06 21:41:01 +00:00
*/
public function resolve(Node $node) : Type
2018-08-06 21:41:01 +00:00
{
2018-09-27 15:57:10 +00:00
// fake property to local PropertyFetch → PHPStan understands that
$propertyFetch = new PropertyFetch(new Variable('this'), (string) $node->props[0]->name);
$propertyFetch->setAttribute(AttributeKey::SCOPE, $node->getAttribute(AttributeKey::SCOPE));
return $this->nodeTypeResolver->getType($propertyFetch);
2018-08-06 21:41:01 +00:00
}
}