rector/src/NodeModifier/VisibilityModifier.php

78 lines
2.0 KiB
PHP
Raw Normal View History

<?php declare(strict_types=1);
namespace Rector\NodeModifier;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassConst;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Property;
use Rector\Exception\InvalidNodeTypeException;
2018-09-21 05:12:24 +00:00
use function Safe\sprintf;
final class VisibilityModifier
{
/**
* @var string[]
*/
private $allowedNodeTypes = [ClassMethod::class, Property::class, ClassConst::class];
/**
* This way "abstract", "static", "final" are kept
*
* @param ClassMethod|Property|ClassConst $node
*/
public function removeOriginalVisibilityFromFlags(Node $node): void
{
$this->ensureIsClassMethodOrProperty($node, __METHOD__);
if ($node->isPublic()) {
$node->flags -= Class_::MODIFIER_PUBLIC;
}
if ($node->isProtected()) {
$node->flags -= Class_::MODIFIER_PROTECTED;
}
if ($node->isPrivate()) {
$node->flags -= Class_::MODIFIER_PRIVATE;
}
}
/**
* @param ClassMethod|Property|ClassConst $node
*/
public function addVisibilityFlag(Node $node, string $visibility): void
{
$this->ensureIsClassMethodOrProperty($node, __METHOD__);
if ($visibility === 'public') {
$node->flags |= Class_::MODIFIER_PUBLIC;
}
if ($visibility === 'protected') {
$node->flags |= Class_::MODIFIER_PROTECTED;
}
if ($visibility === 'private') {
$node->flags |= Class_::MODIFIER_PRIVATE;
}
}
private function ensureIsClassMethodOrProperty(Node $node, string $location): void
{
foreach ($this->allowedNodeTypes as $allowedNodeType) {
if (is_a($node, $allowedNodeType, true)) {
return;
}
}
throw new InvalidNodeTypeException(sprintf(
'"%s" only accepts "%s" types. "%s" given.',
$location,
implode('", "', $this->allowedNodeTypes),
get_class($node)
));
}
}