|
2 | 2 |
|
3 | 3 | namespace PHPStan\Php; |
4 | 4 |
|
5 | | -use Composer\Semver\VersionParser; |
6 | | -use Nette\Utils\Strings; |
7 | 5 | use PHPStan\DependencyInjection\AutowiredParameter; |
8 | 6 | use PHPStan\DependencyInjection\AutowiredService; |
9 | 7 | use PHPStan\Internal\ComposerHelper; |
10 | 8 | use function count; |
11 | 9 | use function end; |
12 | 10 | use function is_string; |
13 | 11 | use function min; |
14 | | -use function sprintf; |
15 | 12 |
|
16 | 13 | #[AutowiredService] |
17 | 14 | final class ComposerPhpVersionFactory |
@@ -46,21 +43,26 @@ private function initializeVersions(): void |
46 | 43 | return; |
47 | 44 | } |
48 | 45 |
|
49 | | - $parser = new VersionParser(); |
50 | | - $constraint = $parser->parseConstraints($composerPhpVersion); |
51 | | - |
52 | | - if (!$constraint->getLowerBound()->isZero()) { |
53 | | - $minVersion = $this->buildVersion($constraint->getLowerBound()->getVersion(), false); |
54 | | - |
55 | | - if ($minVersion !== null) { |
56 | | - $this->minVersion = new PhpVersion($minVersion->getVersionId()); |
| 46 | + $parser = new ComposerPhpVersionParser(); |
| 47 | + [$minVersion, $maxVersion] = $parser->parse($composerPhpVersion, static function (string $version, int $versionId, bool $isMaxVersion): PhpVersion { |
| 48 | + if ($isMaxVersion && $version === '6.0.0.0-dev') { |
| 49 | + $versionId = min($versionId, PhpVersionFactory::MAX_PHP5_VERSION); |
| 50 | + } elseif ($isMaxVersion && $version === '8.0.0.0-dev') { |
| 51 | + $versionId = min($versionId, PhpVersionFactory::MAX_PHP7_VERSION); |
| 52 | + } else { |
| 53 | + $versionId = min($versionId, PhpVersionFactory::MAX_PHP_VERSION); |
57 | 54 | } |
| 55 | + |
| 56 | + return new PhpVersion($versionId); |
| 57 | + }); |
| 58 | + if ($minVersion !== null) { |
| 59 | + $this->minVersion = new PhpVersion($minVersion->getVersionId()); |
58 | 60 | } |
59 | | - if ($constraint->getUpperBound()->isPositiveInfinity()) { |
| 61 | + if ($maxVersion === null) { |
60 | 62 | return; |
61 | 63 | } |
62 | 64 |
|
63 | | - $this->maxVersion = $this->buildVersion($constraint->getUpperBound()->getVersion(), true); |
| 65 | + $this->maxVersion = $maxVersion; |
64 | 66 | } |
65 | 67 |
|
66 | 68 | public function getMinVersion(): ?PhpVersion |
@@ -99,27 +101,4 @@ private function getComposerRequireVersion(): ?string |
99 | 101 | return $composerPhpVersion; |
100 | 102 | } |
101 | 103 |
|
102 | | - private function buildVersion(string $version, bool $isMaxVersion): ?PhpVersion |
103 | | - { |
104 | | - $matches = Strings::match($version, '#^(\d+)\.(\d+)(?:\.(\d+))?#'); |
105 | | - if ($matches === null) { |
106 | | - return null; |
107 | | - } |
108 | | - |
109 | | - $major = $matches[1]; |
110 | | - $minor = $matches[2]; |
111 | | - $patch = $matches[3] ?? 0; |
112 | | - $versionId = (int) sprintf('%d%02d%02d', $major, $minor, $patch); |
113 | | - |
114 | | - if ($isMaxVersion && $version === '6.0.0.0-dev') { |
115 | | - $versionId = min($versionId, PhpVersionFactory::MAX_PHP5_VERSION); |
116 | | - } elseif ($isMaxVersion && $version === '8.0.0.0-dev') { |
117 | | - $versionId = min($versionId, PhpVersionFactory::MAX_PHP7_VERSION); |
118 | | - } else { |
119 | | - $versionId = min($versionId, PhpVersionFactory::MAX_PHP_VERSION); |
120 | | - } |
121 | | - |
122 | | - return new PhpVersion($versionId); |
123 | | - } |
124 | | - |
125 | 104 | } |
0 commit comments