findStdMapUsages($path, $relative)); } return $errors; } /** @return list */ private function findStdMapUsages(string $path, string $relative): array { $errors = []; foreach (file($path) as $idx => $raw) { $code = explode('//', $raw, 2)[0]; if (preg_match_all('/\bstd::collections::(HashMap|HashSet|BTreeMap|BTreeSet)\b/', $code, $m)) { foreach ($m[1] as $name) { $errors[] = "{$relative}:" . ($idx + 1) . ": use of `std::collections::{$name}` (use `indexmap::" . self::indexmapReplacement($name) . '` instead)'; } } if (preg_match_all('/\bstd::collections::\{([^}]*)\}/', $code, $m)) { foreach ($m[1] as $group) { foreach (explode(',', $group) as $entry) { $name = preg_split('/\s+as\s+/', trim($entry))[0]; if (!in_array($name, self::BANNED_MAP_NAMES, true)) { continue; } $errors[] = "{$relative}:" . ($idx + 1) . ": import of `std::collections::{$name}` (use `indexmap::" . self::indexmapReplacement($name) . '` instead)'; } } } } return array_values(array_unique($errors)); } private static function indexmapReplacement(string $name): string { return match ($name) { 'HashMap', 'BTreeMap' => 'IndexMap', 'HashSet', 'BTreeSet' => 'IndexSet', default => throw new \LogicException("unexpected map name: {$name}"), }; } }