Skip to content

Commit c6ea54a

Browse files
Merge remote-tracking branch 'origin/MAGETWO-70816-Compiler' into Okapis-PR-8-15
2 parents a4c37be + 3cee853 commit c6ea54a

File tree

5 files changed

+88
-34
lines changed

5 files changed

+88
-34
lines changed

app/code/Magento/Theme/Api/Data/DesignConfigDataInterface.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,15 @@ public function setFieldConfig(array $config);
6464
/**
6565
* Retrieve existing extension attributes object or create a new one.
6666
*
67-
* @return DesignConfigDataExtensionInterface|null
67+
* @return \Magento\Theme\Api\Data\DesignConfigDataExtensionInterface|null
6868
* @since 100.1.0
6969
*/
7070
public function getExtensionAttributes();
7171

7272
/**
7373
* Set an extension attributes object.
7474
*
75-
* @param DesignConfigDataExtensionInterface $extensionAttributes
75+
* @param \Magento\Theme\Api\Data\DesignConfigDataExtensionInterface $extensionAttributes
7676
* @return $this
7777
* @since 100.1.0
7878
*/

setup/src/Magento/Setup/Module/Di/App/Task/Operation/ServiceDataAttributesGenerator.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ public function __construct(
5454
public function doOperation()
5555
{
5656
$files = $this->configurationScanner->scan('extension_attributes.xml');
57-
$repositories = $this->serviceDataAttributesScanner->collectEntities($files);
58-
foreach ($repositories as $entityName) {
57+
$entities = $this->serviceDataAttributesScanner->collectEntities($files);
58+
foreach ($entities as $entityName) {
5959
class_exists($entityName);
6060
}
6161
}

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

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator;
1010
use Magento\Framework\ObjectManager\Code\Generator\Factory as FactoryGenerator;
1111
use Magento\Setup\Module\Di\Compiler\Log\Log;
12+
use \Magento\Framework\Reflection\TypeProcessor;
1213

1314
class PhpScanner implements ScannerInterface
1415
{
@@ -18,11 +19,21 @@ class PhpScanner implements ScannerInterface
1819
protected $_log;
1920

2021
/**
22+
* @var TypeProcessor
23+
*/
24+
private $typeProcessor;
25+
26+
/**
27+
* Initialize dependencies.
28+
*
2129
* @param Log $log
30+
* @param TypeProcessor|null $typeProcessor
2231
*/
23-
public function __construct(Log $log)
32+
public function __construct(Log $log, TypeProcessor $typeProcessor = null)
2433
{
2534
$this->_log = $log;
35+
$this->typeProcessor = $typeProcessor
36+
?: \Magento\Framework\App\ObjectManager::getInstance()->get(TypeProcessor::class);
2637
}
2738

2839
/**
@@ -45,22 +56,9 @@ protected function _findMissingClasses($file, $classReflection, $methodName, $en
4556
preg_match('/\[\s\<\w+?>\s([\w\\\\]+)/s', $parameter->__toString(), $matches);
4657
if (isset($matches[1]) && substr($matches[1], -strlen($entityType)) == $entityType) {
4758
$missingClassName = $matches[1];
48-
try {
49-
if (class_exists($missingClassName)) {
50-
continue;
51-
}
52-
} catch (\RuntimeException $e) {
53-
}
54-
$sourceClassName = $this->getSourceClassName($missingClassName, $entityType);
55-
if (!class_exists($sourceClassName) && !interface_exists($sourceClassName)) {
56-
$this->_log->add(
57-
Log::CONFIGURATION_ERROR,
58-
$missingClassName,
59-
"Invalid {$entityType} for nonexistent class {$sourceClassName} in file {$file}"
60-
);
61-
continue;
59+
if ($this->shouldGenerateClass($missingClassName, $entityType, $file)) {
60+
$missingClasses[] = $missingClassName;
6261
}
63-
$missingClasses[] = $missingClassName;
6462
}
6563
}
6664
}
@@ -137,12 +135,18 @@ protected function _fetchFactories($reflectionClass, $file)
137135
*/
138136
protected function _fetchMissingExtensionAttributesClasses($reflectionClass, $file)
139137
{
140-
$missingExtensionInterfaces = $this->_findMissingClasses(
141-
$file,
142-
$reflectionClass,
143-
'setExtensionAttributes',
144-
ucfirst(\Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator::ENTITY_TYPE)
145-
);
138+
$missingExtensionInterfaces = [];
139+
$methodName = 'getExtensionAttributes';
140+
$entityType = ucfirst(\Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator::ENTITY_TYPE);
141+
if ($reflectionClass->hasMethod($methodName) && $reflectionClass->isInterface()) {
142+
$returnType = $this->typeProcessor->getGetterReturnType(
143+
(new \Zend\Code\Reflection\ClassReflection($reflectionClass->getName()))->getMethod($methodName)
144+
);
145+
$missingClassName = $returnType['type'];
146+
if ($this->shouldGenerateClass($missingClassName, $entityType, $file)) {
147+
$missingExtensionInterfaces[] = $missingClassName;
148+
}
149+
}
146150
$missingExtensionClasses = [];
147151
$missingExtensionFactories = [];
148152
foreach ($missingExtensionInterfaces as $missingExtensionInterface) {
@@ -244,4 +248,32 @@ protected function _getDeclaredClasses($file)
244248
}
245249
return array_unique($classes);
246250
}
251+
252+
/**
253+
* Check if specified class is missing and if it can be generated.
254+
*
255+
* @param string $missingClassName
256+
* @param string $entityType
257+
* @param string $file
258+
* @return bool
259+
*/
260+
private function shouldGenerateClass($missingClassName, $entityType, $file)
261+
{
262+
try {
263+
if (class_exists($missingClassName)) {
264+
return false;
265+
}
266+
} catch (\RuntimeException $e) {
267+
}
268+
$sourceClassName = $this->getSourceClassName($missingClassName, $entityType);
269+
if (!class_exists($sourceClassName) && !interface_exists($sourceClassName)) {
270+
$this->_log->add(
271+
Log::CONFIGURATION_ERROR,
272+
$missingClassName,
273+
"Invalid {$entityType} for nonexistent class {$sourceClassName} in file {$file}"
274+
);
275+
return false;
276+
}
277+
return true;
278+
}
247279
}

setup/src/Magento/Setup/Test/Unit/Module/Di/Code/Scanner/PhpScannerTest.php

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
require_once __DIR__ . '/../../_files/app/code/Magento/SomeModule/Helper/Test.php';
99
require_once __DIR__ . '/../../_files/app/code/Magento/SomeModule/ElementFactory.php';
1010
require_once __DIR__ . '/../../_files/app/code/Magento/SomeModule/Model/DoubleColon.php';
11+
require_once __DIR__ . '/../../_files/app/code/Magento/SomeModule/Api/Data/SomeInterface.php';
12+
13+
use Magento\Framework\Reflection\TypeProcessor;
1114

1215
class PhpScannerTest extends \PHPUnit\Framework\TestCase
1316
{
@@ -33,18 +36,19 @@ class PhpScannerTest extends \PHPUnit\Framework\TestCase
3336

3437
protected function setUp()
3538
{
36-
$this->_model = new \Magento\Setup\Module\Di\Code\Scanner\PhpScanner(
37-
$this->_logMock = $this->createMock(\Magento\Setup\Module\Di\Compiler\Log\Log::class)
38-
);
39+
$this->_logMock = $this->createMock(\Magento\Setup\Module\Di\Compiler\Log\Log::class);
40+
$this->_model = new \Magento\Setup\Module\Di\Code\Scanner\PhpScanner($this->_logMock, new TypeProcessor());
3941
$this->_testDir = str_replace('\\', '/', realpath(__DIR__ . '/../../') . '/_files');
40-
$this->_testFiles = [
41-
$this->_testDir . '/app/code/Magento/SomeModule/Helper/Test.php',
42-
$this->_testDir . '/app/code/Magento/SomeModule/Model/DoubleColon.php'
43-
];
4442
}
4543

4644
public function testCollectEntities()
4745
{
46+
$this->_testFiles = [
47+
$this->_testDir . '/app/code/Magento/SomeModule/Helper/Test.php',
48+
$this->_testDir . '/app/code/Magento/SomeModule/Model/DoubleColon.php',
49+
$this->_testDir . '/app/code/Magento/SomeModule/Api/Data/SomeInterface.php'
50+
];
51+
4852
$this->_logMock->expects(
4953
$this->at(0)
5054
)->method(
@@ -64,6 +68,9 @@ public function testCollectEntities()
6468
'Invalid Factory declaration for class Magento\SomeModule\Element in file ' . $this->_testFiles[0]
6569
);
6670

67-
$this->assertEquals([], $this->_model->collectEntities($this->_testFiles));
71+
$this->assertEquals(
72+
['\Magento\Eav\Api\Data\AttributeExtensionInterface'],
73+
$this->_model->collectEntities($this->_testFiles)
74+
);
6875
}
6976
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
/**
3+
*
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
namespace Magento\SomeModule\Api\Data;
8+
9+
interface SomeInterface extends \Magento\Framework\Api\CustomAttributesDataInterface
10+
{
11+
/**
12+
* @return \Magento\Eav\Api\Data\AttributeExtensionInterface|null
13+
*/
14+
public function getExtensionAttributes();
15+
}

0 commit comments

Comments
 (0)