nodeNameResolver = $nodeNameResolver; } /** * @param array $desiredStmtOrder * @param array $currentStmtOrder * @return array */ public function createOldToNewKeys(array $desiredStmtOrder, array $currentStmtOrder): array { $newKeys = []; foreach ($desiredStmtOrder as $singleDesiredStmtOrder) { foreach ($currentStmtOrder as $currentKey => $classMethodName) { if ($classMethodName === $singleDesiredStmtOrder) { $newKeys[] = $currentKey; } } } $oldKeys = array_values($newKeys); sort($oldKeys); /** @var array $oldToNewKeys */ $oldToNewKeys = array_combine($oldKeys, $newKeys); return $oldToNewKeys; } /** * @param array $oldToNewKeys */ public function reorderClassStmtsByOldToNewKeys(ClassLike $classLike, array $oldToNewKeys): void { $reorderedStmts = []; $stmtCount = count($classLike->stmts); foreach ($classLike->stmts as $key => $stmt) { if (! array_key_exists($key, $oldToNewKeys)) { $reorderedStmts[$key] = $stmt; continue; } // reorder here $newKey = $oldToNewKeys[$key]; $reorderedStmts[$key] = $classLike->stmts[$newKey]; } for ($i = 0; $i < $stmtCount; ++$i) { if (! array_key_exists($i, $reorderedStmts)) { continue; } $classLike->stmts[$i] = $reorderedStmts[$i]; } } /** * @param class-string $type * @return array */ public function getStmtsOfTypeOrder(ClassLike $classLike, string $type): array { $stmtsByPosition = []; foreach ($classLike->stmts as $position => $classStmt) { if (! is_a($classStmt, $type)) { continue; } $name = $this->nodeNameResolver->getName($classStmt); if ($name === null) { continue; } $stmtsByPosition[$position] = $name; } return $stmtsByPosition; } }