*/ final class UnionPhpDocTypeMapper implements PhpDocTypeMapperInterface { /** * @readonly * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ private $typeFactory; /** * @readonly * @var \Rector\StaticTypeMapper\PhpDocParser\IdentifierPhpDocTypeMapper */ private $identifierPhpDocTypeMapper; /** * @readonly * @var \Rector\StaticTypeMapper\PhpDocParser\IntersectionPhpDocTypeMapper */ private $intersectionPhpDocTypeMapper; /** * @readonly * @var \PHPStan\PhpDoc\TypeNodeResolver */ private $typeNodeResolver; public function __construct(TypeFactory $typeFactory, \Rector\StaticTypeMapper\PhpDocParser\IdentifierPhpDocTypeMapper $identifierPhpDocTypeMapper, \Rector\StaticTypeMapper\PhpDocParser\IntersectionPhpDocTypeMapper $intersectionPhpDocTypeMapper, TypeNodeResolver $typeNodeResolver) { $this->typeFactory = $typeFactory; $this->identifierPhpDocTypeMapper = $identifierPhpDocTypeMapper; $this->intersectionPhpDocTypeMapper = $intersectionPhpDocTypeMapper; $this->typeNodeResolver = $typeNodeResolver; } public function getNodeType() : string { return UnionTypeNode::class; } /** * @param UnionTypeNode $typeNode */ public function mapToPHPStanType(TypeNode $typeNode, Node $node, NameScope $nameScope) : Type { $unionedTypes = []; foreach ($typeNode->types as $unionedTypeNode) { if ($unionedTypeNode instanceof IdentifierTypeNode) { $unionedTypes[] = $this->identifierPhpDocTypeMapper->mapToPHPStanType($unionedTypeNode, $node, $nameScope); continue; } if ($unionedTypeNode instanceof IntersectionTypeNode) { $unionedTypes[] = $this->intersectionPhpDocTypeMapper->mapToPHPStanType($unionedTypeNode, $node, $nameScope); continue; } $unionedTypes[] = $this->typeNodeResolver->resolve($unionedTypeNode, $nameScope); } // to prevent missing class error, e.g. in tests return $this->typeFactory->createMixedPassedOrUnionTypeAndKeepConstant($unionedTypes); } }