Skip to content

Commit 4eb2d24

Browse files
committed
[Privatization] Remove final flag on Privatize*Rector
1 parent 67fb3a0 commit 4eb2d24

7 files changed

Lines changed: 131 additions & 2 deletions

File tree

‎rules-tests/Privatization/NodeManipulator/VisibilityManipulatorTest.php‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use PhpParser\Node\Stmt\ClassMethod;
88
use Rector\Privatization\NodeManipulator\VisibilityManipulator;
99
use Rector\Testing\PHPUnit\AbstractLazyTestCase;
10+
use Rector\ValueObject\MethodName;
1011
use Rector\ValueObject\Visibility;
1112

1213
final class VisibilityManipulatorTest extends AbstractLazyTestCase
@@ -21,4 +22,26 @@ public function test(): void
2122
$visibilityManipulator->changeNodeVisibility($classMethod, Visibility::PROTECTED);
2223
$this->assertSame(Visibility::PROTECTED | Visibility::STATIC, $classMethod->flags);
2324
}
25+
26+
public function testMakePrivateRemovesFinal(): void
27+
{
28+
$visibilityManipulator = $this->make(VisibilityManipulator::class);
29+
30+
$classMethod = new ClassMethod('run');
31+
$classMethod->flags = Visibility::PROTECTED | Visibility::FINAL;
32+
33+
$visibilityManipulator->makePrivate($classMethod);
34+
$this->assertSame(Visibility::PRIVATE, $classMethod->flags);
35+
}
36+
37+
public function testMakePrivateKeepsFinalOnConstructor(): void
38+
{
39+
$visibilityManipulator = $this->make(VisibilityManipulator::class);
40+
41+
$classMethod = new ClassMethod(MethodName::CONSTRUCT);
42+
$classMethod->flags = Visibility::PROTECTED | Visibility::FINAL;
43+
44+
$visibilityManipulator->makePrivate($classMethod);
45+
$this->assertSame(Visibility::PRIVATE | Visibility::FINAL, $classMethod->flags);
46+
}
2447
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace Rector\Tests\Privatization\Rector\ClassConst\PrivatizeFinalClassConstantRector\Fixture;
4+
5+
final class RemoveFinalModifier
6+
{
7+
final protected const VALUE = 'value';
8+
}
9+
10+
?>
11+
-----
12+
<?php
13+
14+
namespace Rector\Tests\Privatization\Rector\ClassConst\PrivatizeFinalClassConstantRector\Fixture;
15+
16+
final class RemoveFinalModifier
17+
{
18+
private const VALUE = 'value';
19+
}
20+
21+
?>
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace Rector\Tests\Privatization\Rector\ClassMethod\PrivatizeFinalClassMethodRector\Fixture;
4+
5+
final class RemoveFinalModifier
6+
{
7+
final protected function run()
8+
{
9+
}
10+
}
11+
12+
?>
13+
-----
14+
<?php
15+
16+
namespace Rector\Tests\Privatization\Rector\ClassMethod\PrivatizeFinalClassMethodRector\Fixture;
17+
18+
final class RemoveFinalModifier
19+
{
20+
private function run()
21+
{
22+
}
23+
}
24+
25+
?>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace Rector\Tests\Privatization\Rector\Property\PrivatizeFinalClassPropertyRector\Fixture;
4+
5+
final class RemoveFinalModifier
6+
{
7+
protected final $x = true;
8+
}
9+
10+
?>
11+
-----
12+
<?php
13+
14+
namespace Rector\Tests\Privatization\Rector\Property\PrivatizeFinalClassPropertyRector\Fixture;
15+
16+
final class RemoveFinalModifier
17+
{
18+
private $x = true;
19+
}
20+
21+
?>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace Rector\Tests\Privatization\Rector\Property\PrivatizeFinalClassPropertyRector\Fixture;
4+
5+
final class RemoveFinalModifierPromotedProperty
6+
{
7+
public function __construct(protected final $value)
8+
{
9+
}
10+
}
11+
12+
?>
13+
-----
14+
<?php
15+
16+
namespace Rector\Tests\Privatization\Rector\Property\PrivatizeFinalClassPropertyRector\Fixture;
17+
18+
final class RemoveFinalModifierPromotedProperty
19+
{
20+
public function __construct(private $value)
21+
{
22+
}
23+
}
24+
25+
?>

‎rules/CodingStyle/Rector/Use_/SeparateMultiUseImportsRector.php‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ private function refactorTraitUse(TraitUse $traitUse): ?array
127127
}
128128

129129
$traitNames = array_map(
130-
static fn (Name $trait): string => $trait->toString(),
130+
static fn (Name $name): string => $name->toString(),
131131
$traitUse->traits
132132
);
133133

‎rules/Privatization/NodeManipulator/VisibilityManipulator.php‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,21 @@
1010
use PhpParser\Node\Stmt\ClassConst;
1111
use PhpParser\Node\Stmt\ClassMethod;
1212
use PhpParser\Node\Stmt\Property;
13+
use Rector\NodeNameResolver\NodeNameResolver;
14+
use Rector\ValueObject\MethodName;
1315
use Rector\ValueObject\Visibility;
1416
use Webmozart\Assert\Assert;
1517

1618
/**
1719
* @see \Rector\Tests\Privatization\NodeManipulator\VisibilityManipulatorTest
1820
*/
19-
final class VisibilityManipulator
21+
final readonly class VisibilityManipulator
2022
{
23+
public function __construct(
24+
private NodeNameResolver $nodeNameResolver
25+
) {
26+
}
27+
2128
public function hasVisibility(Class_|ClassMethod|Property|ClassConst|Param $node, int $visibility): bool
2229
{
2330
return (bool) ($node->flags & $visibility);
@@ -105,6 +112,13 @@ public function makeProtected(ClassMethod|Property|ClassConst $node): void
105112
public function makePrivate(ClassMethod|Property|ClassConst|Param $node): void
106113
{
107114
$this->replaceVisibilityFlag($node, Visibility::PRIVATE);
115+
116+
// only constructor can be both private and final
117+
if ($node instanceof ClassMethod && $this->nodeNameResolver->isName($node, MethodName::CONSTRUCT)) {
118+
return;
119+
}
120+
121+
$node->flags &= ~Modifiers::FINAL;
108122
}
109123

110124
/**

0 commit comments

Comments
 (0)