decouple PhpParser mappers to StaticTypeMapper

This commit is contained in:
TomasVotruba 2020-02-10 10:23:01 +01:00
parent 2a930f893d
commit 8d47291c96
19 changed files with 74 additions and 78 deletions

View File

@ -40,7 +40,7 @@ final class NodeTypeResolver
/**
* @var NodeTypeResolverInterface[]
*/
private $perNodeTypeResolvers = [];
private $nodeTypeResolvers = [];
/**
* @var NodeNameResolver
@ -73,7 +73,7 @@ final class NodeTypeResolver
private $arrayTypeAnalyzer;
/**
* @param NodeTypeResolverInterface[] $perNodeTypeResolvers
* @param NodeTypeResolverInterface[] $nodeTypeResolvers
*/
public function __construct(
NodeNameResolver $nodeNameResolver,
@ -81,12 +81,12 @@ final class NodeTypeResolver
ReflectionProvider $reflectionProvider,
TypeFactory $typeFactory,
ObjectTypeSpecifier $objectTypeSpecifier,
array $perNodeTypeResolvers
array $nodeTypeResolvers
) {
$this->nodeNameResolver = $nodeNameResolver;
foreach ($perNodeTypeResolvers as $perNodeTypeResolver) {
$this->addPerNodeTypeResolver($perNodeTypeResolver);
foreach ($nodeTypeResolvers as $nodeTypeResolver) {
$this->addNodeTypeResolver($nodeTypeResolver);
}
$this->classReflectionTypesResolver = $classReflectionTypesResolver;
@ -238,10 +238,10 @@ final class NodeTypeResolver
return is_a($this->resolve($node), $staticTypeClass);
}
private function addPerNodeTypeResolver(NodeTypeResolverInterface $perNodeTypeResolver): void
private function addNodeTypeResolver(NodeTypeResolverInterface $nodeTypeResolver): void
{
foreach ($perNodeTypeResolver->getNodeClasses() as $nodeClass) {
$this->perNodeTypeResolvers[$nodeClass] = $perNodeTypeResolver;
foreach ($nodeTypeResolver->getNodeClasses() as $nodeClass) {
$this->nodeTypeResolvers[$nodeClass] = $nodeTypeResolver;
}
}
@ -283,13 +283,13 @@ final class NodeTypeResolver
private function resolveFirstType(Node $node): Type
{
foreach ($this->perNodeTypeResolvers as $perNodeTypeResolver) {
foreach ($perNodeTypeResolver->getNodeClasses() as $nodeClass) {
foreach ($this->nodeTypeResolvers as $nodeTypeResolver) {
foreach ($nodeTypeResolver->getNodeClasses() as $nodeClass) {
if (! is_a($node, $nodeClass)) {
continue;
}
return $perNodeTypeResolver->resolve($node);
return $nodeTypeResolver->resolve($node);
}
}

View File

@ -2,7 +2,7 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\Contract\PhpDocParser;
namespace Rector\StaticTypeMapper\Contract\PhpDocParser;
use PhpParser\Node;
use PHPStan\Analyser\NameScope;

View File

@ -2,7 +2,7 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\Contract\PhpParser;
namespace Rector\StaticTypeMapper\Contract\PhpParser;
use PhpParser\Node;
use PHPStan\Type\Type;

View File

@ -2,12 +2,12 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\TypeMapper;
namespace Rector\StaticTypeMapper\Mapper;
use PhpParser\Node;
use PHPStan\Type\Type;
use Rector\Core\Exception\NotImplementedException;
use Rector\NodeTypeResolver\Contract\PhpParser\PhpParserNodeMapperInterface;
use Rector\StaticTypeMapper\Contract\PhpParser\PhpParserNodeMapperInterface;
final class PhpParserNodeMapper
{

View File

@ -2,7 +2,7 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\TypeMapper;
namespace Rector\StaticTypeMapper\Mapper;
use Nette\Utils\Strings;
use PHPStan\Type\ArrayType;
@ -20,23 +20,26 @@ use PHPStan\Type\VoidType;
final class ScalarStringToTypeMapper
{
/**
* @var string[][]
*/
private const SCALAR_NAME_BY_TYPE = [
StringType::class => ['string'],
FloatType::class => ['float', 'real', 'double'],
IntegerType::class => ['int', 'integer'],
BooleanType::class => ['false', 'true', 'bool', 'boolean'],
NullType::class => ['null'],
VoidType::class => ['void'],
ResourceType::class => ['resource'],
CallableType::class => ['callback', 'callable'],
ObjectWithoutClassType::class => ['object'],
];
public function mapScalarStringToType(string $scalarName): Type
{
$loweredScalarName = Strings::lower($scalarName);
$scalarNameByType = [
StringType::class => ['string'],
FloatType::class => ['float', 'real', 'double'],
IntegerType::class => ['int', 'integer'],
BooleanType::class => ['false', 'true', 'bool', 'boolean'],
NullType::class => ['null'],
VoidType::class => ['void'],
ResourceType::class => ['resource'],
CallableType::class => ['callback', 'callable'],
ObjectWithoutClassType::class => ['object'],
];
foreach ($scalarNameByType as $objectType => $scalarNames) {
foreach (self::SCALAR_NAME_BY_TYPE as $objectType => $scalarNames) {
if (! in_array($loweredScalarName, $scalarNames, true)) {
continue;
}

View File

@ -14,25 +14,22 @@ use Rector\Core\Exception\NotImplementedException;
final class StringTypeToPhpParserNodeMapper
{
/**
* @var string[]
*/
private const SAME_NAMED_IDENTIFIERS = ['string', 'int', 'float', 'array', 'void'];
/**
* @return Identifier|Name|NullableType
*/
public function map(string $type): Node
{
if ($type === 'string') {
return new Identifier('string');
}
foreach (self::SAME_NAMED_IDENTIFIERS as $sameNamedIdentifier) {
if ($type !== $sameNamedIdentifier) {
continue;
}
if ($type === 'int') {
return new Identifier('int');
}
if ($type === 'array') {
return new Identifier('array');
}
if ($type === 'float') {
return new Identifier('float');
return new Identifier($sameNamedIdentifier);
}
if (Strings::contains($type, '\\') || ctype_upper($type[0])) {
@ -48,10 +45,6 @@ final class StringTypeToPhpParserNodeMapper
return new NullableType($nameNode);
}
if ($type === 'void') {
return new Identifier('void');
}
throw new NotImplementedException(sprintf('%s for "%s"', __METHOD__, $type));
}
}

View File

@ -2,14 +2,14 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\PhpDoc;
namespace Rector\StaticTypeMapper\PhpDoc;
use PhpParser\Node;
use PHPStan\Analyser\NameScope;
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
use PHPStan\Type\Type;
use Rector\Core\Exception\NotImplementedException;
use Rector\NodeTypeResolver\Contract\PhpDocParser\PhpDocTypeMapperInterface;
use Rector\StaticTypeMapper\Contract\PhpDocParser\PhpDocTypeMapperInterface;
final class PhpDocTypeMapper
{

View File

@ -2,7 +2,7 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\PhpDocParser;
namespace Rector\StaticTypeMapper\PhpDocParser;
use PhpParser\Node;
use PHPStan\Analyser\NameScope;
@ -11,8 +11,8 @@ use PHPStan\PhpDocParser\Ast\Type\TypeNode;
use PHPStan\Type\ArrayType;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use Rector\NodeTypeResolver\Contract\PhpDocParser\PhpDocTypeMapperInterface;
use Rector\NodeTypeResolver\PhpDoc\PhpDocTypeMapper;
use Rector\StaticTypeMapper\Contract\PhpDocParser\PhpDocTypeMapperInterface;
use Rector\StaticTypeMapper\PhpDoc\PhpDocTypeMapper;
final class ArrayTypeMapper implements PhpDocTypeMapperInterface
{

View File

@ -2,7 +2,7 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\PhpDocParser;
namespace Rector\StaticTypeMapper\PhpDocParser;
use PhpParser\Node;
use PHPStan\Analyser\NameScope;
@ -10,7 +10,7 @@ use PHPStan\PhpDoc\TypeNodeResolver;
use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
use PHPStan\Type\Type;
use Rector\NodeTypeResolver\Contract\PhpDocParser\PhpDocTypeMapperInterface;
use Rector\StaticTypeMapper\Contract\PhpDocParser\PhpDocTypeMapperInterface;
final class GenericTypeMapper implements PhpDocTypeMapperInterface
{

View File

@ -2,7 +2,7 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\PhpDocParser;
namespace Rector\StaticTypeMapper\PhpDocParser;
use PhpParser\Node;
use PHPStan\Analyser\NameScope;
@ -16,11 +16,11 @@ use PHPStan\Type\StaticType;
use PHPStan\Type\Type;
use Rector\AttributeAwarePhpDoc\Ast\Type\AttributeAwareIdentifierTypeNode;
use Rector\BetterPhpDocParser\Type\PreSlashStringType;
use Rector\NodeTypeResolver\Contract\PhpDocParser\PhpDocTypeMapperInterface;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\NodeTypeResolver\TypeMapper\ScalarStringToTypeMapper;
use Rector\PHPStan\Type\ParentStaticType;
use Rector\PHPStan\Type\SelfObjectType;
use Rector\StaticTypeMapper\Contract\PhpDocParser\PhpDocTypeMapperInterface;
use Rector\StaticTypeMapper\Mapper\ScalarStringToTypeMapper;
use Rector\TypeDeclaration\PHPStan\Type\ObjectTypeSpecifier;
final class IdentifierTypeMapper implements PhpDocTypeMapperInterface

View File

@ -2,16 +2,16 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\PhpDocParser;
namespace Rector\StaticTypeMapper\PhpDocParser;
use PhpParser\Node;
use PHPStan\Analyser\NameScope;
use PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode;
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
use PHPStan\Type\Type;
use Rector\NodeTypeResolver\Contract\PhpDocParser\PhpDocTypeMapperInterface;
use Rector\NodeTypeResolver\PhpDoc\PhpDocTypeMapper;
use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory;
use Rector\StaticTypeMapper\Contract\PhpDocParser\PhpDocTypeMapperInterface;
use Rector\StaticTypeMapper\PhpDoc\PhpDocTypeMapper;
final class IntersectionTypeMapper implements PhpDocTypeMapperInterface
{

View File

@ -2,7 +2,7 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\PhpDocParser;
namespace Rector\StaticTypeMapper\PhpDocParser;
use PhpParser\Node;
use PHPStan\Analyser\NameScope;
@ -11,8 +11,8 @@ use PHPStan\PhpDocParser\Ast\Type\TypeNode;
use PHPStan\Type\ThisType;
use PHPStan\Type\Type;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\NodeTypeResolver\Contract\PhpDocParser\PhpDocTypeMapperInterface;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\StaticTypeMapper\Contract\PhpDocParser\PhpDocTypeMapperInterface;
final class ThisTypeMapper implements PhpDocTypeMapperInterface
{

View File

@ -2,16 +2,16 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\PhpDocParser;
namespace Rector\StaticTypeMapper\PhpDocParser;
use PhpParser\Node;
use PHPStan\Analyser\NameScope;
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode;
use PHPStan\Type\Type;
use Rector\NodeTypeResolver\Contract\PhpDocParser\PhpDocTypeMapperInterface;
use Rector\NodeTypeResolver\PhpDoc\PhpDocTypeMapper;
use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory;
use Rector\StaticTypeMapper\Contract\PhpDocParser\PhpDocTypeMapperInterface;
use Rector\StaticTypeMapper\PhpDoc\PhpDocTypeMapper;
final class UnionTypeMapper implements PhpDocTypeMapperInterface
{

View File

@ -2,15 +2,15 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\PhpParser;
namespace Rector\StaticTypeMapper\PhpParser;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PHPStan\Analyser\Scope;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use Rector\NodeTypeResolver\Contract\PhpParser\PhpParserNodeMapperInterface;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\StaticTypeMapper\Contract\PhpParser\PhpParserNodeMapperInterface;
final class ExprNodeMapper implements PhpParserNodeMapperInterface
{

View File

@ -2,13 +2,13 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\PhpParser;
namespace Rector\StaticTypeMapper\PhpParser;
use PhpParser\Node;
use PhpParser\Node\Name\FullyQualified;
use PHPStan\Type\Type;
use Rector\NodeTypeResolver\Contract\PhpParser\PhpParserNodeMapperInterface;
use Rector\PHPStan\Type\FullyQualifiedObjectType;
use Rector\StaticTypeMapper\Contract\PhpParser\PhpParserNodeMapperInterface;
final class FullyQualifiedNodeMapper implements PhpParserNodeMapperInterface
{

View File

@ -2,15 +2,15 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\PhpParser;
namespace Rector\StaticTypeMapper\PhpParser;
use PhpParser\Node;
use PhpParser\Node\Identifier;
use PHPStan\Type\MixedType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use Rector\NodeTypeResolver\Contract\PhpParser\PhpParserNodeMapperInterface;
use Rector\NodeTypeResolver\TypeMapper\ScalarStringToTypeMapper;
use Rector\StaticTypeMapper\Contract\PhpParser\PhpParserNodeMapperInterface;
use Rector\StaticTypeMapper\Mapper\ScalarStringToTypeMapper;
final class IdentifierNodeMapper implements PhpParserNodeMapperInterface
{

View File

@ -2,15 +2,15 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\PhpParser;
namespace Rector\StaticTypeMapper\PhpParser;
use PhpParser\Node;
use PhpParser\Node\Name;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use Rector\NodeTypeResolver\ClassExistenceStaticHelper;
use Rector\NodeTypeResolver\Contract\PhpParser\PhpParserNodeMapperInterface;
use Rector\PHPStan\Type\FullyQualifiedObjectType;
use Rector\StaticTypeMapper\Contract\PhpParser\PhpParserNodeMapperInterface;
final class NameNodeMapper implements PhpParserNodeMapperInterface
{

View File

@ -2,15 +2,15 @@
declare(strict_types=1);
namespace Rector\NodeTypeResolver\PhpParser;
namespace Rector\StaticTypeMapper\PhpParser;
use PhpParser\Node;
use PhpParser\Node\NullableType;
use PHPStan\Type\NullType;
use PHPStan\Type\Type;
use Rector\NodeTypeResolver\Contract\PhpParser\PhpParserNodeMapperInterface;
use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory;
use Rector\NodeTypeResolver\TypeMapper\PhpParserNodeMapper;
use Rector\StaticTypeMapper\Contract\PhpParser\PhpParserNodeMapperInterface;
use Rector\StaticTypeMapper\Mapper\PhpParserNodeMapper;
final class NullableTypeNodeMapper implements PhpParserNodeMapperInterface
{

View File

@ -16,10 +16,10 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode;
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
use PHPStan\Type\Type;
use Rector\Core\Exception\NotImplementedException;
use Rector\NodeTypeResolver\PhpDoc\PhpDocTypeMapper;
use Rector\NodeTypeResolver\TypeMapper\PhpParserNodeMapper;
use Rector\PHPStanStaticTypeMapper\PHPStanStaticTypeMapper;
use Rector\StaticTypeMapper\Mapper\PhpParserNodeMapper;
use Rector\StaticTypeMapper\Mapper\StringTypeToPhpParserNodeMapper;
use Rector\StaticTypeMapper\PhpDoc\PhpDocTypeMapper;
use Rector\StaticTypeMapper\PHPStan\NameScopeFactory;
/**