69 lines
2.4 KiB
PHP
69 lines
2.4 KiB
PHP
|
<?php declare(strict_types=1);
|
||
|
|
||
|
namespace PhpParser;
|
||
|
|
||
|
if (!\function_exists('PhpParser\defineCompatibilityTokens')) {
|
||
|
function defineCompatibilityTokens(): void {
|
||
|
$compatTokens = [
|
||
|
// PHP 8.0
|
||
|
'T_NAME_QUALIFIED',
|
||
|
'T_NAME_FULLY_QUALIFIED',
|
||
|
'T_NAME_RELATIVE',
|
||
|
'T_MATCH',
|
||
|
'T_NULLSAFE_OBJECT_OPERATOR',
|
||
|
'T_ATTRIBUTE',
|
||
|
// PHP 8.1
|
||
|
'T_ENUM',
|
||
|
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG',
|
||
|
'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG',
|
||
|
'T_READONLY',
|
||
|
// PHP 8.4
|
||
|
'T_PROPERTY_C',
|
||
|
'T_PUBLIC_SET',
|
||
|
'T_PROTECTED_SET',
|
||
|
'T_PRIVATE_SET',
|
||
|
];
|
||
|
|
||
|
// PHP-Parser might be used together with another library that also emulates some or all
|
||
|
// of these tokens. Perform a sanity-check that all already defined tokens have been
|
||
|
// assigned a unique ID.
|
||
|
$usedTokenIds = [];
|
||
|
foreach ($compatTokens as $token) {
|
||
|
if (\defined($token)) {
|
||
|
$tokenId = \constant($token);
|
||
|
if (!\is_int($tokenId)) {
|
||
|
throw new \Error(sprintf(
|
||
|
'Token %s has ID of type %s, should be int. ' .
|
||
|
'You may be using a library with broken token emulation',
|
||
|
$token, \gettype($tokenId)
|
||
|
));
|
||
|
}
|
||
|
$clashingToken = $usedTokenIds[$tokenId] ?? null;
|
||
|
if ($clashingToken !== null) {
|
||
|
throw new \Error(sprintf(
|
||
|
'Token %s has same ID as token %s, ' .
|
||
|
'you may be using a library with broken token emulation',
|
||
|
$token, $clashingToken
|
||
|
));
|
||
|
}
|
||
|
$usedTokenIds[$tokenId] = $token;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Now define any tokens that have not yet been emulated. Try to assign IDs from -1
|
||
|
// downwards, but skip any IDs that may already be in use.
|
||
|
$newTokenId = -1;
|
||
|
foreach ($compatTokens as $token) {
|
||
|
if (!\defined($token)) {
|
||
|
while (isset($usedTokenIds[$newTokenId])) {
|
||
|
$newTokenId--;
|
||
|
}
|
||
|
\define($token, $newTokenId);
|
||
|
$newTokenId--;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
defineCompatibilityTokens();
|
||
|
}
|