diff --git a/packages/NodeTypeResolver/src/NodeTypeResolver.php b/packages/NodeTypeResolver/src/NodeTypeResolver.php index 85ac71e4b3d..652b524e555 100644 --- a/packages/NodeTypeResolver/src/NodeTypeResolver.php +++ b/packages/NodeTypeResolver/src/NodeTypeResolver.php @@ -6,7 +6,6 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Param; -use PhpParser\Node\Stmt\Property; use PHPStan\Analyser\Scope; use PHPStan\Broker\Broker; use PHPStan\TrinaryLogic; @@ -19,7 +18,6 @@ use Rector\BetterPhpDocParser\NodeAnalyzer\DocBlockAnalyzer; use Rector\Node\Attribute; use Rector\NodeTypeResolver\Contract\PerNodeTypeResolver\PerNodeTypeResolverInterface; use Rector\NodeTypeResolver\Reflection\ClassReflectionTypesResolver; -use Rector\Php\TypeAnalyzer; final class NodeTypeResolver { @@ -38,11 +36,6 @@ final class NodeTypeResolver */ private $docBlockAnalyzer; - /** - * @var TypeAnalyzer - */ - private $typeAnalyzer; - /** * @var Broker */ @@ -51,12 +44,10 @@ final class NodeTypeResolver public function __construct( ClassReflectionTypesResolver $classReflectionTypesResolver, DocBlockAnalyzer $docBlockAnalyzer, - TypeAnalyzer $typeAnalyzer, Broker $broker ) { $this->classReflectionTypesResolver = $classReflectionTypesResolver; $this->docBlockAnalyzer = $docBlockAnalyzer; - $this->typeAnalyzer = $typeAnalyzer; $this->broker = $broker; } @@ -91,23 +82,6 @@ final class NodeTypeResolver return $this->resolveExprNode($node); } - if ($node instanceof Property) { - // doc - $propertyTypes = $this->docBlockAnalyzer->getVarTypes($node); - if ($propertyTypes === []) { - return []; - } - - $propertyTypes = $this->filterOutScalarTypes($propertyTypes); - - foreach ($propertyTypes as $propertyType) { - $propertyClassReflection = $this->broker->getClass($propertyType); - $propertyTypes += $this->classReflectionTypesResolver->resolve($propertyClassReflection); - } - - return $propertyTypes; - } - $nodeClass = get_class($node); if (isset($this->perNodeTypeResolvers[$nodeClass])) { return $this->perNodeTypeResolvers[$nodeClass]->resolve($node); @@ -203,22 +177,4 @@ final class NodeTypeResolver return array_unique($variableTypes); } - - /** - * @param string[] $propertyTypes - * @return string[] - */ - private function filterOutScalarTypes(array $propertyTypes): array - { - foreach ($propertyTypes as $key => $type) { - if (! $this->typeAnalyzer->isPhpReservedType($type)) { - continue; - } - unset($propertyTypes[$key]); - } - if ($propertyTypes === ['null']) { - return []; - } - return $propertyTypes; - } } diff --git a/packages/NodeTypeResolver/src/PerNodeTypeResolver/PropertyTypeResolver.php b/packages/NodeTypeResolver/src/PerNodeTypeResolver/PropertyTypeResolver.php new file mode 100644 index 00000000000..1598f1e0d1a --- /dev/null +++ b/packages/NodeTypeResolver/src/PerNodeTypeResolver/PropertyTypeResolver.php @@ -0,0 +1,96 @@ +classReflectionTypesResolver = $classReflectionTypesResolver; + $this->docBlockAnalyzer = $docBlockAnalyzer; + $this->broker = $broker; + $this->typeAnalyzer = $typeAnalyzer; + } + + /** + * @return string[] + */ + public function getNodeClasses(): array + { + return [Property::class]; + } + + /** + * @param Property $propertyNode + * @return string[] + */ + public function resolve(Node $propertyNode): array + { + // doc + $propertyTypes = $this->docBlockAnalyzer->getVarTypes($propertyNode); + if ($propertyTypes === []) { + return []; + } + + $propertyTypes = $this->filterOutScalarTypes($propertyTypes); + + foreach ($propertyTypes as $propertyType) { + $propertyClassReflection = $this->broker->getClass($propertyType); + $propertyTypes += $this->classReflectionTypesResolver->resolve($propertyClassReflection); + } + + return $propertyTypes; + } + + /** + * @param string[] $propertyTypes + * @return string[] + */ + private function filterOutScalarTypes(array $propertyTypes): array + { + foreach ($propertyTypes as $key => $type) { + if (! $this->typeAnalyzer->isPhpReservedType($type)) { + continue; + } + unset($propertyTypes[$key]); + } + + if ($propertyTypes === ['null']) { + return []; + } + + return $propertyTypes; + } +}