From 05688bd36be92acc52e2a03d80572bca7cfae165 Mon Sep 17 00:00:00 2001 From: Norbert Orzechowicz Date: Tue, 17 Nov 2020 11:45:31 +0100 Subject: [PATCH] [Downgrade PHP 7.1] Class constant visibility (#4633) --- config/set/downgrade-php71.php | 2 + docs/rector_rules_overview.md | 23 +++++++ ...DowngradeClassConstantVisibilityRector.php | 69 +++++++++++++++++++ ...gradeClassConstantVisibilityRectorTest.php | 37 ++++++++++ .../Rector/ClassConst/Fixture/fixture.php.inc | 27 ++++++++ .../Manipulator/VisibilityManipulator.php | 54 +++++++-------- src/Rector/AbstractRector/VisibilityTrait.php | 8 +++ src/ValueObject/PhpVersionFeature.php | 5 ++ 8 files changed, 198 insertions(+), 27 deletions(-) create mode 100644 rules/downgrade-php71/src/Rector/ClassConst/DowngradeClassConstantVisibilityRector.php create mode 100644 rules/downgrade-php71/tests/Rector/ClassConst/DowngradeClassConstantVisibilityRectorTest.php create mode 100644 rules/downgrade-php71/tests/Rector/ClassConst/Fixture/fixture.php.inc diff --git a/config/set/downgrade-php71.php b/config/set/downgrade-php71.php index 8b5852d1642..728203e31e2 100644 --- a/config/set/downgrade-php71.php +++ b/config/set/downgrade-php71.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use Rector\DowngradePhp71\Rector\ClassConst\DowngradeClassConstantVisibilityRector; use Rector\DowngradePhp71\Rector\FunctionLike\DowngradeNullableTypeParamDeclarationRector; use Rector\DowngradePhp71\Rector\FunctionLike\DowngradeNullableTypeReturnDeclarationRector; use Rector\DowngradePhp71\Rector\FunctionLike\DowngradeVoidTypeReturnDeclarationRector; @@ -12,4 +13,5 @@ return static function (ContainerConfigurator $containerConfigurator): void { $services->set(DowngradeNullableTypeParamDeclarationRector::class); $services->set(DowngradeNullableTypeReturnDeclarationRector::class); $services->set(DowngradeVoidTypeReturnDeclarationRector::class); + $services->set(DowngradeClassConstantVisibilityRector::class); }; diff --git a/docs/rector_rules_overview.md b/docs/rector_rules_overview.md index 9d32d26dde9..a46357f497a 100644 --- a/docs/rector_rules_overview.md +++ b/docs/rector_rules_overview.md @@ -4401,6 +4401,29 @@ Replace array spread with `array_merge` function
+## DowngradeClassConstantVisibilityRector + +Downgrade class constant visibility + +- class: `Rector\DowngradePhp71\Rector\ClassConst\DowngradeClassConstantVisibilityRector` + +```diff + + ## DowngradeFlexibleHeredocSyntaxRector Changes heredoc/nowdoc that contains closing word to safe wrapper name diff --git a/rules/downgrade-php71/src/Rector/ClassConst/DowngradeClassConstantVisibilityRector.php b/rules/downgrade-php71/src/Rector/ClassConst/DowngradeClassConstantVisibilityRector.php new file mode 100644 index 00000000000..5cf10c20a0e --- /dev/null +++ b/rules/downgrade-php71/src/Rector/ClassConst/DowngradeClassConstantVisibilityRector.php @@ -0,0 +1,69 @@ +removeVisibility($node); + + return $node; + } +} diff --git a/rules/downgrade-php71/tests/Rector/ClassConst/DowngradeClassConstantVisibilityRectorTest.php b/rules/downgrade-php71/tests/Rector/ClassConst/DowngradeClassConstantVisibilityRectorTest.php new file mode 100644 index 00000000000..e92b76be774 --- /dev/null +++ b/rules/downgrade-php71/tests/Rector/ClassConst/DowngradeClassConstantVisibilityRectorTest.php @@ -0,0 +1,37 @@ +doTestFileInfo($fileInfo); + } + + public function provideData(): Iterator + { + return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + protected function getRectorClass(): string + { + return DowngradeClassConstantVisibilityRector::class; + } + + protected function getPhpVersion(): string + { + return PhpVersionFeature::BEFORE_CONSTANT_VISIBILITY; + } +} diff --git a/rules/downgrade-php71/tests/Rector/ClassConst/Fixture/fixture.php.inc b/rules/downgrade-php71/tests/Rector/ClassConst/Fixture/fixture.php.inc new file mode 100644 index 00000000000..506ec145bb3 --- /dev/null +++ b/rules/downgrade-php71/tests/Rector/ClassConst/Fixture/fixture.php.inc @@ -0,0 +1,27 @@ + +----- + diff --git a/src/PhpParser/Node/Manipulator/VisibilityManipulator.php b/src/PhpParser/Node/Manipulator/VisibilityManipulator.php index d8515a9da24..64aafed1d49 100644 --- a/src/PhpParser/Node/Manipulator/VisibilityManipulator.php +++ b/src/PhpParser/Node/Manipulator/VisibilityManipulator.php @@ -83,6 +83,33 @@ final class VisibilityManipulator $this->addVisibilityFlag($node, $visibility); } + /** + * This way "abstract", "static", "final" are kept + * + * @param ClassMethod|Property|ClassConst $node + */ + public function removeOriginalVisibilityFromFlags(Node $node): void + { + $this->ensureIsClassMethodOrProperty($node, __METHOD__); + + // no modifier + if ($node->flags === 0) { + return; + } + + 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 Class_|ClassMethod|Property|ClassConst $node */ @@ -115,33 +142,6 @@ final class VisibilityManipulator } } - /** - * This way "abstract", "static", "final" are kept - * - * @param ClassMethod|Property|ClassConst $node - */ - private function removeOriginalVisibilityFromFlags(Node $node): void - { - $this->ensureIsClassMethodOrProperty($node, __METHOD__); - - // no modifier - if ($node->flags === 0) { - return; - } - - if ($node->isPublic()) { - $node->flags -= Class_::MODIFIER_PUBLIC; - } - - if ($node->isProtected()) { - $node->flags -= Class_::MODIFIER_PROTECTED; - } - - if ($node->isPrivate()) { - $node->flags -= Class_::MODIFIER_PRIVATE; - } - } - private function ensureIsClassMethodOrProperty(Node $node, string $location): void { foreach (self::ALLOWED_NODE_TYPES as $allowedNodeType) { diff --git a/src/Rector/AbstractRector/VisibilityTrait.php b/src/Rector/AbstractRector/VisibilityTrait.php index 4755d857350..62da45ae6f0 100644 --- a/src/Rector/AbstractRector/VisibilityTrait.php +++ b/src/Rector/AbstractRector/VisibilityTrait.php @@ -54,6 +54,14 @@ trait VisibilityTrait } } + /** + * @param ClassMethod|Property|ClassConst $node + */ + public function removeVisibility(Node $node): void + { + $this->visibilityManipulator->removeOriginalVisibilityFromFlags($node); + } + /** * @param ClassMethod|Class_ $node */ diff --git a/src/ValueObject/PhpVersionFeature.php b/src/ValueObject/PhpVersionFeature.php index 27f0d0796f3..468368141cb 100644 --- a/src/ValueObject/PhpVersionFeature.php +++ b/src/ValueObject/PhpVersionFeature.php @@ -71,6 +71,11 @@ final class PhpVersionFeature */ public const VOID_TYPE = '7.1'; + /** + * @var string + */ + public const BEFORE_CONSTANT_VISIBILITY = '7.0'; + /** * @var string */