mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-27 13:13:31 +00:00
ff9660d77a
6e320ce114
[PHP 8.0] Improve single case check (#175)
83 lines
3.1 KiB
PHP
83 lines
3.1 KiB
PHP
<?php
|
|
|
|
declare (strict_types=1);
|
|
namespace Rector\Transform\Rector\MethodCall;
|
|
|
|
use PhpParser\Node;
|
|
use PhpParser\Node\Expr\MethodCall;
|
|
use Rector\Core\Contract\Rector\ConfigurableRectorInterface;
|
|
use Rector\Core\Rector\AbstractRector;
|
|
use Rector\Transform\ValueObject\ReplaceParentCallByPropertyCall;
|
|
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
|
|
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
|
|
use RectorPrefix20210608\Webmozart\Assert\Assert;
|
|
/**
|
|
* @see \Rector\Tests\Transform\Rector\MethodCall\ReplaceParentCallByPropertyCallRector\ReplaceParentCallByPropertyCallRectorTest
|
|
*/
|
|
final class ReplaceParentCallByPropertyCallRector extends \Rector\Core\Rector\AbstractRector implements \Rector\Core\Contract\Rector\ConfigurableRectorInterface
|
|
{
|
|
/**
|
|
* @var string
|
|
*/
|
|
public const PARENT_CALLS_TO_PROPERTIES = 'parent_calls_to_properties';
|
|
/**
|
|
* @var ReplaceParentCallByPropertyCall[]
|
|
*/
|
|
private $parentCallToProperties = [];
|
|
public function getRuleDefinition() : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
|
|
{
|
|
return new \Symplify\RuleDocGenerator\ValueObject\RuleDefinition('Changes method calls in child of specific types to defined property method call', [new \Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample(<<<'CODE_SAMPLE'
|
|
final class SomeClass
|
|
{
|
|
public function run(SomeTypeToReplace $someTypeToReplace)
|
|
{
|
|
$someTypeToReplace->someMethodCall();
|
|
}
|
|
}
|
|
CODE_SAMPLE
|
|
, <<<'CODE_SAMPLE'
|
|
final class SomeClass
|
|
{
|
|
public function run(SomeTypeToReplace $someTypeToReplace)
|
|
{
|
|
$this->someProperty->someMethodCall();
|
|
}
|
|
}
|
|
CODE_SAMPLE
|
|
, [self::PARENT_CALLS_TO_PROPERTIES => [new \Rector\Transform\ValueObject\ReplaceParentCallByPropertyCall('SomeTypeToReplace', 'someMethodCall', 'someProperty')]])]);
|
|
}
|
|
/**
|
|
* @return array<class-string<Node>>
|
|
*/
|
|
public function getNodeTypes() : array
|
|
{
|
|
return [\PhpParser\Node\Expr\MethodCall::class];
|
|
}
|
|
/**
|
|
* @param MethodCall $node
|
|
*/
|
|
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
|
|
{
|
|
foreach ($this->parentCallToProperties as $parentCallToProperty) {
|
|
if (!$this->isObjectType($node->var, $parentCallToProperty->getObjectType())) {
|
|
continue;
|
|
}
|
|
if (!$this->isName($node->name, $parentCallToProperty->getMethod())) {
|
|
continue;
|
|
}
|
|
$node->var = $this->nodeFactory->createPropertyFetch('this', $parentCallToProperty->getProperty());
|
|
return $node;
|
|
}
|
|
return null;
|
|
}
|
|
/**
|
|
* @param array<string, ReplaceParentCallByPropertyCall[]> $configuration
|
|
*/
|
|
public function configure(array $configuration) : void
|
|
{
|
|
$parentCallToProperties = $configuration[self::PARENT_CALLS_TO_PROPERTIES] ?? [];
|
|
\RectorPrefix20210608\Webmozart\Assert\Assert::allIsInstanceOf($parentCallToProperties, \Rector\Transform\ValueObject\ReplaceParentCallByPropertyCall::class);
|
|
$this->parentCallToProperties = $parentCallToProperties;
|
|
}
|
|
}
|