aboutsummaryrefslogtreecommitdiffhomepage
path: root/scripts/linters/src/Support/FileFinder.php
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-07-21 08:08:15 +0900
committernsfisis <nsfisis@gmail.com>2026-07-21 08:08:45 +0900
commitc899a4675ca90507a420d901ef7fa26d8b285f23 (patch)
tree405b8049c3ac59c65d56792c96f4a8c316bf605b /scripts/linters/src/Support/FileFinder.php
parent6b16a2cd672edcbfeaf7988591db92ed4c594ddc (diff)
downloadphp-shirabe-c899a4675ca90507a420d901ef7fa26d8b285f23.tar.gz
php-shirabe-c899a4675ca90507a420d901ef7fa26d8b285f23.tar.zst
php-shirabe-c899a4675ca90507a420d901ef7fa26d8b285f23.zip
refactor(lint): rewrite structural linters from Ruby to PHP
Fold scripts/lint and scripts/linters/*.rb into a standalone Composer project under scripts/linters/, matching the scripts/plugin-class-classifier/ convention. Uses no external packages, only PHP + Composer autoloading. Verified byte-for-byte identical output against the original Ruby implementation, both on the current repo (all linters pass) and on a synthetic fixture exercising every violation type. Entry point moves from `scripts/lint` to `scripts/linters/lint`.
Diffstat (limited to 'scripts/linters/src/Support/FileFinder.php')
-rw-r--r--scripts/linters/src/Support/FileFinder.php68
1 files changed, 68 insertions, 0 deletions
diff --git a/scripts/linters/src/Support/FileFinder.php b/scripts/linters/src/Support/FileFinder.php
new file mode 100644
index 00000000..50dabcd8
--- /dev/null
+++ b/scripts/linters/src/Support/FileFinder.php
@@ -0,0 +1,68 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Shirabe\Lint\Support;
+
+final class FileFinder
+{
+ // Returns absolute paths to each crate's Cargo.toml (crates/*/Cargo.toml), sorted.
+ public static function cargoTomls(string $rootDir): array
+ {
+ $paths = glob("{$rootDir}/crates/*/Cargo.toml") ?: [];
+ sort($paths);
+
+ return $paths;
+ }
+
+ /** @return list<string> absolute paths to *.rs files under crates/, sorted */
+ public static function rustFiles(string $rootDir): array
+ {
+ return self::walk("{$rootDir}/crates", static fn (string $path): bool => str_ends_with($path, '.rs'));
+ }
+
+ // Returns absolute paths to mod.rs files under each crate's src/ tree
+ // (crates/*/src/**/mod.rs), sorted.
+ public static function modRsFiles(string $rootDir): array
+ {
+ $found = [];
+
+ foreach (glob("{$rootDir}/crates/*", GLOB_ONLYDIR) ?: [] as $crateDir) {
+ $srcDir = "{$crateDir}/src";
+ if (!is_dir($srcDir)) {
+ continue;
+ }
+
+ foreach (self::walk($srcDir, static fn (string $path): bool => basename($path) === 'mod.rs') as $path) {
+ $found[] = $path;
+ }
+ }
+
+ sort($found);
+
+ return $found;
+ }
+
+ /** @return list<string> */
+ private static function walk(string $baseDir, callable $predicate): array
+ {
+ if (!is_dir($baseDir)) {
+ return [];
+ }
+
+ $found = [];
+ $iterator = new \RecursiveIteratorIterator(
+ new \RecursiveDirectoryIterator($baseDir, \FilesystemIterator::SKIP_DOTS),
+ );
+ foreach ($iterator as $file) {
+ /** @var \SplFileInfo $file */
+ if ($file->isFile() && $predicate($file->getPathname())) {
+ $found[] = $file->getPathname();
+ }
+ }
+
+ sort($found);
+
+ return $found;
+ }
+}