rector/packages/NodeCollector/StaticAnalyzer.php
Tomas Votruba 667b378a17 Updated Rector to commit 88e17ecb1031251d6f67628263fcb87ecc7b67b8
88e17ecb10 [PHP 7.0] skip non-existing method in StaticCallOnNonStaticToInstanceCallRector (#2532)
2022-06-19 08:57:14 +00:00

33 lines
1.2 KiB
PHP

<?php
declare (strict_types=1);
namespace Rector\NodeCollector;
use PHPStan\PhpDoc\ResolvedPhpDocBlock;
use PHPStan\Reflection\ClassReflection;
use Rector\Core\Util\StringUtils;
final class StaticAnalyzer
{
public function isStaticMethod(ClassReflection $classReflection, string $methodName) : bool
{
if ($classReflection->hasNativeMethod($methodName)) {
$methodReflection = $classReflection->getNativeMethod($methodName);
if ($methodReflection->isStatic()) {
return \true;
}
}
// could be static in doc type magic
// @see https://regex101.com/r/tlvfTB/1
return $this->hasStaticAnnotation($methodName, $classReflection);
}
private function hasStaticAnnotation(string $methodName, ClassReflection $classReflection) : bool
{
$resolvedPhpDocBlock = $classReflection->getResolvedPhpDoc();
if (!$resolvedPhpDocBlock instanceof ResolvedPhpDocBlock) {
return \false;
}
// @see https://regex101.com/r/7Zkej2/1
return StringUtils::isMatch($resolvedPhpDocBlock->getPhpDocString(), '#@method\\s*static\\s*((([\\w\\|\\\\]+)|\\$this)*+(\\[\\])*)*\\s+\\b' . $methodName . '\\b#');
}
}