From 963e52618c5a2870bc96f02f295bc4f48c3e0406 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 27 Jul 2022 18:51:59 +0000 Subject: [PATCH] Updated Rector to commit 89bd84eafaab9ab66a4fcd6a1a4df67d15040732 https://github.com/rectorphp/rector-src/commit/89bd84eafaab9ab66a4fcd6a1a4df67d15040732 [DeadCode] Skip RemoveAlwaysTrueIfConditionRector on property use by @var docblock (#2717) --- .../If_/RemoveAlwaysTrueIfConditionRector.php | 37 +++++++++++++++++++ src/Application/VersionResolver.php | 4 +- src/Reflection/ReflectionResolver.php | 17 +++++++-- vendor/autoload.php | 2 +- vendor/composer/autoload_real.php | 14 +++---- vendor/composer/autoload_static.php | 8 ++-- 6 files changed, 65 insertions(+), 17 deletions(-) diff --git a/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php b/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php index 10de909103c..adf0a031cd7 100644 --- a/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php +++ b/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php @@ -4,10 +4,15 @@ declare (strict_types=1); namespace Rector\DeadCode\Rector\If_; use PhpParser\Node; +use PhpParser\Node\Expr; +use PhpParser\Node\Expr\PropertyFetch; +use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\If_; +use PHPStan\Reflection\ClassReflection; use PHPStan\Type\Constant\ConstantBooleanType; use Rector\Core\Rector\AbstractRector; +use Rector\Core\Reflection\ReflectionResolver; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -15,6 +20,15 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; */ final class RemoveAlwaysTrueIfConditionRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\Reflection\ReflectionResolver + */ + private $reflectionResolver; + public function __construct(ReflectionResolver $reflectionResolver) + { + $this->reflectionResolver = $reflectionResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove if condition that is always true', [new CodeSample(<<<'CODE_SAMPLE' @@ -70,10 +84,33 @@ CODE_SAMPLE if (!$conditionStaticType->getValue()) { return null; } + if ($this->shouldSkipPropertyFetch($node->cond)) { + return null; + } if ($node->stmts === []) { $this->removeNode($node); return null; } return $node->stmts; } + private function shouldSkipPropertyFetch(Expr $expr) : bool + { + /** @var PropertyFetch[]|StaticPropertyFetch[] $propertyFetches */ + $propertyFetches = $this->betterNodeFinder->findInstancesOf($expr, [PropertyFetch::class, StaticPropertyFetch::class]); + foreach ($propertyFetches as $propertyFetch) { + $classReflection = $this->reflectionResolver->resolveClassReflectionSourceObject($propertyFetch); + if (!$classReflection instanceof ClassReflection) { + continue; + } + $propertyName = (string) $this->nodeNameResolver->getName($propertyFetch); + if (!$classReflection->hasNativeProperty($propertyName)) { + continue; + } + $nativeProperty = $classReflection->getNativeProperty($propertyName); + if (!$nativeProperty->hasNativeType()) { + return \true; + } + } + return \false; + } } diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index 61eecd1aebe..979d8965727 100644 --- a/src/Application/VersionResolver.php +++ b/src/Application/VersionResolver.php @@ -17,12 +17,12 @@ final class VersionResolver * @api * @var string */ - public const PACKAGE_VERSION = 'd94ded9b22fff22e7923bb3158d56407e9f80897'; + public const PACKAGE_VERSION = '89bd84eafaab9ab66a4fcd6a1a4df67d15040732'; /** * @api * @var string */ - public const RELEASE_DATE = '2022-07-27 10:48:10'; + public const RELEASE_DATE = '2022-07-28 01:47:03'; /** * @var int */ diff --git a/src/Reflection/ReflectionResolver.php b/src/Reflection/ReflectionResolver.php index 0da859890f1..cffaa276705 100644 --- a/src/Reflection/ReflectionResolver.php +++ b/src/Reflection/ReflectionResolver.php @@ -106,11 +106,22 @@ final class ReflectionResolver return $scope->getClassReflection(); } /** - * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall $call + * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\StaticCall|\PhpParser\Node\Expr\PropertyFetch|\PhpParser\Node\Expr\StaticPropertyFetch $node */ - public function resolveClassReflectionSourceObject($call) : ?ClassReflection + public function resolveClassReflectionSourceObject($node) : ?ClassReflection { - $classMethod = $this->astResolver->resolveClassMethodFromCall($call); + if ($node instanceof PropertyFetch || $node instanceof StaticPropertyFetch) { + $objectType = $node instanceof PropertyFetch ? $this->nodeTypeResolver->getType($node->var) : $this->nodeTypeResolver->getType($node->class); + if (!$objectType instanceof TypeWithClassName) { + return null; + } + $className = $objectType->getClassName(); + if (!$this->reflectionProvider->hasClass($className)) { + return null; + } + return $this->reflectionProvider->getClass($className); + } + $classMethod = $this->astResolver->resolveClassMethodFromCall($node); return $this->resolveClassReflection($classMethod); } /** diff --git a/vendor/autoload.php b/vendor/autoload.php index 64ec63bef0f..39efdf12559 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) { require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit392e520b63b70979e6167fd32c6083e8::getLoader(); +return ComposerAutoloaderInit2089a995a509cf6e789d4bbc9384b709::getLoader(); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 639e9dc7e30..657f48a3a52 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit392e520b63b70979e6167fd32c6083e8 +class ComposerAutoloaderInit2089a995a509cf6e789d4bbc9384b709 { private static $loader; @@ -22,19 +22,19 @@ class ComposerAutoloaderInit392e520b63b70979e6167fd32c6083e8 return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInit392e520b63b70979e6167fd32c6083e8', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInit2089a995a509cf6e789d4bbc9384b709', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit392e520b63b70979e6167fd32c6083e8', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInit2089a995a509cf6e789d4bbc9384b709', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit392e520b63b70979e6167fd32c6083e8::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInit2089a995a509cf6e789d4bbc9384b709::getInitializer($loader)); $loader->setClassMapAuthoritative(true); $loader->register(true); - $includeFiles = \Composer\Autoload\ComposerStaticInit392e520b63b70979e6167fd32c6083e8::$files; + $includeFiles = \Composer\Autoload\ComposerStaticInit2089a995a509cf6e789d4bbc9384b709::$files; foreach ($includeFiles as $fileIdentifier => $file) { - composerRequire392e520b63b70979e6167fd32c6083e8($fileIdentifier, $file); + composerRequire2089a995a509cf6e789d4bbc9384b709($fileIdentifier, $file); } return $loader; @@ -46,7 +46,7 @@ class ComposerAutoloaderInit392e520b63b70979e6167fd32c6083e8 * @param string $file * @return void */ -function composerRequire392e520b63b70979e6167fd32c6083e8($fileIdentifier, $file) +function composerRequire2089a995a509cf6e789d4bbc9384b709($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 732a0cfbbe3..e3338438761 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInit392e520b63b70979e6167fd32c6083e8 +class ComposerStaticInit2089a995a509cf6e789d4bbc9384b709 { public static $files = array ( '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', @@ -3407,9 +3407,9 @@ class ComposerStaticInit392e520b63b70979e6167fd32c6083e8 public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit392e520b63b70979e6167fd32c6083e8::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit392e520b63b70979e6167fd32c6083e8::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit392e520b63b70979e6167fd32c6083e8::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInit2089a995a509cf6e789d4bbc9384b709::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit2089a995a509cf6e789d4bbc9384b709::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit2089a995a509cf6e789d4bbc9384b709::$classMap; }, null, ClassLoader::class); }