T_CLASS case in FileMigrationFinder.php appears to be broken
peteraba opened this issue · 1 comments
peteraba commented
Private method getClassNamesFromTokens
looks like this:
/**
* Gets the class names from a list of tokens
* This will work even if multiple classes are defined in each file
*
* @param string[] $tokens The array of tokens
* @return string[] The names of the classes
*/
private function getClassNamesFromTokens(array $tokens) : array
{
for ($i = 0;$i < count($tokens);$i++) {
// Skip literals
if (is_string($tokens[$i])) {
continue;
}
$className = '';
switch ($tokens[$i][0]) {
case T_NAMESPACE:
$namespace = '';
// Collect all the namespace parts and separators
while (isset($tokens[++$i][1])) {
if (in_array($tokens[$i][0], [T_NS_SEPARATOR, T_STRING])) {
$namespace .= $tokens[$i][1];
}
}
break;
case T_CLASS:
$isClassConstant = false;
// Scan previous tokens to see if they're double colons, which would mean this is a class constant
for ($j = $i - 1;$j >= 0;$j--) {
if (!isset($tokens[$j][1])) {
break;
}
if ($tokens[$j][0] === T_DOUBLE_COLON) {
$isClassConstant = true;
break 2;
} elseif ($tokens[$j][0] === T_WHITESPACE) {
// Since we found whitespace, then we know this isn't a class constant
break;
}
}
// Get the class name
while (isset($tokens[++$i][1])) {
if ($tokens[$i][0] === T_STRING) {
$className .= $tokens[$i][1];
break;
}
}
$classNames[] = ltrim($namespace . '\\' . $className, '\\');
break 2;
}
}
return $classNames;
}
$isClassConstant
is never read, $namespace
is never defined.
I will not try to fix this as I'm not sure how this was supposed to work or if required at all. Probably some unit tests are missing, but I didn't look deep enough to know for sure.
davidbyoung commented
Yeah, this was the result of some refactoring that was done and some missed opportunities for code cleanup. This is fixed in a subsequent release.