Skip to content

Commit

Permalink
Github #26532: di:setup:compile fails with anonymous classes
Browse files Browse the repository at this point in the history
 - Small refactoring for code simplification
  • Loading branch information
joni-jones committed Jan 29, 2020
1 parent 25fd925 commit e165d99
Showing 1 changed file with 24 additions and 23 deletions.
47 changes: 24 additions & 23 deletions setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
use Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator;
use Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator;
use Magento\Framework\ObjectManager\Code\Generator\Factory as FactoryGenerator;
use Magento\Framework\Reflection\TypeProcessor;
use Magento\Setup\Module\Di\Compiler\Log\Log;
use \Magento\Framework\Reflection\TypeProcessor;

/**
* Finds factory and extension attributes classes which require auto-generation.
Expand Down Expand Up @@ -50,7 +50,7 @@ public function __construct(Log $log, TypeProcessor $typeProcessor = null)
* @param string $entityType
* @return string[]
*/
protected function _findMissingClasses($file, $classReflection, $methodName, $entityType)
private function findMissingFactories($file, $classReflection, $methodName, $entityType)
{
$missingClasses = [];
if (!$classReflection->hasMethod($methodName)) {
Expand Down Expand Up @@ -123,7 +123,7 @@ protected function getSourceClassName($missingClassName, $entityType)
*/
protected function _fetchFactories($reflectionClass, $file)
{
$absentFactories = $this->_findMissingClasses(
$absentFactories = $this->findMissingFactories(
$file,
$reflectionClass,
'__construct',
Expand Down Expand Up @@ -177,11 +177,11 @@ public function collectEntities(array $files)
{
$output = [[]];
foreach ($files as $file) {
$classes = $this->_getDeclaredClasses($file);
$classes = $this->getDeclaredClasses($file);
foreach ($classes as $className) {
$reflectionClass = new \ReflectionClass($className);
$output [] = $this->_fetchFactories($reflectionClass, $file);
$output [] = $this->_fetchMissingExtensionAttributesClasses($reflectionClass, $file);
$output[] = $this->_fetchFactories($reflectionClass, $file);
$output[] = $this->_fetchMissingExtensionAttributesClasses($reflectionClass, $file);
}
}
return array_unique(array_merge(...$output));
Expand Down Expand Up @@ -210,32 +210,30 @@ protected function _fetchNamespace($tokenIterator, $count, $tokens)
}

/**
* Fetch class names from tokenized PHP file
* Fetches class name from tokenized PHP file.
*
* @param string $namespace
* @param int $tokenIterator
* @param int $count
* @param array $tokens
* @return array
* @return string|null
*/
protected function _fetchClasses($namespace, $tokenIterator, $count, $tokens)
private function fetchClass($namespace, $tokenIterator, $count, $tokens):? string
{
$classes = [];
// anonymous classes should be omitted
if (is_array($tokens[$tokenIterator - 2]) && $tokens[$tokenIterator - 2][0] === T_NEW) {
return null;
}

for ($tokenOffset = $tokenIterator + 1; $tokenOffset < $count; ++$tokenOffset) {
if ($tokens[$tokenOffset] !== '{') {
continue;
}
// anonymous classes should be omitted
if (is_array($tokens[$tokenIterator - 2]) && $tokens[$tokenIterator - 2][0] === T_NEW) {
continue;
}

$class = $namespace . "\\" . $tokens[$tokenIterator + 2][1];
if (!in_array($class, $classes)) {
$classes[] = $class;
}
return $namespace . "\\" . $tokens[$tokenIterator + 2][1];
}
return $classes;

return null;
}

/**
Expand All @@ -244,9 +242,9 @@ protected function _fetchClasses($namespace, $tokenIterator, $count, $tokens)
* @param string $file
* @return array
*/
protected function _getDeclaredClasses($file)
private function getDeclaredClasses($file): array
{
$classes = [[]];
$classes = [];
$namespaceParts = [];
// phpcs:ignore
$tokens = token_get_all(file_get_contents($file));
Expand All @@ -260,10 +258,13 @@ protected function _getDeclaredClasses($file)
if (($tokens[$tokenIterator][0] == T_CLASS || $tokens[$tokenIterator][0] == T_INTERFACE)
&& $tokens[$tokenIterator - 1][0] != T_DOUBLE_COLON
) {
$classes[] = $this->_fetchClasses(join('', $namespaceParts), $tokenIterator, $count, $tokens);
$class = $this->fetchClass(join('', $namespaceParts), $tokenIterator, $count, $tokens);
if ($class !== null && !in_array($class, $classes)) {
$classes[] = $class;
}
}
}
return array_unique(array_merge(...$classes));
return $classes;
}

/**
Expand Down

0 comments on commit e165d99

Please sign in to comment.