From d589b1f1a8237d78713d8985f92b1aab15911d79 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 1 Oct 2026 14:31:36 +0200 Subject: [PATCH] Replace nette/robot-loader with entropy ClassNameResolver --- composer.json | 3 +- src/RobotLoader/PhpClassLoader.php | 18 ++++++---- src/Testing/Finder/TestCaseClassFinder.php | 19 ++++++---- tests/RobotLoader/Fixture/SingleClass.php | 9 +++++ tests/RobotLoader/Fixture/two_classes.php | 13 +++++++ tests/RobotLoader/PhpClassLoaderTest.php | 41 ++++++++++++++++++++++ 6 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 tests/RobotLoader/Fixture/SingleClass.php create mode 100644 tests/RobotLoader/Fixture/two_classes.php create mode 100644 tests/RobotLoader/PhpClassLoaderTest.php diff --git a/composer.json b/composer.json index 984d935fb7..34ff3e33a4 100644 --- a/composer.json +++ b/composer.json @@ -8,8 +8,7 @@ "require": { "php": ">=8.4", "ext-tokenizer": "*", - "entropy/entropy": "^0.4.20", - "nette/robot-loader": "^4.1", + "entropy/entropy": "^0.4.23", "nikic/php-parser": "^5.9", "sebastian/lines-of-code": "^4.0", "webmozart/assert": "^2.4" diff --git a/src/RobotLoader/PhpClassLoader.php b/src/RobotLoader/PhpClassLoader.php index 13d965391f..1875eb5510 100644 --- a/src/RobotLoader/PhpClassLoader.php +++ b/src/RobotLoader/PhpClassLoader.php @@ -4,7 +4,8 @@ namespace Rector\SwissKnife\RobotLoader; -use Nette\Loaders\RobotLoader; +use Entropy\Reflection\ClassNameResolver; +use Rector\SwissKnife\Finder\PhpFilesFinder; final class PhpClassLoader { @@ -15,13 +16,16 @@ final class PhpClassLoader */ public function load(array $directories, array $excludedPaths): array { - $robotLoader = new RobotLoader(); - $robotLoader->addDirectory(...$directories); - $robotLoader->excludeDirectory(...$excludedPaths); + $classesToFilePaths = []; - $robotLoader->setTempDirectory(sys_get_temp_dir() . '/multiple-classes'); - $robotLoader->rebuild(); + foreach (PhpFilesFinder::find($directories, $excludedPaths) as $fileInfo) { + $filePath = (string) $fileInfo->getRealPath(); - return $robotLoader->getIndexedClasses(); + foreach (ClassNameResolver::resolveNamesFromFilePath($filePath) as $className) { + $classesToFilePaths[$className] = $filePath; + } + } + + return $classesToFilePaths; } } diff --git a/src/Testing/Finder/TestCaseClassFinder.php b/src/Testing/Finder/TestCaseClassFinder.php index 4b00f8a24b..fff3ae58af 100644 --- a/src/Testing/Finder/TestCaseClassFinder.php +++ b/src/Testing/Finder/TestCaseClassFinder.php @@ -4,7 +4,8 @@ namespace Rector\SwissKnife\Testing\Finder; -use Nette\Loaders\RobotLoader; +use Entropy\Reflection\ClassNameResolver; +use Rector\SwissKnife\Finder\PhpFilesFinder; final class TestCaseClassFinder { @@ -14,13 +15,19 @@ final class TestCaseClassFinder */ public function findInDirectories(array $directories): array { - $robotLoader = new RobotLoader(); - $robotLoader->addDirectory(...$directories); - $robotLoader->rebuild(); + $classesToFilePaths = []; - $this->includeNonAutoloadedClasses($robotLoader->getIndexedClasses()); + foreach (PhpFilesFinder::find($directories) as $fileInfo) { + $filePath = (string) $fileInfo->getRealPath(); - return $robotLoader->getIndexedClasses(); + foreach (ClassNameResolver::resolveNamesFromFilePath($filePath) as $className) { + $classesToFilePaths[$className] = $filePath; + } + } + + $this->includeNonAutoloadedClasses($classesToFilePaths); + + return $classesToFilePaths; } /** diff --git a/tests/RobotLoader/Fixture/SingleClass.php b/tests/RobotLoader/Fixture/SingleClass.php new file mode 100644 index 0000000000..085675086f --- /dev/null +++ b/tests/RobotLoader/Fixture/SingleClass.php @@ -0,0 +1,9 @@ +load([__DIR__ . '/Fixture'], []); + + $this->assertArrayHasKey(SingleClass::class, $classesToFilePaths); + $this->assertArrayHasKey(self::FIRST_THING, $classesToFilePaths); + $this->assertArrayHasKey(self::SECOND_THING, $classesToFilePaths); + + $this->assertSame($classesToFilePaths[self::FIRST_THING], $classesToFilePaths[self::SECOND_THING]); + } + + public function testExcludedPathIsSkipped(): void + { + $phpClassLoader = new PhpClassLoader(); + $classesToFilePaths = $phpClassLoader->load( + [__DIR__ . '/Fixture'], + [__DIR__ . '/Fixture/two_classes.php'] + ); + + $this->assertArrayHasKey(SingleClass::class, $classesToFilePaths); + $this->assertArrayNotHasKey(self::FIRST_THING, $classesToFilePaths); + } +}