2022-01-26 18:39:23 +00:00
< ? php
declare ( strict_types = 1 );
2022-06-06 17:12:56 +00:00
namespace Rector\CodingStyle\Rector\ClassConst ;
2022-01-26 18:39:23 +00:00
2022-06-06 17:12:56 +00:00
use PhpParser\Node ;
use PhpParser\Node\Stmt\Class_ ;
use PhpParser\Node\Stmt\ClassConst ;
use Rector\Core\Rector\AbstractRector ;
use Rector\Core\ValueObject\PhpVersionFeature ;
use Rector\Privatization\NodeManipulator\VisibilityManipulator ;
use Rector\VersionBonding\Contract\MinPhpVersionInterface ;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample ;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition ;
2022-01-26 18:39:23 +00:00
/**
* @ changelog https :// php . watch / versions / 8.1 / final - class - const
*
* @ see \Rector\Tests\CodingStyle\Rector\ClassConst\RemoveFinalFromConstRector\RemoveFinalFromConstRectorTest
*/
2022-06-06 17:12:56 +00:00
final class RemoveFinalFromConstRector extends \Rector\Core\Rector\AbstractRector implements \Rector\VersionBonding\Contract\MinPhpVersionInterface
2022-01-26 18:39:23 +00:00
{
/**
* @ readonly
* @ var \Rector\Privatization\NodeManipulator\VisibilityManipulator
*/
private $visibilityManipulator ;
2022-06-06 17:12:56 +00:00
public function __construct ( \Rector\Privatization\NodeManipulator\VisibilityManipulator $visibilityManipulator )
2022-01-26 18:39:23 +00:00
{
$this -> visibilityManipulator = $visibilityManipulator ;
}
2022-06-06 17:12:56 +00:00
public function getRuleDefinition () : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
2022-01-26 18:39:23 +00:00
{
2022-06-06 17:12:56 +00:00
return new \Symplify\RuleDocGenerator\ValueObject\RuleDefinition ( 'Remove final from constants in classes defined as final' , [ new \Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample ( <<< 'CODE_SAMPLE'
2022-01-26 18:39:23 +00:00
final class SomeClass
{
final public const NAME = 'value' ;
}
CODE_SAMPLE
, <<< 'CODE_SAMPLE'
final class SomeClass
{
public const NAME = 'value' ;
}
CODE_SAMPLE
)]);
}
/**
* @ return array < class - string < Node >>
*/
public function getNodeTypes () : array
{
2022-06-06 17:12:56 +00:00
return [ \PhpParser\Node\Stmt\ClassConst :: class ];
2022-01-26 18:39:23 +00:00
}
/**
* @ param ClassConst $node
*/
2022-06-06 17:12:56 +00:00
public function refactor ( \PhpParser\Node $node ) : ? \PhpParser\Node
2022-01-26 18:39:23 +00:00
{
2022-06-06 17:12:56 +00:00
$parentClass = $this -> betterNodeFinder -> findParentType ( $node , \PhpParser\Node\Stmt\Class_ :: class );
if ( ! $parentClass instanceof \PhpParser\Node\Stmt\Class_ ) {
2022-01-26 18:39:23 +00:00
return null ;
}
if ( $parentClass -> isFinal () && $node -> isFinal ()) {
$this -> visibilityManipulator -> removeFinal ( $node );
return $node ;
}
return null ;
}
public function provideMinPhpVersion () : int
{
2022-06-06 17:12:56 +00:00
return \Rector\Core\ValueObject\PhpVersionFeature :: FINAL_CLASS_CONSTANTS ;
2022-01-26 18:39:23 +00:00
}
}