From 6d0bf0b44b8951c653415b213cf1e6e5906c0326 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sun, 25 Aug 2019 12:29:15 +0200 Subject: [PATCH] add makeFinal() method --- .../FinalizeClassesWithoutChildrenRector.php | 2 +- .../Node/Manipulator/VisibilityManipulator.php | 14 +++++++++++++- src/Rector/AbstractRector/VisibilityTrait.php | 5 +++++ utils/Composer/bin/SortNamespaces.php | 11 +++++------ 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/packages/SOLID/src/Rector/Class_/FinalizeClassesWithoutChildrenRector.php b/packages/SOLID/src/Rector/Class_/FinalizeClassesWithoutChildrenRector.php index 549bd68c03c6..acdbc24f44d6 100644 --- a/packages/SOLID/src/Rector/Class_/FinalizeClassesWithoutChildrenRector.php +++ b/packages/SOLID/src/Rector/Class_/FinalizeClassesWithoutChildrenRector.php @@ -84,7 +84,7 @@ public function refactor(Node $node): ?Node return null; } - $node->flags |= Class_::MODIFIER_FINAL; + $this->makeFinal($node); return $node; } diff --git a/src/PhpParser/Node/Manipulator/VisibilityManipulator.php b/src/PhpParser/Node/Manipulator/VisibilityManipulator.php index 03b291fa1340..e853870d204d 100644 --- a/src/PhpParser/Node/Manipulator/VisibilityManipulator.php +++ b/src/PhpParser/Node/Manipulator/VisibilityManipulator.php @@ -32,6 +32,14 @@ public function makeAbstract(Node $node): void $this->addVisibilityFlag($node, 'abstract'); } + /** + * @param Class_|ClassMethod $node + */ + public function makeFinal(Node $node): void + { + $this->addVisibilityFlag($node, 'final'); + } + /** * @param ClassMethod|Property|ClassConst $node */ @@ -39,7 +47,7 @@ public function replaceVisibilityFlag(Node $node, string $visibility): void { $visibility = strtolower($visibility); - if ($visibility !== 'static' && $visibility !== 'abstract') { + if ($visibility !== 'static' && $visibility !== 'abstract' && $visibility !== 'final') { $this->removeOriginalVisibilityFromFlags($node); } @@ -99,6 +107,10 @@ private function addVisibilityFlag(Node $node, string $visibility): void if ($visibility === 'abstract') { $node->flags |= Class_::MODIFIER_ABSTRACT; } + + if ($visibility === 'final') { + $node->flags |= Class_::MODIFIER_FINAL; + } } private function ensureIsClassMethodOrProperty(Node $node, string $location): void diff --git a/src/Rector/AbstractRector/VisibilityTrait.php b/src/Rector/AbstractRector/VisibilityTrait.php index cf1a2100d6fc..f9409a2a5645 100644 --- a/src/Rector/AbstractRector/VisibilityTrait.php +++ b/src/Rector/AbstractRector/VisibilityTrait.php @@ -91,4 +91,9 @@ public function makeStatic(Node $node): void { $this->visibilityManipulator->makeStatic($node); } + + public function makeFinal(Class_ $class): void + { + $this->visibilityManipulator->makeFinal($class); + } } diff --git a/utils/Composer/bin/SortNamespaces.php b/utils/Composer/bin/SortNamespaces.php index 876ee6766b7c..629f2cf75354 100644 --- a/utils/Composer/bin/SortNamespaces.php +++ b/utils/Composer/bin/SortNamespaces.php @@ -20,10 +20,7 @@ ksort($jsonContent['autoload-dev']['psr-4']); // 3. make core first -$jsonContent['autoload']['psr-4'] = array_merge( - ['Rector\\' => 'src'], - $jsonContent['autoload']['psr-4'] -); +$jsonContent['autoload']['psr-4'] = array_merge(['Rector\\' => 'src'], $jsonContent['autoload']['psr-4']); $jsonContent['autoload-dev']['psr-4'] = array_merge( ['Rector\\Tests\\' => 'tests'], $jsonContent['autoload-dev']['psr-4'] @@ -39,7 +36,8 @@ // used from: https://github.com/Symplify/Symplify/blob/64e1e07c87b1ec5551df07482d68c5085e76824a/packages/MonorepoBuilder/src/FileSystem/JsonFileManager.php#L70 -function inlineSections(string $jsonContent, array $inlineSections): string { +function inlineSections(string $jsonContent, array $inlineSections): string +{ foreach ($inlineSections as $inlineSection) { $pattern = '#("' . preg_quote($inlineSection, '#') . '": )\[(.*?)\](,)#ms'; $jsonContent = Strings::replace($jsonContent, $pattern, function (array $match): string { @@ -54,7 +52,8 @@ function inlineSections(string $jsonContent, array $inlineSections): string { return $jsonContent; } -function inlineAuthorSection(string $jsonContent): string { +function inlineAuthorSection(string $jsonContent): string +{ $authorsPattern = '#("authors":\s+\[)(?.*?)(\])#s'; $match = Strings::match($jsonContent, $authorsPattern);