forked from phpstan/phpstan-src
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathComposerPhpVersionFactory.php
More file actions
104 lines (82 loc) · 2.51 KB
/
ComposerPhpVersionFactory.php
File metadata and controls
104 lines (82 loc) · 2.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?php declare(strict_types = 1);
namespace PHPStan\Php;
use PHPStan\DependencyInjection\AutowiredParameter;
use PHPStan\DependencyInjection\AutowiredService;
use PHPStan\Internal\ComposerHelper;
use function count;
use function end;
use function is_string;
use function min;
#[AutowiredService]
final class ComposerPhpVersionFactory
{
private ?PhpVersion $minVersion = null;
private ?PhpVersion $maxVersion = null;
private bool $initialized = false;
/**
* @param string[] $composerAutoloaderProjectPaths
*/
public function __construct(
#[AutowiredParameter]
private array $composerAutoloaderProjectPaths,
)
{
}
private function initializeVersions(): void
{
$this->initialized = true;
// don't limit minVersion... PHPStan can analyze even PHP5
$this->maxVersion = new PhpVersion(PhpVersionFactory::MAX_PHP_VERSION);
// fallback to composer.json based php-version constraint
$composerPhpVersion = $this->getComposerRequireVersion();
if ($composerPhpVersion === null) {
return;
}
$parser = new ComposerPhpVersionParser();
[$minVersion, $maxVersion] = $parser->parse($composerPhpVersion, static function (string $version, int $versionId, bool $isMaxVersion): PhpVersion {
if ($isMaxVersion && $version === '6.0.0.0-dev') {
$versionId = min($versionId, PhpVersionFactory::MAX_PHP5_VERSION);
} elseif ($isMaxVersion && $version === '8.0.0.0-dev') {
$versionId = min($versionId, PhpVersionFactory::MAX_PHP7_VERSION);
} else {
$versionId = min($versionId, PhpVersionFactory::MAX_PHP_VERSION);
}
return new PhpVersion($versionId);
});
if ($minVersion !== null) {
$this->minVersion = new PhpVersion($minVersion->getVersionId());
}
if ($maxVersion === null) {
return;
}
$this->maxVersion = $maxVersion;
}
public function getMinVersion(): ?PhpVersion
{
if ($this->initialized === false) {
$this->initializeVersions();
}
return $this->minVersion;
}
public function getMaxVersion(): ?PhpVersion
{
if ($this->initialized === false) {
$this->initializeVersions();
}
return $this->maxVersion;
}
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;
}
}