Updated Rector to commit aa345bc51d

aa345bc51d [Php74] Add class-string to string support on TypedPropertyRector (#2120)
This commit is contained in:
Tomas Votruba 2022-04-21 22:59:51 +00:00
parent 8166f3df0d
commit 90aca384f1
10 changed files with 67 additions and 31 deletions

View File

@ -11,6 +11,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode;
use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode;
use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\MixedType;
@ -34,6 +35,10 @@ final class PhpDocTypeChanger
* @var array<class-string<Node>>
*/
public const ALLOWED_TYPES = [\PHPStan\PhpDocParser\Ast\Type\GenericTypeNode::class, \Rector\BetterPhpDocParser\ValueObject\Type\SpacingAwareArrayTypeNode::class, \Rector\BetterPhpDocParser\ValueObject\Type\SpacingAwareCallableTypeNode::class, \PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode::class];
/**
* @var string[]
*/
private const ALLOWED_IDENTIFIER_TYPENODE_TYPES = ['class-string'];
/**
* @readonly
* @var \Rector\StaticTypeMapper\StaticTypeMapper
@ -156,7 +161,13 @@ final class PhpDocTypeChanger
}
}
}
return \in_array(\get_class($typeNode), self::ALLOWED_TYPES, \true);
if (\in_array(\get_class($typeNode), self::ALLOWED_TYPES, \true)) {
return \true;
}
if (!$typeNode instanceof \PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode) {
return \false;
}
return \in_array((string) $typeNode, self::ALLOWED_IDENTIFIER_TYPENODE_TYPES, \true);
}
public function copyPropertyDocToParam(\PhpParser\Node\Stmt\Property $property, \PhpParser\Node\Param $param) : void
{

View File

@ -5,6 +5,7 @@ namespace Rector\PHPStanStaticTypeMapper\TypeMapper;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Name;
use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
@ -55,7 +56,7 @@ final class ClassStringTypeMapper implements \Rector\PHPStanStaticTypeMapper\Con
*/
public function mapToPhpParserNode(\PHPStan\Type\Type $type, \Rector\PHPStanStaticTypeMapper\Enum\TypeKind $typeKind) : ?\PhpParser\Node
{
return null;
return new \PhpParser\Node\Name('string');
}
/**
* @required

View File

@ -12,7 +12,9 @@ use PhpParser\Node\NullableType;
use PhpParser\Node\UnionType as PhpParserUnionType;
use PhpParser\NodeAbstract;
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
use PHPStan\Type\ClassStringType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Generic\GenericClassStringType;
use PHPStan\Type\IterableType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NullType;
@ -222,7 +224,20 @@ final class UnionTypeMapper implements \Rector\PHPStanStaticTypeMapper\Contract\
if ($this->boolUnionTypeAnalyzer->isBoolUnionType($unionType)) {
return new \PhpParser\Node\Name('bool');
}
return $this->processResolveCompatibleObjectCandidates($unionType);
$compatibleObjectType = $this->processResolveCompatibleObjectCandidates($unionType);
if ($compatibleObjectType instanceof \PhpParser\Node\NullableType || $compatibleObjectType instanceof \PhpParser\Node\Name\FullyQualified) {
return $compatibleObjectType;
}
return $this->processResolveCompatibleStringCandidates($unionType);
}
private function processResolveCompatibleStringCandidates(\PHPStan\Type\UnionType $unionType) : ?\PhpParser\Node\Name
{
foreach ($unionType->getTypes() as $type) {
if (!\in_array(\get_class($type), [\PHPStan\Type\ClassStringType::class, \PHPStan\Type\Generic\GenericClassStringType::class], \true)) {
return null;
}
}
return new \PhpParser\Node\Name('string');
}
private function processResolveCompatibleObjectCandidates(\PHPStan\Type\UnionType $unionType) : ?\PhpParser\Node
{

View File

@ -53,6 +53,9 @@ final class VarTagRemover
if (!$isVarTagValueDead) {
return;
}
if ($this->phpDocTypeChanger->isAllowed($varTagValueNode->type)) {
return;
}
$phpDocInfo->removeByType(\PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode::class);
}
/**

View File

@ -6,6 +6,7 @@ namespace Rector\Php74\Rector\Property;
use PhpParser\Node;
use PhpParser\Node\ComplexType;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\Property;
use PHPStan\Analyser\Scope;
use PHPStan\Type\MixedType;
@ -13,7 +14,6 @@ use PHPStan\Type\NullType;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
use Rector\Core\Contract\Rector\AllowEmptyConfigurableRectorInterface;
use Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\ValueObject\PhpVersionFeature;
use Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover;
@ -23,6 +23,7 @@ use Rector\Php74\Guard\MakePropertyTypedGuard;
use Rector\Php74\TypeAnalyzer\ObjectTypeAnalyzer;
use Rector\PHPStanStaticTypeMapper\DoctrineTypeAnalyzer;
use Rector\PHPStanStaticTypeMapper\Enum\TypeKind;
use Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector;
use Rector\TypeDeclaration\TypeInferer\VarDocPropertyTypeInferer;
use Rector\VendorLocker\VendorLockResolver;
use Rector\VersionBonding\Contract\MinPhpVersionInterface;
@ -72,11 +73,6 @@ final class TypedPropertyRector extends \Rector\Core\Rector\AbstractRector imple
* @var \Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover
*/
private $varTagRemover;
/**
* @readonly
* @var \Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer
*/
private $propertyFetchAnalyzer;
/**
* @readonly
* @var \Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer
@ -92,16 +88,21 @@ final class TypedPropertyRector extends \Rector\Core\Rector\AbstractRector imple
* @var \Rector\Php74\Guard\MakePropertyTypedGuard
*/
private $makePropertyTypedGuard;
public function __construct(\Rector\TypeDeclaration\TypeInferer\VarDocPropertyTypeInferer $varDocPropertyTypeInferer, \Rector\VendorLocker\VendorLockResolver $vendorLockResolver, \Rector\PHPStanStaticTypeMapper\DoctrineTypeAnalyzer $doctrineTypeAnalyzer, \Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover $varTagRemover, \Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer $propertyFetchAnalyzer, \Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer $familyRelationsAnalyzer, \Rector\Php74\TypeAnalyzer\ObjectTypeAnalyzer $objectTypeAnalyzer, \Rector\Php74\Guard\MakePropertyTypedGuard $makePropertyTypedGuard)
/**
* @readonly
* @var \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector
*/
private $constructorAssignDetector;
public function __construct(\Rector\TypeDeclaration\TypeInferer\VarDocPropertyTypeInferer $varDocPropertyTypeInferer, \Rector\VendorLocker\VendorLockResolver $vendorLockResolver, \Rector\PHPStanStaticTypeMapper\DoctrineTypeAnalyzer $doctrineTypeAnalyzer, \Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover $varTagRemover, \Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer $familyRelationsAnalyzer, \Rector\Php74\TypeAnalyzer\ObjectTypeAnalyzer $objectTypeAnalyzer, \Rector\Php74\Guard\MakePropertyTypedGuard $makePropertyTypedGuard, \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector $constructorAssignDetector)
{
$this->varDocPropertyTypeInferer = $varDocPropertyTypeInferer;
$this->vendorLockResolver = $vendorLockResolver;
$this->doctrineTypeAnalyzer = $doctrineTypeAnalyzer;
$this->varTagRemover = $varTagRemover;
$this->propertyFetchAnalyzer = $propertyFetchAnalyzer;
$this->familyRelationsAnalyzer = $familyRelationsAnalyzer;
$this->objectTypeAnalyzer = $objectTypeAnalyzer;
$this->makePropertyTypedGuard = $makePropertyTypedGuard;
$this->constructorAssignDetector = $constructorAssignDetector;
}
public function configure(array $configuration) : void
{
@ -209,7 +210,12 @@ CODE_SAMPLE
if ($onlyProperty->default !== null) {
return;
}
if ($this->propertyFetchAnalyzer->isFilledByConstructParam($property)) {
$classLike = $this->betterNodeFinder->findParentType($property, \PhpParser\Node\Stmt\ClassLike::class);
if (!$classLike instanceof \PhpParser\Node\Stmt\ClassLike) {
return;
}
$propertyName = $this->nodeNameResolver->getName($property);
if ($this->constructorAssignDetector->isPropertyAssigned($classLike, $propertyName)) {
return;
}
$onlyProperty->default = $this->nodeFactory->createNull();

View File

@ -16,11 +16,11 @@ final class VersionResolver
/**
* @var string
*/
public const PACKAGE_VERSION = '465b3f61d68b844f545586ec5e8bb541efa4841c';
public const PACKAGE_VERSION = 'aa345bc51d32ff84a09ea791e2f59cfd2d9b75b9';
/**
* @var string
*/
public const RELEASE_DATE = '2022-04-22 00:43:09';
public const RELEASE_DATE = '2022-04-22 00:51:54';
/**
* @var string
*/

2
vendor/autoload.php vendored
View File

@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) {
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit8e794bbd8f15e107f0e40cc23a6b19d2::getLoader();
return ComposerAutoloaderInitb874cc6a8c60995c5aadc4965663f41d::getLoader();

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInit8e794bbd8f15e107f0e40cc23a6b19d2
class ComposerAutoloaderInitb874cc6a8c60995c5aadc4965663f41d
{
private static $loader;
@ -22,19 +22,19 @@ class ComposerAutoloaderInit8e794bbd8f15e107f0e40cc23a6b19d2
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInit8e794bbd8f15e107f0e40cc23a6b19d2', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInitb874cc6a8c60995c5aadc4965663f41d', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInit8e794bbd8f15e107f0e40cc23a6b19d2', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInitb874cc6a8c60995c5aadc4965663f41d', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit8e794bbd8f15e107f0e40cc23a6b19d2::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInitb874cc6a8c60995c5aadc4965663f41d::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
$includeFiles = \Composer\Autoload\ComposerStaticInit8e794bbd8f15e107f0e40cc23a6b19d2::$files;
$includeFiles = \Composer\Autoload\ComposerStaticInitb874cc6a8c60995c5aadc4965663f41d::$files;
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire8e794bbd8f15e107f0e40cc23a6b19d2($fileIdentifier, $file);
composerRequireb874cc6a8c60995c5aadc4965663f41d($fileIdentifier, $file);
}
return $loader;
@ -46,7 +46,7 @@ class ComposerAutoloaderInit8e794bbd8f15e107f0e40cc23a6b19d2
* @param string $file
* @return void
*/
function composerRequire8e794bbd8f15e107f0e40cc23a6b19d2($fileIdentifier, $file)
function composerRequireb874cc6a8c60995c5aadc4965663f41d($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInit8e794bbd8f15e107f0e40cc23a6b19d2
class ComposerStaticInitb874cc6a8c60995c5aadc4965663f41d
{
public static $files = array (
'320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
@ -3869,9 +3869,9 @@ class ComposerStaticInit8e794bbd8f15e107f0e40cc23a6b19d2
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit8e794bbd8f15e107f0e40cc23a6b19d2::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit8e794bbd8f15e107f0e40cc23a6b19d2::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit8e794bbd8f15e107f0e40cc23a6b19d2::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInitb874cc6a8c60995c5aadc4965663f41d::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitb874cc6a8c60995c5aadc4965663f41d::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitb874cc6a8c60995c5aadc4965663f41d::$classMap;
}, null, ClassLoader::class);
}

View File

@ -9,8 +9,8 @@ $loader = require_once __DIR__.'/autoload.php';
if (!class_exists('AutoloadIncluder', false) && !interface_exists('AutoloadIncluder', false) && !trait_exists('AutoloadIncluder', false)) {
spl_autoload_call('RectorPrefix20220421\AutoloadIncluder');
}
if (!class_exists('ComposerAutoloaderInit8e794bbd8f15e107f0e40cc23a6b19d2', false) && !interface_exists('ComposerAutoloaderInit8e794bbd8f15e107f0e40cc23a6b19d2', false) && !trait_exists('ComposerAutoloaderInit8e794bbd8f15e107f0e40cc23a6b19d2', false)) {
spl_autoload_call('RectorPrefix20220421\ComposerAutoloaderInit8e794bbd8f15e107f0e40cc23a6b19d2');
if (!class_exists('ComposerAutoloaderInitb874cc6a8c60995c5aadc4965663f41d', false) && !interface_exists('ComposerAutoloaderInitb874cc6a8c60995c5aadc4965663f41d', false) && !trait_exists('ComposerAutoloaderInitb874cc6a8c60995c5aadc4965663f41d', false)) {
spl_autoload_call('RectorPrefix20220421\ComposerAutoloaderInitb874cc6a8c60995c5aadc4965663f41d');
}
if (!class_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false) && !interface_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false) && !trait_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false)) {
spl_autoload_call('RectorPrefix20220421\Helmich\TypoScriptParser\Parser\AST\Statement');
@ -59,9 +59,9 @@ if (!function_exists('print_node')) {
return \RectorPrefix20220421\print_node(...func_get_args());
}
}
if (!function_exists('composerRequire8e794bbd8f15e107f0e40cc23a6b19d2')) {
function composerRequire8e794bbd8f15e107f0e40cc23a6b19d2() {
return \RectorPrefix20220421\composerRequire8e794bbd8f15e107f0e40cc23a6b19d2(...func_get_args());
if (!function_exists('composerRequireb874cc6a8c60995c5aadc4965663f41d')) {
function composerRequireb874cc6a8c60995c5aadc4965663f41d() {
return \RectorPrefix20220421\composerRequireb874cc6a8c60995c5aadc4965663f41d(...func_get_args());
}
}
if (!function_exists('scanPath')) {