rector/rules/Privatization/NodeManipulator/VisibilityManipulator.php

155 lines
5.8 KiB
PHP
Raw Normal View History

2019-10-13 05:59:52 +00:00
<?php
declare (strict_types=1);
namespace Rector\Privatization\NodeManipulator;
use PhpParser\Node\Param;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassConst;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Property;
2020-12-24 22:01:30 +00:00
use Rector\Core\ValueObject\Visibility;
use RectorPrefix20211118\Webmozart\Assert\Assert;
final class VisibilityManipulator
{
/**
* @param \PhpParser\Node\Param|\PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property $node
*/
public function hasVisibility($node, int $visibility) : bool
{
return (bool) ($node->flags & $visibility);
}
2019-02-09 13:22:20 +00:00
/**
* @param \PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property $node
2019-02-09 13:22:20 +00:00
*/
public function makeStatic($node) : void
2019-02-09 13:22:20 +00:00
{
$this->addVisibilityFlag($node, \Rector\Core\ValueObject\Visibility::STATIC);
2019-02-09 13:22:20 +00:00
}
/**
* @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\ClassMethod $node
*/
public function makeAbstract($node) : void
{
$this->addVisibilityFlag($node, \Rector\Core\ValueObject\Visibility::ABSTRACT);
}
/**
* @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property $node
*/
public function makeNonStatic($node) : void
{
if (!$node->isStatic()) {
2020-09-17 07:34:27 +00:00
return;
}
$node->flags -= \PhpParser\Node\Stmt\Class_::MODIFIER_STATIC;
}
2019-08-25 10:29:15 +00:00
/**
* @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod $node
2019-08-25 10:29:15 +00:00
*/
public function makeFinal($node) : void
2019-08-25 10:29:15 +00:00
{
$this->addVisibilityFlag($node, \Rector\Core\ValueObject\Visibility::FINAL);
2019-08-25 10:29:15 +00:00
}
/**
* @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\ClassMethod $node
*/
public function makeNonFinal($node) : void
{
if (!$node->isFinal()) {
return;
}
$node->flags -= \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL;
}
/**
* This way "abstract", "static", "final" are kept
* @param \PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property $node
*/
public function removeVisibility($node) : void
{
// no modifier
if ($node->flags === 0) {
return;
}
if ($node->isPublic()) {
$node->flags -= \PhpParser\Node\Stmt\Class_::MODIFIER_PUBLIC;
}
if ($node->isProtected()) {
$node->flags -= \PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED;
}
if ($node->isPrivate()) {
$node->flags -= \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE;
}
}
/**
* @param \PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property $node
*/
public function changeNodeVisibility($node, int $visibility) : void
{
\RectorPrefix20211118\Webmozart\Assert\Assert::oneOf($visibility, [\Rector\Core\ValueObject\Visibility::PUBLIC, \Rector\Core\ValueObject\Visibility::PROTECTED, \Rector\Core\ValueObject\Visibility::PRIVATE, \Rector\Core\ValueObject\Visibility::STATIC, \Rector\Core\ValueObject\Visibility::ABSTRACT, \Rector\Core\ValueObject\Visibility::FINAL]);
2020-12-24 23:18:02 +00:00
$this->replaceVisibilityFlag($node, $visibility);
}
/**
* @param \PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property $node
*/
public function makePublic($node) : void
{
$this->replaceVisibilityFlag($node, \Rector\Core\ValueObject\Visibility::PUBLIC);
}
/**
* @param \PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property $node
*/
public function makeProtected($node) : void
{
$this->replaceVisibilityFlag($node, \Rector\Core\ValueObject\Visibility::PROTECTED);
}
/**
* @param \PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property $node
*/
public function makePrivate($node) : void
{
$this->replaceVisibilityFlag($node, \Rector\Core\ValueObject\Visibility::PRIVATE);
}
/**
* @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\ClassConst $node
*/
public function removeFinal($node) : void
{
$node->flags -= \PhpParser\Node\Stmt\Class_::MODIFIER_FINAL;
}
public function removeAbstract(\PhpParser\Node\Stmt\ClassMethod $classMethod) : void
{
$classMethod->flags -= \PhpParser\Node\Stmt\Class_::MODIFIER_ABSTRACT;
}
/**
* @param \PhpParser\Node\Param|\PhpParser\Node\Stmt\Property $node
*/
public function makeReadonly($node) : void
{
$this->addVisibilityFlag($node, \PhpParser\Node\Stmt\Class_::MODIFIER_READONLY);
}
/**
* @param \PhpParser\Node\Param|\PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property $node
*/
private function addVisibilityFlag($node, int $visibility) : void
{
$node->flags |= $visibility;
}
/**
* @param \PhpParser\Node\Stmt\ClassConst|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Property $node
*/
private function replaceVisibilityFlag($node, int $visibility) : void
{
$isStatic = $node instanceof \PhpParser\Node\Stmt\ClassMethod && $node->isStatic();
if ($isStatic) {
2021-01-30 21:41:25 +00:00
$this->removeVisibility($node);
}
if ($visibility !== \Rector\Core\ValueObject\Visibility::STATIC && $visibility !== \Rector\Core\ValueObject\Visibility::ABSTRACT && $visibility !== \Rector\Core\ValueObject\Visibility::FINAL) {
2021-01-30 21:41:25 +00:00
$this->removeVisibility($node);
}
$this->addVisibilityFlag($node, $visibility);
if ($isStatic) {
$this->makeStatic($node);
}
}
}