From e165d99f5994af39d49ed70155c003745158e5db Mon Sep 17 00:00:00 2001 From: Yevhen Sentiabov Date: Wed, 29 Jan 2020 10:53:49 -0600 Subject: [PATCH] Github #26532: di:setup:compile fails with anonymous classes - Small refactoring for code simplification --- .../Module/Di/Code/Scanner/PhpScanner.php | 47 ++++++++++--------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php b/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php index be25cf605ef80..c7aa6fc6eb0c3 100644 --- a/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php +++ b/setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php @@ -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. @@ -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)) { @@ -123,7 +123,7 @@ protected function getSourceClassName($missingClassName, $entityType) */ protected function _fetchFactories($reflectionClass, $file) { - $absentFactories = $this->_findMissingClasses( + $absentFactories = $this->findMissingFactories( $file, $reflectionClass, '__construct', @@ -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)); @@ -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; } /** @@ -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)); @@ -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; } /**