From 443cfb025a8d867754d8834874bafcf0a5e4d595 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sat, 20 Dec 2025 14:56:54 +0100 Subject: [PATCH] Prevent reading & json-decoding composer.json multiple times --- src/Internal/ComposerHelper.php | 9 ++++++++- src/Php/PhpVersionFactoryFactory.php | 23 +++++++---------------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/Internal/ComposerHelper.php b/src/Internal/ComposerHelper.php index 0665a5bdf4..246dba8e7d 100644 --- a/src/Internal/ComposerHelper.php +++ b/src/Internal/ComposerHelper.php @@ -21,9 +21,16 @@ final class ComposerHelper private static ?string $phpstanVersion = null; + /** @var array */ + private static array $decodedCache = []; + /** @return array|null */ public static function getComposerConfig(string $root): ?array { + if (isset(self::$decodedCache[$root])) { + return self::$decodedCache[$root]; + } + $composerJsonPath = self::getComposerJsonPath($root); if ($composerJsonPath === null) { return null; @@ -32,7 +39,7 @@ public static function getComposerConfig(string $root): ?array try { $composerJsonContents = FileReader::read($composerJsonPath); - return Json::decode($composerJsonContents, Json::FORCE_ARRAY); + return self::$decodedCache[$root] ??= Json::decode($composerJsonContents, Json::FORCE_ARRAY); } catch (CouldNotReadFileException | JsonException) { return null; } diff --git a/src/Php/PhpVersionFactoryFactory.php b/src/Php/PhpVersionFactoryFactory.php index 6ecfed8c71..c587d597de 100644 --- a/src/Php/PhpVersionFactoryFactory.php +++ b/src/Php/PhpVersionFactoryFactory.php @@ -2,16 +2,12 @@ namespace PHPStan\Php; -use Nette\Utils\Json; -use Nette\Utils\JsonException; use PHPStan\DependencyInjection\AutowiredParameter; use PHPStan\DependencyInjection\AutowiredService; -use PHPStan\File\CouldNotReadFileException; -use PHPStan\File\FileReader; +use PHPStan\Internal\ComposerHelper; use function count; use function end; use function is_array; -use function is_file; use function is_int; use function is_string; @@ -36,17 +32,12 @@ public function create(): PhpVersionFactory { $composerPhpVersion = null; if (count($this->composerAutoloaderProjectPaths) > 0) { - $composerJsonPath = end($this->composerAutoloaderProjectPaths) . 'https://github.com/composer.json'; - if (is_file($composerJsonPath)) { - try { - $composerJsonContents = FileReader::read($composerJsonPath); - $composer = Json::decode($composerJsonContents, Json::FORCE_ARRAY); - $platformVersion = $composer['config']['platform']['php'] ?? null; - if (is_string($platformVersion)) { - $composerPhpVersion = $platformVersion; - } - } catch (CouldNotReadFileException | JsonException) { - // pass + $composerJsonPath = end($this->composerAutoloaderProjectPaths); + $composer = ComposerHelper::getComposerConfig($composerJsonPath); + if ($composer !== null) { + $platformVersion = $composer['config']['platform']['php'] ?? null; + if (is_string($platformVersion)) { + $composerPhpVersion = $platformVersion; } } }