mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-07 11:50:51 +00:00
Updated Rector to commit aa345bc51d
aa345bc51d
[Php74] Add class-string to string support on TypedPropertyRector (#2120)
This commit is contained in:
parent
8166f3df0d
commit
90aca384f1
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
/**
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
2
vendor/autoload.php
vendored
|
@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) {
|
|||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInit8e794bbd8f15e107f0e40cc23a6b19d2::getLoader();
|
||||
return ComposerAutoloaderInitb874cc6a8c60995c5aadc4965663f41d::getLoader();
|
||||
|
|
14
vendor/composer/autoload_real.php
vendored
14
vendor/composer/autoload_real.php
vendored
|
@ -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;
|
||||
|
|
8
vendor/composer/autoload_static.php
vendored
8
vendor/composer/autoload_static.php
vendored
|
@ -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);
|
||||
}
|
||||
|
|
10
vendor/scoper-autoload.php
vendored
10
vendor/scoper-autoload.php
vendored
|
@ -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')) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user