From ff88e4b37a7b6dd156ba34e0a122597b8f53b0f8 Mon Sep 17 00:00:00 2001 From: TomasVotruba Date: Sat, 9 May 2020 21:50:52 +0200 Subject: [PATCH] fix another constant in repeated literal to class constant --- .../src/NodeFinder/ScopeAwareNodeFinder.php | 23 ++++++++- .../src/ScopeNestingComparator.php | 2 +- .../src/ValueObject/ControlStructure.php | 2 +- .../RepeatedLiteralToClassConstantRector.php | 11 +++- .../Fixture/with_non_local_constant.php.inc | 51 +++++++++++++++++++ 5 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 rules/solid/tests/Rector/Class_/RepeatedLiteralToClassConstantRector/Fixture/with_non_local_constant.php.inc diff --git a/packages/node-nesting-scope/src/NodeFinder/ScopeAwareNodeFinder.php b/packages/node-nesting-scope/src/NodeFinder/ScopeAwareNodeFinder.php index 47575afab6f..132e13f9248 100644 --- a/packages/node-nesting-scope/src/NodeFinder/ScopeAwareNodeFinder.php +++ b/packages/node-nesting-scope/src/NodeFinder/ScopeAwareNodeFinder.php @@ -25,13 +25,34 @@ final class ScopeAwareNodeFinder $this->betterNodeFinder = $betterNodeFinder; } + /** + * Find node based on $callable or null, when the nesting scope is broken + * @param class-string[] $allowedTypes + */ + public function findParentType(Node $node, array $allowedTypes): ?Node + { + $callable = function (Node $node) use ($allowedTypes) { + foreach ($allowedTypes as $allowedType) { + if (!is_a($node, $allowedType)) { + continue; + } + + return true; + } + + return false; + }; + + return $this->findParent($node, $callable, $allowedTypes); + } + /** * Find node based on $callable or null, when the nesting scope is broken * @param class-string[] $allowedTypes */ public function findParent(Node $node, callable $callable, array $allowedTypes): ?Node { - $parentNestingBreakTypes = array_diff(ControlStructure::NODE_TYPES, $allowedTypes); + $parentNestingBreakTypes = array_diff(ControlStructure::BREAKING_SCOPE_NODE_TYPES, $allowedTypes); $this->isBreakingNodeFoundFirst = false; $foundNode = $this->betterNodeFinder->findFirstPrevious($node, function (Node $node) use ( diff --git a/packages/node-nesting-scope/src/ScopeNestingComparator.php b/packages/node-nesting-scope/src/ScopeNestingComparator.php index 5f269d85a28..7307d1d3a38 100644 --- a/packages/node-nesting-scope/src/ScopeNestingComparator.php +++ b/packages/node-nesting-scope/src/ScopeNestingComparator.php @@ -31,6 +31,6 @@ final class ScopeNestingComparator private function findParentControlStructure(Node $node): ?Node { - return $this->betterNodeFinder->findFirstParentInstanceOf($node, ControlStructure::NODE_TYPES); + return $this->betterNodeFinder->findFirstParentInstanceOf($node, ControlStructure::BREAKING_SCOPE_NODE_TYPES); } } diff --git a/packages/node-nesting-scope/src/ValueObject/ControlStructure.php b/packages/node-nesting-scope/src/ValueObject/ControlStructure.php index 66c6d053d41..444899d7467 100644 --- a/packages/node-nesting-scope/src/ValueObject/ControlStructure.php +++ b/packages/node-nesting-scope/src/ValueObject/ControlStructure.php @@ -20,7 +20,7 @@ final class ControlStructure /** * @var class-string[] */ - public const NODE_TYPES = [ + public const BREAKING_SCOPE_NODE_TYPES = [ For_::class, Foreach_::class, If_::class, diff --git a/rules/solid/src/Rector/Class_/RepeatedLiteralToClassConstantRector.php b/rules/solid/src/Rector/Class_/RepeatedLiteralToClassConstantRector.php index 0460964f531..64e74ba0f66 100644 --- a/rules/solid/src/Rector/Class_/RepeatedLiteralToClassConstantRector.php +++ b/rules/solid/src/Rector/Class_/RepeatedLiteralToClassConstantRector.php @@ -11,11 +11,13 @@ use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Name; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\ClassConst; use Rector\Core\PhpParser\Node\Manipulator\ClassInsertManipulator; use Rector\Core\Rector\AbstractRector; use Rector\Core\RectorDefinition\CodeSample; use Rector\Core\RectorDefinition\RectorDefinition; use Rector\Core\Util\StaticRectorStrings; +use Rector\NodeNestingScope\NodeFinder\ScopeAwareNodeFinder; /** * @see \Rector\SOLID\Tests\Rector\Class_\RepeatedLiteralToClassConstantRector\RepeatedLiteralToClassConstantRectorTest @@ -36,10 +38,15 @@ final class RepeatedLiteralToClassConstantRector extends AbstractRector * @var ClassInsertManipulator */ private $classInsertManipulator; + /** + * @var ScopeAwareNodeFinder + */ + private $scopeAwareNodeFinder; - public function __construct(ClassInsertManipulator $classInsertManipulator) + public function __construct(ClassInsertManipulator $classInsertManipulator, ScopeAwareNodeFinder $scopeAwareNodeFinder) { $this->classInsertManipulator = $classInsertManipulator; + $this->scopeAwareNodeFinder = $scopeAwareNodeFinder; } public function getDefinition(): RectorDefinition @@ -188,7 +195,7 @@ PHP } // skip values in another constants - $parentConst = $this->betterNodeFinder->findFirstPreviousOfTypes($string, [Const_::class]); + $parentConst = $this->scopeAwareNodeFinder->findParentType($string, [ClassConst::class]); if ($parentConst) { return true; } diff --git a/rules/solid/tests/Rector/Class_/RepeatedLiteralToClassConstantRector/Fixture/with_non_local_constant.php.inc b/rules/solid/tests/Rector/Class_/RepeatedLiteralToClassConstantRector/Fixture/with_non_local_constant.php.inc new file mode 100644 index 00000000000..413f0578346 --- /dev/null +++ b/rules/solid/tests/Rector/Class_/RepeatedLiteralToClassConstantRector/Fixture/with_non_local_constant.php.inc @@ -0,0 +1,51 @@ + +----- +