Skip to content

Commit e165d99

Browse files
committed
Github #26532: di:setup:compile fails with anonymous classes
- Small refactoring for code simplification
1 parent 25fd925 commit e165d99

File tree

1 file changed

+24
-23
lines changed

1 file changed

+24
-23
lines changed

setup/src/Magento/Setup/Module/Di/Code/Scanner/PhpScanner.php

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
use Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator;
1111
use Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator;
1212
use Magento\Framework\ObjectManager\Code\Generator\Factory as FactoryGenerator;
13+
use Magento\Framework\Reflection\TypeProcessor;
1314
use Magento\Setup\Module\Di\Compiler\Log\Log;
14-
use \Magento\Framework\Reflection\TypeProcessor;
1515

1616
/**
1717
* Finds factory and extension attributes classes which require auto-generation.
@@ -50,7 +50,7 @@ public function __construct(Log $log, TypeProcessor $typeProcessor = null)
5050
* @param string $entityType
5151
* @return string[]
5252
*/
53-
protected function _findMissingClasses($file, $classReflection, $methodName, $entityType)
53+
private function findMissingFactories($file, $classReflection, $methodName, $entityType)
5454
{
5555
$missingClasses = [];
5656
if (!$classReflection->hasMethod($methodName)) {
@@ -123,7 +123,7 @@ protected function getSourceClassName($missingClassName, $entityType)
123123
*/
124124
protected function _fetchFactories($reflectionClass, $file)
125125
{
126-
$absentFactories = $this->_findMissingClasses(
126+
$absentFactories = $this->findMissingFactories(
127127
$file,
128128
$reflectionClass,
129129
'__construct',
@@ -177,11 +177,11 @@ public function collectEntities(array $files)
177177
{
178178
$output = [[]];
179179
foreach ($files as $file) {
180-
$classes = $this->_getDeclaredClasses($file);
180+
$classes = $this->getDeclaredClasses($file);
181181
foreach ($classes as $className) {
182182
$reflectionClass = new \ReflectionClass($className);
183-
$output [] = $this->_fetchFactories($reflectionClass, $file);
184-
$output [] = $this->_fetchMissingExtensionAttributesClasses($reflectionClass, $file);
183+
$output[] = $this->_fetchFactories($reflectionClass, $file);
184+
$output[] = $this->_fetchMissingExtensionAttributesClasses($reflectionClass, $file);
185185
}
186186
}
187187
return array_unique(array_merge(...$output));
@@ -210,32 +210,30 @@ protected function _fetchNamespace($tokenIterator, $count, $tokens)
210210
}
211211

212212
/**
213-
* Fetch class names from tokenized PHP file
213+
* Fetches class name from tokenized PHP file.
214214
*
215215
* @param string $namespace
216216
* @param int $tokenIterator
217217
* @param int $count
218218
* @param array $tokens
219-
* @return array
219+
* @return string|null
220220
*/
221-
protected function _fetchClasses($namespace, $tokenIterator, $count, $tokens)
221+
private function fetchClass($namespace, $tokenIterator, $count, $tokens):? string
222222
{
223-
$classes = [];
223+
// anonymous classes should be omitted
224+
if (is_array($tokens[$tokenIterator - 2]) && $tokens[$tokenIterator - 2][0] === T_NEW) {
225+
return null;
226+
}
227+
224228
for ($tokenOffset = $tokenIterator + 1; $tokenOffset < $count; ++$tokenOffset) {
225229
if ($tokens[$tokenOffset] !== '{') {
226230
continue;
227231
}
228-
// anonymous classes should be omitted
229-
if (is_array($tokens[$tokenIterator - 2]) && $tokens[$tokenIterator - 2][0] === T_NEW) {
230-
continue;
231-
}
232232

233-
$class = $namespace . "\\" . $tokens[$tokenIterator + 2][1];
234-
if (!in_array($class, $classes)) {
235-
$classes[] = $class;
236-
}
233+
return $namespace . "\\" . $tokens[$tokenIterator + 2][1];
237234
}
238-
return $classes;
235+
236+
return null;
239237
}
240238

241239
/**
@@ -244,9 +242,9 @@ protected function _fetchClasses($namespace, $tokenIterator, $count, $tokens)
244242
* @param string $file
245243
* @return array
246244
*/
247-
protected function _getDeclaredClasses($file)
245+
private function getDeclaredClasses($file): array
248246
{
249-
$classes = [[]];
247+
$classes = [];
250248
$namespaceParts = [];
251249
// phpcs:ignore
252250
$tokens = token_get_all(file_get_contents($file));
@@ -260,10 +258,13 @@ protected function _getDeclaredClasses($file)
260258
if (($tokens[$tokenIterator][0] == T_CLASS || $tokens[$tokenIterator][0] == T_INTERFACE)
261259
&& $tokens[$tokenIterator - 1][0] != T_DOUBLE_COLON
262260
) {
263-
$classes[] = $this->_fetchClasses(join('', $namespaceParts), $tokenIterator, $count, $tokens);
261+
$class = $this->fetchClass(join('', $namespaceParts), $tokenIterator, $count, $tokens);
262+
if ($class !== null && !in_array($class, $classes)) {
263+
$classes[] = $class;
264+
}
264265
}
265266
}
266-
return array_unique(array_merge(...$classes));
267+
return $classes;
267268
}
268269

269270
/**

0 commit comments

Comments
 (0)