> */ public function getNodeTypes() : array { return [FuncCall::class]; } /** * @param FuncCall $node */ public function refactor(Node $node) : ?FuncCall { $isJustSwapped = (bool) $node->getAttribute(self::JUST_SWAPPED, \false); if ($isJustSwapped) { return null; } foreach ($this->functionArgumentSwaps as $functionArgumentSwap) { if (!$this->isName($node, $functionArgumentSwap->getFunction())) { continue; } $newArguments = $this->resolveNewArguments($functionArgumentSwap, $node); if ($newArguments === []) { return null; } foreach ($newArguments as $newPosition => $argument) { $node->args[$newPosition] = $argument; } $node->setAttribute(self::JUST_SWAPPED, \true); return $node; } return null; } /** * @param mixed[] $configuration */ public function configure(array $configuration) : void { Assert::allIsAOf($configuration, SwapFuncCallArguments::class); $this->functionArgumentSwaps = $configuration; } /** * @return array */ private function resolveNewArguments(SwapFuncCallArguments $swapFuncCallArguments, FuncCall $funcCall) : array { $newArguments = []; foreach ($swapFuncCallArguments->getOrder() as $oldPosition => $newPosition) { if (!isset($funcCall->args[$oldPosition])) { continue; } if (!isset($funcCall->args[$newPosition])) { continue; } if (!$funcCall->args[$oldPosition] instanceof Arg) { continue; } $newArguments[$newPosition] = $funcCall->args[$oldPosition]; } return $newArguments; } }