diff --git a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php index ba594af51906..2c5f937eb398 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php +++ b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php @@ -6,6 +6,7 @@ use PhpParser\Node\Arg; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; +use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\MixedType; use PHPStan\Type\NullType; use PHPStan\Type\ObjectType; @@ -28,10 +29,16 @@ final class CallTypesResolver * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory */ private $typeFactory; - public function __construct(NodeTypeResolver $nodeTypeResolver, TypeFactory $typeFactory) + /** + * @readonly + * @var \PHPStan\Reflection\ReflectionProvider + */ + private $reflectionProvider; + public function __construct(NodeTypeResolver $nodeTypeResolver, TypeFactory $typeFactory, ReflectionProvider $reflectionProvider) { $this->nodeTypeResolver = $nodeTypeResolver; $this->typeFactory = $typeFactory; + $this->reflectionProvider = $reflectionProvider; } /** * @param MethodCall[]|StaticCall[]|ArrayCallable[] $calls @@ -58,7 +65,15 @@ private function resolveStrictArgValueType(Arg $arg) : Type { $argValueType = $this->nodeTypeResolver->getNativeType($arg->value); // "self" in another object is not correct, this make it independent - return $this->correctSelfType($argValueType); + $argValueType = $this->correctSelfType($argValueType); + if (!$argValueType instanceof ObjectType) { + return $argValueType; + } + // fix false positive generic type on string + if (!$this->reflectionProvider->hasClass($argValueType->getClassName())) { + return new MixedType(); + } + return $argValueType; } private function correctSelfType(Type $argValueType) : Type { diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index 5994483ac225..6c7a3b008970 100644 --- a/src/Application/VersionResolver.php +++ b/src/Application/VersionResolver.php @@ -19,12 +19,12 @@ final class VersionResolver * @api * @var string */ - public const PACKAGE_VERSION = 'fe7ed4fb9a4ed31a13f70ee9e6595552aecb0f58'; + public const PACKAGE_VERSION = '774de56c848e9b4c4bbf2a8319cbfaebd16f6ef9'; /** * @api * @var string */ - public const RELEASE_DATE = '2023-01-13 19:36:39'; + public const RELEASE_DATE = '2023-01-13 19:58:05'; /** * @var int */ diff --git a/vendor/autoload.php b/vendor/autoload.php index 37c81d4354f0..16824b6c689a 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -22,4 +22,4 @@ require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit0d4dc3401e5459c3364d9537d4cca3cf::getLoader(); +return ComposerAutoloaderInitf109fb1649a08d1a838d291377b98a7a::getLoader(); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 35619d81254f..6d6ae6776aa1 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit0d4dc3401e5459c3364d9537d4cca3cf +class ComposerAutoloaderInitf109fb1649a08d1a838d291377b98a7a { private static $loader; @@ -22,17 +22,17 @@ public static function getLoader() return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInit0d4dc3401e5459c3364d9537d4cca3cf', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInitf109fb1649a08d1a838d291377b98a7a', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit0d4dc3401e5459c3364d9537d4cca3cf', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInitf109fb1649a08d1a838d291377b98a7a', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit0d4dc3401e5459c3364d9537d4cca3cf::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInitf109fb1649a08d1a838d291377b98a7a::getInitializer($loader)); $loader->setClassMapAuthoritative(true); $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInit0d4dc3401e5459c3364d9537d4cca3cf::$files; + $filesToLoad = \Composer\Autoload\ComposerStaticInitf109fb1649a08d1a838d291377b98a7a::$files; $requireFile = static function ($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 15236c6e8228..5040dd7111d0 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInit0d4dc3401e5459c3364d9537d4cca3cf +class ComposerStaticInitf109fb1649a08d1a838d291377b98a7a { public static $files = array ( 'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php', @@ -3065,9 +3065,9 @@ class ComposerStaticInit0d4dc3401e5459c3364d9537d4cca3cf public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit0d4dc3401e5459c3364d9537d4cca3cf::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit0d4dc3401e5459c3364d9537d4cca3cf::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit0d4dc3401e5459c3364d9537d4cca3cf::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInitf109fb1649a08d1a838d291377b98a7a::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitf109fb1649a08d1a838d291377b98a7a::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInitf109fb1649a08d1a838d291377b98a7a::$classMap; }, null, ClassLoader::class); }