mirror of https://github.com/rectorphp/rector.git
49 lines
2.0 KiB
PHP
49 lines
2.0 KiB
PHP
<?php
|
|
|
|
declare (strict_types=1);
|
|
namespace Rector\Php\PhpVersionResolver;
|
|
|
|
use RectorPrefix202404\Composer\Semver\VersionParser;
|
|
use RectorPrefix202404\Nette\Utils\FileSystem;
|
|
use RectorPrefix202404\Nette\Utils\Json;
|
|
use Rector\Util\PhpVersionFactory;
|
|
/**
|
|
* @see \Rector\Tests\Php\PhpVersionResolver\ProjectComposerJsonPhpVersionResolver\ProjectComposerJsonPhpVersionResolverTest
|
|
*/
|
|
final class ProjectComposerJsonPhpVersionResolver
|
|
{
|
|
/**
|
|
* @var array<string, int|null>
|
|
*/
|
|
private static $cachedPhpVersions = [];
|
|
public static function resolve(string $composerJson) : ?int
|
|
{
|
|
if (\array_key_exists($composerJson, self::$cachedPhpVersions)) {
|
|
return self::$cachedPhpVersions[$composerJson];
|
|
}
|
|
$composerJsonContents = FileSystem::read($composerJson);
|
|
$projectComposerJson = Json::decode($composerJsonContents, \true);
|
|
// give this one a priority, as more generic one
|
|
$requirePhpVersion = $projectComposerJson['require']['php'] ?? null;
|
|
if ($requirePhpVersion !== null) {
|
|
self::$cachedPhpVersions[$composerJson] = self::createIntVersionFromComposerVersion($requirePhpVersion);
|
|
return self::$cachedPhpVersions[$composerJson];
|
|
}
|
|
// see https://getcomposer.org/doc/06-config.md#platform
|
|
$platformPhp = $projectComposerJson['config']['platform']['php'] ?? null;
|
|
if ($platformPhp !== null) {
|
|
self::$cachedPhpVersions[$composerJson] = PhpVersionFactory::createIntVersion($platformPhp);
|
|
return self::$cachedPhpVersions[$composerJson];
|
|
}
|
|
return self::$cachedPhpVersions[$composerJson] = null;
|
|
}
|
|
private static function createIntVersionFromComposerVersion(string $projectPhpVersion) : int
|
|
{
|
|
$versionParser = new VersionParser();
|
|
$constraint = $versionParser->parseConstraints($projectPhpVersion);
|
|
$lowerBound = $constraint->getLowerBound();
|
|
$lowerBoundVersion = $lowerBound->getVersion();
|
|
return PhpVersionFactory::createIntVersion($lowerBoundVersion);
|
|
}
|
|
}
|