rector/rules/Transform/ValueObject/StaticCallToMethodCall.php

81 lines
2.1 KiB
PHP

<?php
declare (strict_types=1);
namespace Rector\Transform\ValueObject;
use PhpParser\Node\Expr\StaticCall;
use PhpParser\Node\Identifier;
use PhpParser\Node\Name;
use PHPStan\Type\ObjectType;
use Rector\Validation\RectorAssert;
final class StaticCallToMethodCall
{
/**
* @readonly
* @var string
*/
private $staticClass;
/**
* @readonly
* @var string
*/
private $staticMethod;
/**
* @readonly
* @var string
*/
private $classType;
/**
* @readonly
* @var string
*/
private $methodName;
public function __construct(string $staticClass, string $staticMethod, string $classType, string $methodName)
{
$this->staticClass = $staticClass;
$this->staticMethod = $staticMethod;
$this->classType = $classType;
$this->methodName = $methodName;
RectorAssert::className($staticClass);
// special char to match all method names
if ($staticMethod !== '*') {
RectorAssert::methodName($staticMethod);
}
RectorAssert::className($classType);
if ($methodName !== '*') {
RectorAssert::methodName($methodName);
}
}
public function getClassObjectType() : ObjectType
{
return new ObjectType($this->classType);
}
public function getClassType() : string
{
return $this->classType;
}
public function getMethodName() : string
{
return $this->methodName;
}
public function isStaticCallMatch(StaticCall $staticCall) : bool
{
if (!$staticCall->class instanceof Name) {
return \false;
}
$staticCallClassName = $staticCall->class->toString();
if ($staticCallClassName !== $this->staticClass) {
return \false;
}
if (!$staticCall->name instanceof Identifier) {
return \false;
}
// all methods
if ($this->staticMethod === '*') {
return \true;
}
$staticCallMethodName = $staticCall->name->toString();
return $staticCallMethodName === $this->staticMethod;
}
}