mirror of
https://github.com/rectorphp/rector.git
synced 2024-05-28 23:10:51 +00:00
96112cb1f0
2da49992cc
[Downgrade] [PHP 7.2] Make DowngradeParameterTypeWideningRector always downgrade to phpdoc type (#390)
119 lines
4.3 KiB
PHP
119 lines
4.3 KiB
PHP
<?php
|
|
|
|
declare (strict_types=1);
|
|
namespace Rector\DeadCode\Rector\ClassMethod;
|
|
|
|
use PhpParser\Node;
|
|
use PhpParser\Node\Param;
|
|
use PhpParser\Node\Stmt\ClassMethod;
|
|
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
|
|
use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover;
|
|
use Rector\Core\Rector\AbstractRector;
|
|
use Rector\DeadCode\NodeCollector\UnusedParameterResolver;
|
|
use Rector\DeadCode\NodeManipulator\VariadicFunctionLikeDetector;
|
|
use Rector\NodeTypeResolver\Node\AttributeKey;
|
|
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
|
|
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
|
|
/**
|
|
* @see \Rector\Tests\DeadCode\Rector\ClassMethod\RemoveUnusedPrivateMethodParameterRector\RemoveUnusedPrivateMethodParameterRectorTest
|
|
*/
|
|
final class RemoveUnusedPrivateMethodParameterRector extends \Rector\Core\Rector\AbstractRector
|
|
{
|
|
/**
|
|
* @var \Rector\DeadCode\NodeManipulator\VariadicFunctionLikeDetector
|
|
*/
|
|
private $variadicFunctionLikeDetector;
|
|
/**
|
|
* @var \Rector\DeadCode\NodeCollector\UnusedParameterResolver
|
|
*/
|
|
private $unusedParameterResolver;
|
|
/**
|
|
* @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover
|
|
*/
|
|
private $phpDocTagRemover;
|
|
public function __construct(\Rector\DeadCode\NodeManipulator\VariadicFunctionLikeDetector $variadicFunctionLikeDetector, \Rector\DeadCode\NodeCollector\UnusedParameterResolver $unusedParameterResolver, \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover $phpDocTagRemover)
|
|
{
|
|
$this->variadicFunctionLikeDetector = $variadicFunctionLikeDetector;
|
|
$this->unusedParameterResolver = $unusedParameterResolver;
|
|
$this->phpDocTagRemover = $phpDocTagRemover;
|
|
}
|
|
public function getRuleDefinition() : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
|
|
{
|
|
return new \Symplify\RuleDocGenerator\ValueObject\RuleDefinition('Remove unused parameter, if not required by interface or parent class', [new \Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample(<<<'CODE_SAMPLE'
|
|
class SomeClass
|
|
{
|
|
private function run($value, $value2)
|
|
{
|
|
$this->value = $value;
|
|
}
|
|
}
|
|
CODE_SAMPLE
|
|
, <<<'CODE_SAMPLE'
|
|
class SomeClass
|
|
{
|
|
private function run($value)
|
|
{
|
|
$this->value = $value;
|
|
}
|
|
}
|
|
CODE_SAMPLE
|
|
)]);
|
|
}
|
|
/**
|
|
* @return array<class-string<Node>>
|
|
*/
|
|
public function getNodeTypes() : array
|
|
{
|
|
return [\PhpParser\Node\Stmt\ClassMethod::class];
|
|
}
|
|
/**
|
|
* @param ClassMethod $node
|
|
*/
|
|
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
|
|
{
|
|
if ($this->shouldSkip($node)) {
|
|
return null;
|
|
}
|
|
/** @var string|null $className */
|
|
$className = $node->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::CLASS_NAME);
|
|
if ($className === null) {
|
|
return null;
|
|
}
|
|
$unusedParameters = $this->unusedParameterResolver->resolve($node);
|
|
$this->removeNodes($unusedParameters);
|
|
$this->clearPhpDocInfo($node, $unusedParameters);
|
|
return $node;
|
|
}
|
|
private function shouldSkip(\PhpParser\Node\Stmt\ClassMethod $classMethod) : bool
|
|
{
|
|
if (!$classMethod->isPrivate()) {
|
|
return \true;
|
|
}
|
|
if ($classMethod->params === []) {
|
|
return \true;
|
|
}
|
|
return $this->variadicFunctionLikeDetector->isVariadic($classMethod);
|
|
}
|
|
/**
|
|
* @param Param[] $unusedParameters
|
|
*/
|
|
private function clearPhpDocInfo(\PhpParser\Node\Stmt\ClassMethod $classMethod, array $unusedParameters) : void
|
|
{
|
|
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod);
|
|
foreach ($unusedParameters as $unusedParameter) {
|
|
$parameterName = $this->getName($unusedParameter->var);
|
|
if ($parameterName === null) {
|
|
continue;
|
|
}
|
|
$paramTagValueNode = $phpDocInfo->getParamTagValueByName($parameterName);
|
|
if (!$paramTagValueNode instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode) {
|
|
continue;
|
|
}
|
|
if ($paramTagValueNode->parameterName !== '$' . $parameterName) {
|
|
continue;
|
|
}
|
|
$this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $paramTagValueNode);
|
|
}
|
|
}
|
|
}
|