From e2c2a76b12bd94c6f1ed0e5603ac1736d887b195 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 6 Nov 2024 18:55:37 +0100 Subject: [PATCH 1/6] diagnose: print composer.json required php version --- src/Diagnose/PHPStanDiagnoseExtension.php | 27 +++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/Diagnose/PHPStanDiagnoseExtension.php b/src/Diagnose/PHPStanDiagnoseExtension.php index 7c3057190c..6726343561 100644 --- a/src/Diagnose/PHPStanDiagnoseExtension.php +++ b/src/Diagnose/PHPStanDiagnoseExtension.php @@ -48,6 +48,15 @@ public function print(Output $output): void 'PHP runtime version: %s', $phpRuntimeVersion->getVersionString(), )); + + $composerPhpVersion = $this->getComposerRequireVersion(); + if ($composerPhpVersion !== null) { + $output->writeLineFormatted(sprintf( + 'PHP composer.json required version: %s', + $composerPhpVersion, + )); + } + $output->writeLineFormatted(sprintf( 'PHP version for analysis: %s (from %s)', $this->phpVersion->getVersionString(), @@ -166,4 +175,22 @@ public function print(Output $output): void $output->writeLineFormatted(''); } + private function getComposerRequireVersion(): ?string + { + $composerPhpVersion = null; + + if (count($this->composerAutoloaderProjectPaths) > 0) { + $composer = ComposerHelper::getComposerConfig(end($this->composerAutoloaderProjectPaths)); + if ($composer !== null) { + $requiredVersion = $composer['require']['php'] ?? null; + + if (is_string($requiredVersion)) { + $composerPhpVersion = $requiredVersion; + } + } + } + + return $composerPhpVersion; + } + } From 9c6213e6fbc92d9442e05028690f6d103b54c992 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 6 Nov 2024 19:02:17 +0100 Subject: [PATCH 2/6] diagnose: print min/max php-version from config --- conf/config.neon | 1 + src/Diagnose/PHPStanDiagnoseExtension.php | 31 +++++++++++++++++++---- src/Php/PhpVersion.php | 8 ++++++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/conf/config.neon b/conf/config.neon index 739e8247dc..3f4414b606 100644 --- a/conf/config.neon +++ b/conf/config.neon @@ -2108,6 +2108,7 @@ services: arguments: composerAutoloaderProjectPaths: %composerAutoloaderProjectPaths% allConfigFiles: %allConfigFiles% + configPhpVersion: %phpVersion% autowired: false # Error formatters diff --git a/src/Diagnose/PHPStanDiagnoseExtension.php b/src/Diagnose/PHPStanDiagnoseExtension.php index 6726343561..f2b9f27d3c 100644 --- a/src/Diagnose/PHPStanDiagnoseExtension.php +++ b/src/Diagnose/PHPStanDiagnoseExtension.php @@ -14,11 +14,14 @@ use function class_exists; use function count; use function dirname; +use function end; use function explode; use function implode; use function in_array; +use function is_array; use function is_file; use function is_readable; +use function is_string; use function sprintf; use function str_starts_with; use function strlen; @@ -29,11 +32,13 @@ final class PHPStanDiagnoseExtension implements DiagnoseExtension { /** + * @param int|array{min: int, max: int}|null $configPhpVersion * @param string[] $composerAutoloaderProjectPaths * @param string [] $allConfigFiles */ public function __construct( private PhpVersion $phpVersion, + private int|array|null $configPhpVersion, private FileHelper $fileHelper, private array $composerAutoloaderProjectPaths, private array $allConfigFiles, @@ -57,11 +62,27 @@ public function print(Output $output): void )); } - $output->writeLineFormatted(sprintf( - 'PHP version for analysis: %s (from %s)', - $this->phpVersion->getVersionString(), - $this->phpVersion->getSourceLabel(), - )); + if ( + $this->phpVersion->getSource() === PhpVersion::SOURCE_CONFIG + && is_array($this->configPhpVersion) + ) { + $minVersion = new PhpVersion($this->configPhpVersion['min']); + $maxVersion = new PhpVersion($this->configPhpVersion['max']); + + $output->writeLineFormatted(sprintf( + 'PHP version for analysis: %s-%s (from %s)', + $minVersion->getVersionString(), + $maxVersion->getVersionString(), + $this->phpVersion->getSourceLabel(), + )); + + } else { + $output->writeLineFormatted(sprintf( + 'PHP version for analysis: %s (from %s)', + $this->phpVersion->getVersionString(), + $this->phpVersion->getSourceLabel(), + )); + } $output->writeLineFormatted(''); $output->writeLineFormatted(sprintf( diff --git a/src/Php/PhpVersion.php b/src/Php/PhpVersion.php index 83ca1245b5..8520f6488d 100644 --- a/src/Php/PhpVersion.php +++ b/src/Php/PhpVersion.php @@ -22,6 +22,14 @@ public function __construct(private int $versionId, private int $source = self:: { } + /** + * @return self::SOURCE_* + */ + public function getSource(): int + { + return $this->source; + } + public function getSourceLabel(): string { switch ($this->source) { From a6e89a107c98265519b82a3ff2f6b134fbdb1d8c Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 13 Nov 2024 10:38:11 +0100 Subject: [PATCH 3/6] separate min/max composer version --- conf/config.neon | 4 ++- src/Diagnose/PHPStanDiagnoseExtension.php | 41 ++++++++++------------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/conf/config.neon b/conf/config.neon index 3f4414b606..c79ee6f4c2 100644 --- a/conf/config.neon +++ b/conf/config.neon @@ -70,7 +70,9 @@ parameters: maximumNumberOfProcesses: 32 minimumNumberOfJobsPerProcess: 2 buffer: 134217728 # 128 MB - phpVersion: null + phpVersion: + min: 80303 + max: 80104 polluteScopeWithLoopInitialAssignments: true polluteScopeWithAlwaysIterableForeach: true polluteScopeWithBlock: true diff --git a/src/Diagnose/PHPStanDiagnoseExtension.php b/src/Diagnose/PHPStanDiagnoseExtension.php index f2b9f27d3c..5171462a10 100644 --- a/src/Diagnose/PHPStanDiagnoseExtension.php +++ b/src/Diagnose/PHPStanDiagnoseExtension.php @@ -7,6 +7,7 @@ use PHPStan\ExtensionInstaller\GeneratedConfig; use PHPStan\File\FileHelper; use PHPStan\Internal\ComposerHelper; +use PHPStan\Php\ComposerPhpVersionFactory; use PHPStan\Php\PhpVersion; use ReflectionClass; use function array_key_exists; @@ -42,6 +43,7 @@ public function __construct( private FileHelper $fileHelper, private array $composerAutoloaderProjectPaths, private array $allConfigFiles, + private ComposerPhpVersionFactory $composerPhpVersionFactory, ) { } @@ -54,12 +56,21 @@ public function print(Output $output): void $phpRuntimeVersion->getVersionString(), )); - $composerPhpVersion = $this->getComposerRequireVersion(); - if ($composerPhpVersion !== null) { - $output->writeLineFormatted(sprintf( - 'PHP composer.json required version: %s', - $composerPhpVersion, - )); + $minComposerPhpVersion = $this->composerPhpVersionFactory->getMinVersion(); + $maxComposerPhpVersion = $this->composerPhpVersionFactory->getMaxVersion(); + if ($minComposerPhpVersion !== null && $maxComposerPhpVersion !== null) { + if ($minComposerPhpVersion->getVersionId() === $maxComposerPhpVersion->getVersionId()) { + $output->writeLineFormatted(sprintf( + 'PHP composer.json required version: %s', + $minComposerPhpVersion->getVersionString(), + )); + } else { + $output->writeLineFormatted(sprintf( + 'PHP composer.json required version: %s-%s', + $minComposerPhpVersion->getVersionString(), + $maxComposerPhpVersion->getVersionString(), + )); + } } if ( @@ -196,22 +207,4 @@ public function print(Output $output): void $output->writeLineFormatted(''); } - private function getComposerRequireVersion(): ?string - { - $composerPhpVersion = null; - - if (count($this->composerAutoloaderProjectPaths) > 0) { - $composer = ComposerHelper::getComposerConfig(end($this->composerAutoloaderProjectPaths)); - if ($composer !== null) { - $requiredVersion = $composer['require']['php'] ?? null; - - if (is_string($requiredVersion)) { - $composerPhpVersion = $requiredVersion; - } - } - } - - return $composerPhpVersion; - } - } From d8273c92ac6c3459e5527c2d21d02db6d9a3811d Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 13 Nov 2024 10:39:09 +0100 Subject: [PATCH 4/6] Update config.neon --- conf/config.neon | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/conf/config.neon b/conf/config.neon index c79ee6f4c2..3f4414b606 100644 --- a/conf/config.neon +++ b/conf/config.neon @@ -70,9 +70,7 @@ parameters: maximumNumberOfProcesses: 32 minimumNumberOfJobsPerProcess: 2 buffer: 134217728 # 128 MB - phpVersion: - min: 80303 - max: 80104 + phpVersion: null polluteScopeWithLoopInitialAssignments: true polluteScopeWithAlwaysIterableForeach: true polluteScopeWithBlock: true From 4e8dd72e1a7b99470eebaa4053dd3304a0878021 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 13 Nov 2024 10:40:41 +0100 Subject: [PATCH 5/6] cs --- src/Diagnose/PHPStanDiagnoseExtension.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Diagnose/PHPStanDiagnoseExtension.php b/src/Diagnose/PHPStanDiagnoseExtension.php index 5171462a10..896f76f1bc 100644 --- a/src/Diagnose/PHPStanDiagnoseExtension.php +++ b/src/Diagnose/PHPStanDiagnoseExtension.php @@ -15,14 +15,12 @@ use function class_exists; use function count; use function dirname; -use function end; use function explode; use function implode; use function in_array; use function is_array; use function is_file; use function is_readable; -use function is_string; use function sprintf; use function str_starts_with; use function strlen; @@ -59,16 +57,16 @@ public function print(Output $output): void $minComposerPhpVersion = $this->composerPhpVersionFactory->getMinVersion(); $maxComposerPhpVersion = $this->composerPhpVersionFactory->getMaxVersion(); if ($minComposerPhpVersion !== null && $maxComposerPhpVersion !== null) { - if ($minComposerPhpVersion->getVersionId() === $maxComposerPhpVersion->getVersionId()) { + if ($minComposerPhpVersion->getVersionId() !== $maxComposerPhpVersion->getVersionId()) { $output->writeLineFormatted(sprintf( - 'PHP composer.json required version: %s', + 'PHP composer.json required version: %s-%s', $minComposerPhpVersion->getVersionString(), + $maxComposerPhpVersion->getVersionString(), )); } else { $output->writeLineFormatted(sprintf( - 'PHP composer.json required version: %s-%s', + 'PHP composer.json required version: %s', $minComposerPhpVersion->getVersionString(), - $maxComposerPhpVersion->getVersionString(), )); } } From c511771b83ac4659b6c39c89dbc2e488ec7517da Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 13 Nov 2024 11:47:23 +0100 Subject: [PATCH 6/6] print composer.json version only if phpVersion in phpstan.neon is int or null --- src/Diagnose/PHPStanDiagnoseExtension.php | 34 +++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/Diagnose/PHPStanDiagnoseExtension.php b/src/Diagnose/PHPStanDiagnoseExtension.php index 896f76f1bc..35cb6a862e 100644 --- a/src/Diagnose/PHPStanDiagnoseExtension.php +++ b/src/Diagnose/PHPStanDiagnoseExtension.php @@ -54,23 +54,6 @@ public function print(Output $output): void $phpRuntimeVersion->getVersionString(), )); - $minComposerPhpVersion = $this->composerPhpVersionFactory->getMinVersion(); - $maxComposerPhpVersion = $this->composerPhpVersionFactory->getMaxVersion(); - if ($minComposerPhpVersion !== null && $maxComposerPhpVersion !== null) { - if ($minComposerPhpVersion->getVersionId() !== $maxComposerPhpVersion->getVersionId()) { - $output->writeLineFormatted(sprintf( - 'PHP composer.json required version: %s-%s', - $minComposerPhpVersion->getVersionString(), - $maxComposerPhpVersion->getVersionString(), - )); - } else { - $output->writeLineFormatted(sprintf( - 'PHP composer.json required version: %s', - $minComposerPhpVersion->getVersionString(), - )); - } - } - if ( $this->phpVersion->getSource() === PhpVersion::SOURCE_CONFIG && is_array($this->configPhpVersion) @@ -86,6 +69,23 @@ public function print(Output $output): void )); } else { + $minComposerPhpVersion = $this->composerPhpVersionFactory->getMinVersion(); + $maxComposerPhpVersion = $this->composerPhpVersionFactory->getMaxVersion(); + if ($minComposerPhpVersion !== null && $maxComposerPhpVersion !== null) { + if ($minComposerPhpVersion->getVersionId() !== $maxComposerPhpVersion->getVersionId()) { + $output->writeLineFormatted(sprintf( + 'PHP composer.json required version: %s-%s', + $minComposerPhpVersion->getVersionString(), + $maxComposerPhpVersion->getVersionString(), + )); + } else { + $output->writeLineFormatted(sprintf( + 'PHP composer.json required version: %s', + $minComposerPhpVersion->getVersionString(), + )); + } + } + $output->writeLineFormatted(sprintf( 'PHP version for analysis: %s (from %s)', $this->phpVersion->getVersionString(),