diff --git a/config/extension.neon b/config/extension.neon index a5604d8..c5ade24 100644 --- a/config/extension.neon +++ b/config/extension.neon @@ -114,10 +114,6 @@ parameters: maximum: 15 services: - - - class: PhpParser\NodeVisitor\NodeConnectingVisitor - tags: - - phpstan.parser.richParserNodeVisitor - class: Orrison\MeliorStan\Rules\CamelCaseVariableName\VariableDefinitionVisitor tags: diff --git a/src/Rules/CamelCaseVariableName/VariableDefinitionVisitor.php b/src/Rules/CamelCaseVariableName/VariableDefinitionVisitor.php index 9afe067..ba3eb0e 100644 --- a/src/Rules/CamelCaseVariableName/VariableDefinitionVisitor.php +++ b/src/Rules/CamelCaseVariableName/VariableDefinitionVisitor.php @@ -3,6 +3,7 @@ namespace Orrison\MeliorStan\Rules\CamelCaseVariableName; use PhpParser\Node; +use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\List_; use PhpParser\Node\Expr\Variable; @@ -19,56 +20,46 @@ final class VariableDefinitionVisitor extends NodeVisitorAbstract public function enterNode(Node $node): ?Node { - if (! $node instanceof Variable) { - return null; + if ($node instanceof Assign) { + $this->markDefinitionTargets($node->var); } - if ($this->isVariableDefinition($node)) { - $node->setAttribute(self::ATTRIBUTE_NAME, true); + if ($node instanceof Foreach_) { + $this->markDefinitionTargets($node->keyVar); + $this->markDefinitionTargets($node->valueVar); + } + + if ($node instanceof For_) { + foreach ($node->init as $initExpr) { + if ($initExpr instanceof Assign) { + $this->markDefinitionTargets($initExpr->var); + } + } } return null; } - private function isVariableDefinition(Variable $node): bool + private function markDefinitionTargets(?Node $target): void { - $parent = $node->getAttribute('parent'); - - // Early return if parent attribute is not set (e.g., if NodeConnectingVisitor is misconfigured) - if ($parent === null) { - return false; + if ($target === null) { + return; } - // Check for assignment: $var = ... - if ($parent instanceof Assign && $parent->var === $node) { - return true; - } + if ($target instanceof Variable) { + $target->setAttribute(self::ATTRIBUTE_NAME, true); - // Check for foreach: foreach ($array as $var) or foreach ($array as $key => $var) - if ($parent instanceof Foreach_) { - if ($parent->valueVar === $node || $parent->keyVar === $node) { - return true; - } + return; } - // Check for for loop: for ($i = 0; ...) - if ($parent instanceof For_) { - foreach ($parent->init as $initExpr) { - if ($initExpr instanceof Assign && $initExpr->var === $node) { - return true; + if ($target instanceof List_) { + foreach ($target->items as $item) { + if (! $item instanceof ArrayItem) { + continue; } - } - } - // Check for list destructuring: list($var) = ... - if ($parent instanceof List_) { - foreach ($parent->items as $item) { - if ($item && $item->value === $node) { - return true; - } + $this->markDefinitionTargets($item->value); } } - - return false; } }