From b9e51587048086d236f98c0bfcd8ad129dec774d Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Fri, 19 Dec 2025 09:20:14 +0100 Subject: [PATCH 1/2] Refactor PHPUnitVersionDetector to use runtime reflection --- src/Rules/PHPUnit/PHPUnitVersionDetector.php | 49 ++++++++++---------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/src/Rules/PHPUnit/PHPUnitVersionDetector.php b/src/Rules/PHPUnit/PHPUnitVersionDetector.php index b82caaf..39921db 100644 --- a/src/Rules/PHPUnit/PHPUnitVersionDetector.php +++ b/src/Rules/PHPUnit/PHPUnitVersionDetector.php @@ -2,8 +2,9 @@ namespace PHPStan\Rules\PHPUnit; -use PHPStan\Reflection\ReflectionProvider; use PHPUnit\Framework\TestCase; +use ReflectionClass; +use ReflectionException; use function dirname; use function explode; use function file_get_contents; @@ -13,33 +14,33 @@ class PHPUnitVersionDetector { - private ReflectionProvider $reflectionProvider; - - public function __construct(ReflectionProvider $reflectionProvider) - { - $this->reflectionProvider = $reflectionProvider; - } - public function createPHPUnitVersion(): PHPUnitVersion { + $file = false; $majorVersion = null; $minorVersion = null; - if ($this->reflectionProvider->hasClass(TestCase::class)) { - $testCase = $this->reflectionProvider->getClass(TestCase::class); - $file = $testCase->getFileName(); - if ($file !== null) { - $phpUnitRoot = dirname($file, 3); - $phpUnitComposer = $phpUnitRoot . '/composer.json'; - if (is_file($phpUnitComposer)) { - $composerJson = @file_get_contents($phpUnitComposer); - if ($composerJson !== false) { - $json = json_decode($composerJson, true); - $version = $json['extra']['branch-alias']['dev-main'] ?? null; - if ($version !== null) { - $versionParts = explode('.', $version); - $majorVersion = (int) $versionParts[0]; - $minorVersion = (int) $versionParts[1]; - } + + try { + // uses runtime reflection to reduce unnecessary work while bootstrapping PHPStan. + // static reflection would need to AST parse and build up reflection for a lot of files otherwise. + $reflection = new ReflectionClass(TestCase::class); + $file = $reflection->getFileName(); + } catch (ReflectionException $e) { + // PHPUnit might not be installed + } + + if ($file !== false) { + $phpUnitRoot = dirname($file, 3); + $phpUnitComposer = $phpUnitRoot . '/composer.json'; + if (is_file($phpUnitComposer)) { + $composerJson = @file_get_contents($phpUnitComposer); + if ($composerJson !== false) { + $json = json_decode($composerJson, true); + $version = $json['extra']['branch-alias']['dev-main'] ?? null; + if ($version !== null) { + $versionParts = explode('.', $version); + $majorVersion = (int) $versionParts[0]; + $minorVersion = (int) $versionParts[1]; } } } From b417188e2daab93e321fa517184de5fcff0c41b8 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Fri, 19 Dec 2025 09:46:31 +0100 Subject: [PATCH 2/2] Remove unnecessary is_file() --- src/Rules/PHPUnit/PHPUnitVersionDetector.php | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/Rules/PHPUnit/PHPUnitVersionDetector.php b/src/Rules/PHPUnit/PHPUnitVersionDetector.php index 39921db..d35c3e7 100644 --- a/src/Rules/PHPUnit/PHPUnitVersionDetector.php +++ b/src/Rules/PHPUnit/PHPUnitVersionDetector.php @@ -8,7 +8,6 @@ use function dirname; use function explode; use function file_get_contents; -use function is_file; use function json_decode; class PHPUnitVersionDetector @@ -32,16 +31,15 @@ public function createPHPUnitVersion(): PHPUnitVersion if ($file !== false) { $phpUnitRoot = dirname($file, 3); $phpUnitComposer = $phpUnitRoot . '/composer.json'; - if (is_file($phpUnitComposer)) { - $composerJson = @file_get_contents($phpUnitComposer); - if ($composerJson !== false) { - $json = json_decode($composerJson, true); - $version = $json['extra']['branch-alias']['dev-main'] ?? null; - if ($version !== null) { - $versionParts = explode('.', $version); - $majorVersion = (int) $versionParts[0]; - $minorVersion = (int) $versionParts[1]; - } + + $composerJson = @file_get_contents($phpUnitComposer); + if ($composerJson !== false) { + $json = json_decode($composerJson, true); + $version = $json['extra']['branch-alias']['dev-main'] ?? null; + if ($version !== null) { + $versionParts = explode('.', $version); + $majorVersion = (int) $versionParts[0]; + $minorVersion = (int) $versionParts[1]; } } }