| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 | <?php declare(strict_types=1);namespace PhpParser;/** * A PHP version, representing only the major and minor version components. */class PhpVersion {    /** @var int Version ID in PHP_VERSION_ID format */    public int $id;    /** @var int[] Minimum versions for builtin types */    private const BUILTIN_TYPE_VERSIONS = [        'array'    => 50100,        'callable' => 50400,        'bool'     => 70000,        'int'      => 70000,        'float'    => 70000,        'string'   => 70000,        'iterable' => 70100,        'void'     => 70100,        'object'   => 70200,        'null'     => 80000,        'false'    => 80000,        'mixed'    => 80000,        'never'    => 80100,        'true'     => 80200,    ];    private function __construct(int $id) {        $this->id = $id;    }    /**     * Create a PhpVersion object from major and minor version components.     */    public static function fromComponents(int $major, int $minor): self {        return new self($major * 10000 + $minor * 100);    }    /**     * Get the newest PHP version supported by this library. Support for this version may be partial,     * if it is still under development.     */    public static function getNewestSupported(): self {        return self::fromComponents(8, 3);    }    /**     * Get the host PHP version, that is the PHP version we're currently running on.     */    public static function getHostVersion(): self {        return self::fromComponents(\PHP_MAJOR_VERSION, \PHP_MINOR_VERSION);    }    /**     * Parse the version from a string like "8.1".     */    public static function fromString(string $version): self {        if (!preg_match('/^(\d+)\.(\d+)/', $version, $matches)) {            throw new \LogicException("Invalid PHP version \"$version\"");        }        return self::fromComponents((int) $matches[1], (int) $matches[2]);    }    /**     * Check whether two versions are the same.     */    public function equals(PhpVersion $other): bool {        return $this->id === $other->id;    }    /**     * Check whether this version is greater than or equal to the argument.     */    public function newerOrEqual(PhpVersion $other): bool {        return $this->id >= $other->id;    }    /**     * Check whether this version is older than the argument.     */    public function older(PhpVersion $other): bool {        return $this->id < $other->id;    }    /**     * Check whether this is the host PHP version.     */    public function isHostVersion(): bool {        return $this->equals(self::getHostVersion());    }    /**     * Check whether this PHP version supports the given builtin type. Type name must be lowercase.     */    public function supportsBuiltinType(string $type): bool {        $minVersion = self::BUILTIN_TYPE_VERSIONS[$type] ?? null;        return $minVersion !== null && $this->id >= $minVersion;    }    /**     * Whether this version supports [] array literals.     */    public function supportsShortArraySyntax(): bool {        return $this->id >= 50400;    }    /**     * Whether this version supports [] for destructuring.     */    public function supportsShortArrayDestructuring(): bool {        return $this->id >= 70100;    }    /**     * Whether this version supports flexible heredoc/nowdoc.     */    public function supportsFlexibleHeredoc(): bool {        return $this->id >= 70300;    }    /**     * Whether this version supports trailing commas in parameter lists.     */    public function supportsTrailingCommaInParamList(): bool {        return $this->id >= 80000;    }    /**     * Whether this version allows "$var =& new Obj".     */    public function allowsAssignNewByReference(): bool {        return $this->id < 70000;    }    /**     * Whether this version allows invalid octals like "08".     */    public function allowsInvalidOctals(): bool {        return $this->id < 70000;    }    /**     * Whether this version allows DEL (\x7f) to occur in identifiers.     */    public function allowsDelInIdentifiers(): bool {        return $this->id < 70100;    }    /**     * Whether this version supports yield in expression context without parentheses.     */    public function supportsYieldWithoutParentheses(): bool {        return $this->id >= 70000;    }    /**     * Whether this version supports unicode escape sequences in strings.     */    public function supportsUnicodeEscapes(): bool {        return $this->id >= 70000;    }}
 |