rector/packages/NodeTypeResolver/NodeTypeResolver/PropertyTypeResolver.php

51 lines
1.7 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 RectorPrefix20220607\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 \Rector\NodeTypeResolver\Contract\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(\Rector\NodeTypeResolver\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 [\PhpParser\Node\Stmt\Property::class];
2018-08-06 21:41:01 +00:00
}
/**
* @param Property $node
2018-08-06 21:41:01 +00:00
*/
public function resolve(\PhpParser\Node $node) : \PHPStan\Type\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 \PhpParser\Node\Expr\PropertyFetch(new \PhpParser\Node\Expr\Variable('this'), (string) $node->props[0]->name);
$propertyFetch->setAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::SCOPE, $node->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::SCOPE));
return $this->nodeTypeResolver->getType($propertyFetch);
2018-08-06 21:41:01 +00:00
}
}