3
3
* Copyright © Magento, Inc. All rights reserved.
4
4
* See COPYING.txt for license details.
5
5
*/
6
+ declare (strict_types=1 );
7
+
6
8
namespace Magento \Setup \Module \Di \Code \Scanner ;
7
9
8
10
use Magento \Framework \Api \Code \Generator \ExtensionAttributesGenerator ;
12
14
use \Magento \Framework \Reflection \TypeProcessor ;
13
15
14
16
/**
15
- * Class PhpScanner
16
- *
17
- * @package Magento\Setup\Module\Di\Code\Scanner
17
+ * Finds factory and extension attributes classes which require auto-generation.
18
18
*/
19
19
class PhpScanner implements ScannerInterface
20
20
{
@@ -53,15 +53,28 @@ public function __construct(Log $log, TypeProcessor $typeProcessor = null)
53
53
protected function _findMissingClasses ($ file , $ classReflection , $ methodName , $ entityType )
54
54
{
55
55
$ missingClasses = [];
56
- if ($ classReflection ->hasMethod ($ methodName )) {
57
- $ constructor = $ classReflection ->getMethod ($ methodName );
58
- $ parameters = $ constructor ->getParameters ();
59
- /** @var $parameter \ReflectionParameter */
60
- foreach ($ parameters as $ parameter ) {
61
- preg_match ('/\[\s\<\w+?>\s([\w \\\\]+)/s ' , $ parameter ->__toString (), $ matches );
62
- if (isset ($ matches [1 ]) && substr ($ matches [1 ], -strlen ($ entityType )) == $ entityType ) {
63
- $ missingClassName = $ matches [1 ];
64
- if ($ this ->shouldGenerateClass ($ missingClassName , $ entityType , $ file )) {
56
+ if (!$ classReflection ->hasMethod ($ methodName )) {
57
+ return $ missingClasses ;
58
+ }
59
+
60
+ $ factorySuffix = '\\' . ucfirst (FactoryGenerator::ENTITY_TYPE );
61
+ $ constructor = $ classReflection ->getMethod ($ methodName );
62
+ $ parameters = $ constructor ->getParameters ();
63
+ /** @var $parameter \ReflectionParameter */
64
+ foreach ($ parameters as $ parameter ) {
65
+ preg_match ('/\[\s\<\w+?>\s([\w \\\\]+)/s ' , $ parameter ->__toString (), $ matches );
66
+ if (isset ($ matches [1 ]) && substr ($ matches [1 ], -strlen ($ entityType )) == $ entityType ) {
67
+ $ missingClassName = $ matches [1 ];
68
+ if ($ this ->shouldGenerateClass ($ missingClassName , $ entityType , $ file )) {
69
+
70
+ if (substr ($ missingClassName , -strlen ($ factorySuffix )) == $ factorySuffix ) {
71
+ $ entityName = rtrim (substr ($ missingClassName , 0 , -strlen ($ factorySuffix )), '\\' );
72
+ $ this ->_log ->add (
73
+ Log::CONFIGURATION_ERROR ,
74
+ $ missingClassName ,
75
+ 'Invalid Factory declaration for class ' . $ entityName . ' in file ' . $ file
76
+ );
77
+ } else {
65
78
$ missingClasses [] = $ missingClassName ;
66
79
}
67
80
}
@@ -110,24 +123,12 @@ protected function getSourceClassName($missingClassName, $entityType)
110
123
*/
111
124
protected function _fetchFactories ($ reflectionClass , $ file )
112
125
{
113
- $ factorySuffix = '\\' . ucfirst (FactoryGenerator::ENTITY_TYPE );
114
126
$ absentFactories = $ this ->_findMissingClasses (
115
127
$ file ,
116
128
$ reflectionClass ,
117
129
'__construct ' ,
118
130
ucfirst (FactoryGenerator::ENTITY_TYPE )
119
131
);
120
- foreach ($ absentFactories as $ key => $ absentFactory ) {
121
- if (substr ($ absentFactory , -strlen ($ factorySuffix )) == $ factorySuffix ) {
122
- $ entityName = rtrim (substr ($ absentFactory , 0 , -strlen ($ factorySuffix )), '\\' );
123
- $ this ->_log ->add (
124
- Log::CONFIGURATION_ERROR ,
125
- $ absentFactory ,
126
- 'Invalid Factory declaration for class ' . $ entityName . ' in file ' . $ file
127
- );
128
- unset($ absentFactories [$ key ]);
129
- }
130
- }
131
132
return $ absentFactories ;
132
133
}
133
134
@@ -150,21 +151,19 @@ protected function _fetchMissingExtensionAttributesClasses($reflectionClass, $fi
150
151
$ missingClassName = $ returnType ['type ' ];
151
152
if ($ this ->shouldGenerateClass ($ missingClassName , $ entityType , $ file )) {
152
153
$ missingExtensionInterfaces [] = $ missingClassName ;
154
+
155
+ $ extension = rtrim (substr ($ missingClassName , 0 , -strlen ('Interface ' )), '\\' );
156
+ if (!class_exists ($ extension )) {
157
+ $ missingExtensionInterfaces [] = $ extension ;
158
+ }
159
+ $ extensionFactory = $ extension . 'Factory ' ;
160
+ if (!class_exists ($ extensionFactory )) {
161
+ $ missingExtensionInterfaces [] = $ extensionFactory ;
162
+ }
153
163
}
154
164
}
155
- $ missingExtensionClasses = [];
156
- $ missingExtensionFactories = [];
157
- foreach ($ missingExtensionInterfaces as $ missingExtensionInterface ) {
158
- $ extension = rtrim (substr ($ missingExtensionInterface , 0 , -strlen ('Interface ' )), '\\' );
159
- if (!class_exists ($ extension )) {
160
- $ missingExtensionClasses [] = $ extension ;
161
- }
162
- $ extensionFactory = $ extension . 'Factory ' ;
163
- if (!class_exists ($ extensionFactory )) {
164
- $ missingExtensionFactories [] = $ extensionFactory ;
165
- }
166
- }
167
- return array_merge ($ missingExtensionInterfaces , $ missingExtensionClasses , $ missingExtensionFactories );
165
+
166
+ return $ missingExtensionInterfaces ;
168
167
}
169
168
170
169
/**
@@ -223,8 +222,17 @@ protected function _fetchClasses($namespace, $tokenIterator, $count, $tokens)
223
222
{
224
223
$ classes = [];
225
224
for ($ tokenOffset = $ tokenIterator + 1 ; $ tokenOffset < $ count ; ++$ tokenOffset ) {
226
- if ($ tokens [$ tokenOffset ] === '{ ' ) {
227
- $ classes [] = $ namespace . "\\" . $ tokens [$ tokenIterator + 2 ][1 ];
225
+ if ($ tokens [$ tokenOffset ] !== '{ ' ) {
226
+ continue ;
227
+ }
228
+ // anonymous classes should be omitted
229
+ if (is_array ($ tokens [$ tokenIterator - 2 ]) && $ tokens [$ tokenIterator - 2 ][0 ] === T_NEW ) {
230
+ continue ;
231
+ }
232
+
233
+ $ class = $ namespace . "\\" . $ tokens [$ tokenIterator + 2 ][1 ];
234
+ if (!in_array ($ class , $ classes )) {
235
+ $ classes [] = $ class ;
228
236
}
229
237
}
230
238
return $ classes ;
0 commit comments