Skip to content

Commit

Permalink
Fix parseUseStatements for PHP 8
Browse files Browse the repository at this point in the history
  • Loading branch information
ondrejmirtes committed Jul 29, 2020
1 parent 6296f8d commit e55a8da
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions src/Utils/Reflection.php
Original file line number Diff line number Diff line change
Expand Up @@ -255,11 +255,18 @@ private static function parseUseStatements(string $code, string $forClass = null
$namespace = $class = $classLevel = $level = null;
$res = $uses = [];

$nameTokens = [T_STRING, T_NS_SEPARATOR];

This comment has been minimized.

Copy link
@dg

dg Jul 30, 2020

Tady by šlo stručnější

$nameTokens = PHP_VERSION_ID < 80000 
	? [T_STRING, T_NS_SEPARATOR] 
	: [T_STRING, T_NAME_QUALIFIED, T_NAME_FULLY_QUALIFIED];  

This comment has been minimized.

Copy link
@ondrejmirtes

ondrejmirtes Jul 30, 2020

Author Owner

Já si říkám jestli bys tam nechtěl udělat něco jako že když narazíš na T_NAME_FULLY_QUALIFIED, tak to vůbec nebudeš spojovat s namespacem/resolvovat podle usů, ale nevím. V RFC je pak ještě T_NAME_RELATIVE pro namespace\Foo, ale to jsem v životě v žádným kódu neviděl...

This comment has been minimized.

Copy link
@dg

dg Jul 30, 2020

Asi to teď nebudu komplikovat a až někdy dropnu podporu pro PHP 7, tak ten kód hezky zjednoduším.

if (PHP_VERSION_ID >= 80000) {
$nameTokens[] = T_NAME_QUALIFIED;
$nameTokens[] = T_NAME_FULLY_QUALIFIED;
$nameTokens[] = T_NAME_RELATIVE;
}

while ($token = current($tokens)) {
next($tokens);
switch (is_array($token) ? $token[0] : $token) {
case T_NAMESPACE:
$namespace = ltrim(self::fetch($tokens, [T_STRING, T_NS_SEPARATOR]) . '\\', '\\');
$namespace = ltrim(self::fetch($tokens, $nameTokens) . '\\', '\\');
$uses = [];
break;

Expand All @@ -277,10 +284,10 @@ private static function parseUseStatements(string $code, string $forClass = null
break;

case T_USE:
while (!$class && ($name = self::fetch($tokens, [T_STRING, T_NS_SEPARATOR]))) {
while (!$class && ($name = self::fetch($tokens, $nameTokens))) {
$name = ltrim($name, '\\');
if (self::fetch($tokens, '{')) {
while ($suffix = self::fetch($tokens, [T_STRING, T_NS_SEPARATOR])) {
while ($suffix = self::fetch($tokens, $nameTokens)) {
if (self::fetch($tokens, T_AS)) {
$uses[self::fetch($tokens, T_STRING)] = $name . $suffix;
} else {
Expand Down

0 comments on commit e55a8da

Please sign in to comment.