From 3ca14304103a1dccb0d6603b52e33ef070e557f6 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 27 May 2026 15:56:53 +0700 Subject: [PATCH 1/4] Clean up isFile() check on php files finder --- src/Analyser/Analyser.php | 10 ++++------ src/Rule/Rules/File/PhpFileFinder.php | 10 ++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/Analyser/Analyser.php b/src/Analyser/Analyser.php index 45499ef8..ec4670cc 100644 --- a/src/Analyser/Analyser.php +++ b/src/Analyser/Analyser.php @@ -611,21 +611,19 @@ private function phpFiles(string $path, array $skipPaths): array new RecursiveCallbackFilterIterator( new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS), function (SplFileInfo $file) use ($skipPaths): bool { - if (! $file->isDir() && $file->getExtension() !== 'php') { + $isRealDirectory = $file->isDir() && ! $file->isLink(); + if (! $isRealDirectory && $file->getExtension() !== 'php') { return false; } return ! $this->isSkipped($file->getPathname(), $skipPaths); } - ) + ), + RecursiveIteratorIterator::LEAVES_ONLY ); /** @var SplFileInfo $file */ foreach ($iterator as $file) { - if (! $file->isFile()) { - continue; - } - $realPath = $file->getRealPath(); if ($realPath !== false) { diff --git a/src/Rule/Rules/File/PhpFileFinder.php b/src/Rule/Rules/File/PhpFileFinder.php index 73aa6396..f62c87da 100644 --- a/src/Rule/Rules/File/PhpFileFinder.php +++ b/src/Rule/Rules/File/PhpFileFinder.php @@ -53,21 +53,19 @@ public function files(string $basePath, array $skipPaths = []): array new RecursiveCallbackFilterIterator( new RecursiveDirectoryIterator($fullPath, FilesystemIterator::SKIP_DOTS), function (SplFileInfo $file) use ($normalisedBase, $skipMatchers): bool { - if (! $file->isDir() && $file->getExtension() !== 'php') { + $isRealDirectory = $file->isDir() && ! $file->isLink(); + if (! $isRealDirectory && $file->getExtension() !== 'php') { return false; } return ! $this->isSkipped($file->getPathname(), $normalisedBase, $skipMatchers); } - ) + ), + RecursiveIteratorIterator::LEAVES_ONLY ); /** @var SplFileInfo $file */ foreach ($iterator as $file) { - if (! $file->isFile()) { - continue; - } - $files[] = $file->getPathname(); } } From 3aa6cae7d2ea260db91b4ce825334353beb970f1 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 27 May 2026 16:10:45 +0700 Subject: [PATCH 2/4] reduce loop iterator multiple times --- src/Rule/Rules/File/PhpFileFinder.php | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/Rule/Rules/File/PhpFileFinder.php b/src/Rule/Rules/File/PhpFileFinder.php index f62c87da..39763e6f 100644 --- a/src/Rule/Rules/File/PhpFileFinder.php +++ b/src/Rule/Rules/File/PhpFileFinder.php @@ -4,6 +4,7 @@ namespace Boundwize\StructArmed\Rule\Rules\File; +use AppendIterator; use Boundwize\StructArmed\Composer\Psr4PathResolver; use FilesystemIterator; use RecursiveCallbackFilterIterator; @@ -11,6 +12,7 @@ use RecursiveIteratorIterator; use SplFileInfo; +use function array_unique; use function fnmatch; use function is_dir; use function ltrim; @@ -38,18 +40,19 @@ public function __construct( */ public function files(string $basePath, array $skipPaths = []): array { - $files = []; $normalisedBase = $this->normalisePath($basePath, true); $skipMatchers = $this->compileSkipMatchers($normalisedBase, $skipPaths); + $append = new AppendIterator(); - foreach ($this->sourcePaths ?? $this->psr4PathResolver->paths($basePath) as $sourcePath) { + $sourcePaths = array_unique($this->sourcePaths ?? $this->psr4PathResolver->paths($basePath)); + foreach ($sourcePaths as $sourcePath) { $fullPath = rtrim($basePath, '/') . '/' . ltrim($sourcePath, '/'); if (! is_dir($fullPath)) { continue; } - $iterator = new RecursiveIteratorIterator( + $append->append(new RecursiveIteratorIterator( new RecursiveCallbackFilterIterator( new RecursiveDirectoryIterator($fullPath, FilesystemIterator::SKIP_DOTS), function (SplFileInfo $file) use ($normalisedBase, $skipMatchers): bool { @@ -62,15 +65,19 @@ function (SplFileInfo $file) use ($normalisedBase, $skipMatchers): bool { } ), RecursiveIteratorIterator::LEAVES_ONLY - ); + )); + } - /** @var SplFileInfo $file */ - foreach ($iterator as $file) { - $files[] = $file->getPathname(); - } + $files = []; + + /** @var SplFileInfo $file */ + foreach ($append as $file) { + $files[] = $file->getPathname(); } - return $files; + // ensure nothing duplicated once more + // avoid inner directory provided by multiple source paths + return array_values(array_unique($files)); } /** From 0c7e4e1d9ed26205362d1a923106606c9b363318 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 27 May 2026 16:18:33 +0700 Subject: [PATCH 3/4] make consistent to use getPathname() --- src/Analyser/Analyser.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Analyser/Analyser.php b/src/Analyser/Analyser.php index ec4670cc..7a861dcb 100644 --- a/src/Analyser/Analyser.php +++ b/src/Analyser/Analyser.php @@ -624,11 +624,7 @@ function (SplFileInfo $file) use ($skipPaths): bool { /** @var SplFileInfo $file */ foreach ($iterator as $file) { - $realPath = $file->getRealPath(); - - if ($realPath !== false) { - $files[] = $realPath; - } + $files[] = $file->getPathname(); } return $files; From a6a16f11547d9fdbfcfc879f89fea7f3ed2e415e Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 27 May 2026 16:20:10 +0700 Subject: [PATCH 4/4] cs fix --- src/Rule/Rules/File/PhpFileFinder.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Rule/Rules/File/PhpFileFinder.php b/src/Rule/Rules/File/PhpFileFinder.php index 39763e6f..e5f2410c 100644 --- a/src/Rule/Rules/File/PhpFileFinder.php +++ b/src/Rule/Rules/File/PhpFileFinder.php @@ -13,6 +13,7 @@ use SplFileInfo; use function array_unique; +use function array_values; use function fnmatch; use function is_dir; use function ltrim;