simpleCallableNodeTraverser = $simpleCallableNodeTraverser; $this->nodeNameResolver = $nodeNameResolver; } /** * @return string[] */ public function collectModifiedVariableNames(\PhpParser\Node\Stmt $stmt) : array { $argNames = $this->collectFromArgs($stmt); $assignNames = $this->collectFromAssigns($stmt); return \array_merge($argNames, $assignNames); } /** * @return string[] */ private function collectFromArgs(\PhpParser\Node\Stmt $stmt) : array { $variableNames = []; $this->simpleCallableNodeTraverser->traverseNodesWithCallable($stmt, function (\PhpParser\Node $node) use(&$variableNames) { if (!$node instanceof \PhpParser\Node\Arg) { return null; } if (!$this->isVariableChangedInReference($node)) { return null; } $variableName = $this->nodeNameResolver->getName($node->value); if ($variableName === null) { return null; } $variableNames[] = $variableName; }); return $variableNames; } /** * @return string[] */ private function collectFromAssigns(\PhpParser\Node\Stmt $stmt) : array { $modifiedVariableNames = []; $this->simpleCallableNodeTraverser->traverseNodesWithCallable($stmt, function (\PhpParser\Node $node) use(&$modifiedVariableNames) { if (!$node instanceof \PhpParser\Node\Expr\Assign) { return null; } if (!$node->var instanceof \PhpParser\Node\Expr\Variable) { return null; } $variableName = $this->nodeNameResolver->getName($node->var); if ($variableName === null) { return null; } $modifiedVariableNames[] = $variableName; }); return $modifiedVariableNames; } private function isVariableChangedInReference(\PhpParser\Node\Arg $arg) : bool { $parentNode = $arg->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::PARENT_NODE); if (!$parentNode instanceof \PhpParser\Node\Expr\FuncCall) { return \false; } return $this->nodeNameResolver->isNames($parentNode, ['array_shift', 'array_pop']); } }