Skip to content

Commit 2fb9094

Browse files
authored
Merge pull request #34206 from karyna-tsymbal-atwix/php8-compatibility/fix-reflection-is-builtin-method
Fix reflection isBuiltin() method for PHP8 compatibility
2 parents 5882f07 + 315f20a commit 2fb9094

File tree

10 files changed

+76
-179
lines changed

10 files changed

+76
-179
lines changed

dev/tests/static/framework/Magento/CodeMessDetector/Rule/Design/CookieAndSessionMisuse.php

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,14 @@
88

99
namespace Magento\CodeMessDetector\Rule\Design;
1010

11+
use Magento\Framework\GetParameterClassTrait;
1112
use Magento\Framework\Session\SessionManagerInterface;
1213
use Magento\Framework\Stdlib\Cookie\CookieReaderInterface;
1314
use PDepend\Source\AST\ASTClass;
1415
use PHPMD\AbstractNode;
1516
use PHPMD\AbstractRule;
1617
use PHPMD\Node\ClassNode;
1718
use PHPMD\Rule\ClassAware;
18-
use ReflectionClass;
19-
use ReflectionException;
20-
use ReflectionParameter;
2119

2220
/**
2321
* Session and Cookies must be used only in HTML Presentation layer.
@@ -26,6 +24,8 @@
2624
*/
2725
class CookieAndSessionMisuse extends AbstractRule implements ClassAware
2826
{
27+
use GetParameterClassTrait;
28+
2929
/**
3030
* Is given class a controller?
3131
*
@@ -198,22 +198,6 @@ private function doesUseRestrictedClasses(\ReflectionClass $class): bool
198198
return false;
199199
}
200200

201-
/**
202-
* Get class by reflection parameter
203-
*
204-
* @param ReflectionParameter $reflectionParameter
205-
* @return ReflectionClass|null
206-
* @throws ReflectionException
207-
*/
208-
private function getParameterClass(ReflectionParameter $reflectionParameter): ?ReflectionClass
209-
{
210-
$parameterType = $reflectionParameter->getType();
211-
212-
return $parameterType && !$parameterType->isBuiltin()
213-
? new ReflectionClass($parameterType->getName())
214-
: null;
215-
}
216-
217201
/**
218202
* @inheritdoc
219203
*

dev/tests/static/framework/Magento/TestFramework/Integrity/Library/Injectable.php

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,16 @@
66
namespace Magento\TestFramework\Integrity\Library;
77

88
use Laminas\Code\Reflection\ClassReflection;
9-
use ReflectionClass;
9+
use Magento\Framework\GetParameterClassTrait;
1010
use ReflectionException;
11-
use ReflectionParameter;
1211

1312
/**
1413
* Provide dependencies for the file
1514
*/
1615
class Injectable
1716
{
17+
use GetParameterClassTrait;
18+
1819
/**
1920
* @var string[]
2021
*/
@@ -53,20 +54,4 @@ public function getDependencies(ClassReflection $class): array
5354

5455
return $this->dependencies;
5556
}
56-
57-
/**
58-
* Get class by reflection parameter
59-
*
60-
* @param ReflectionParameter $reflectionParameter
61-
* @return ReflectionClass|null
62-
* @throws ReflectionException
63-
*/
64-
private function getParameterClass(ReflectionParameter $reflectionParameter): ?ReflectionClass
65-
{
66-
$parameterType = $reflectionParameter->getType();
67-
68-
return $parameterType && !$parameterType->isBuiltin()
69-
? new ReflectionClass($parameterType->getName())
70-
: null;
71-
}
7257
}

dev/tests/static/testsuite/Magento/Test/Integrity/PublicCodeTest.php

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@
1010
use Magento\Setup\Module\Di\Code\Reader\FileClassScanner;
1111
use PHPUnit\Framework\TestCase;
1212
use ReflectionClass;
13-
use ReflectionException;
1413
use ReflectionMethod;
15-
use ReflectionParameter;
1614

1715
/**
1816
* Tests @api annotated code integrity
@@ -73,7 +71,7 @@ public function testAllBlocksReferencedInLayoutArePublic($layoutFile)
7371
foreach ($elements as $node) {
7472
$class = (string) $node['class'];
7573
if ($class && \class_exists($class) && !in_array($class, $this->getWhitelist())) {
76-
$reflection = (new \ReflectionClass($class));
74+
$reflection = (new ReflectionClass($class));
7775
if (strpos($reflection->getDocComment(), '@api') === false) {
7876
$nonPublishedBlocks[] = $class;
7977
}
@@ -111,7 +109,7 @@ public function layoutFilesDataProvider()
111109
public function testAllPHPClassesReferencedFromPublicClassesArePublic($class)
112110
{
113111
$nonPublishedClasses = [];
114-
$reflection = new \ReflectionClass($class);
112+
$reflection = new ReflectionClass($class);
115113
$filter = ReflectionMethod::IS_PUBLIC;
116114
if ($reflection->isAbstract()) {
117115
$filter = $filter | ReflectionMethod::IS_PROTECTED;
@@ -175,10 +173,11 @@ public function publicPHPTypesDataProvider(): array
175173
/**
176174
* Check if a class is @api annotated
177175
*
178-
* @param \ReflectionClass $class
176+
* @param ReflectionClass $class
177+
*
179178
* @return bool
180179
*/
181-
private function isPublished(\ReflectionClass $class)
180+
private function isPublished(ReflectionClass $class)
182181
{
183182
return strpos($class->getDocComment(), '@api') !== false;
184183
}
@@ -250,7 +249,7 @@ private function checkReturnValues($class, array $returnTypes, array $nonPublish
250249
&& !$this->isGenerated($returnType)
251250
&& \class_exists($returnType)
252251
) {
253-
$returnTypeReflection = new \ReflectionClass($returnType);
252+
$returnTypeReflection = new ReflectionClass($returnType);
254253
if (!$returnTypeReflection->isInternal()
255254
&& $this->areClassesFromSameVendor($returnType, $class)
256255
&& !$this->isPublished($returnTypeReflection)
@@ -276,12 +275,13 @@ private function checkParameters($class, ReflectionMethod $method, array $nonPub
276275
{
277276
/* Ignoring docblocks for argument types */
278277
foreach ($method->getParameters() as $parameter) {
279-
if ($parameter->hasType()
280-
&& method_exists($parameter->getType(), 'isBuiltin')
281-
&& !$parameter->getType()->isBuiltin()
282-
&& !$this->isGenerated($parameter->getType()->getName())
278+
$parameterType = $parameter->getType();
279+
if ($parameterType
280+
&& method_exists($parameterType, 'isBuiltin')
281+
&& !$parameterType->isBuiltin()
282+
&& !$this->isGenerated($parameterType->getName())
283283
) {
284-
$parameterClass = $this->getParameterClass($parameter);
284+
$parameterClass = new ReflectionClass($parameterType->getName());
285285
/*
286286
* We don't want to check integrity of @api coverage of classes
287287
* that belong to different vendors, because it is too complicated.
@@ -300,20 +300,4 @@ private function checkParameters($class, ReflectionMethod $method, array $nonPub
300300
}
301301
return $nonPublishedClasses;
302302
}
303-
304-
/**
305-
* Get class by reflection parameter
306-
*
307-
* @param ReflectionParameter $reflectionParameter
308-
* @return ReflectionClass|null
309-
* @throws ReflectionException
310-
*/
311-
private function getParameterClass(ReflectionParameter $reflectionParameter): ?ReflectionClass
312-
{
313-
$parameterType = $reflectionParameter->getType();
314-
315-
return $parameterType && !$parameterType->isBuiltin()
316-
? new ReflectionClass($parameterType->getName())
317-
: null;
318-
}
319303
}

lib/internal/Magento/Framework/Code/Generator/EntityAbstract.php

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
namespace Magento\Framework\Code\Generator;
77

88
use Laminas\Code\Generator\ValueGenerator;
9-
use ReflectionClass;
10-
use ReflectionException;
11-
use ReflectionParameter;
9+
use Magento\Framework\GetParameterClassTrait;
1210

1311
/**
1412
* Abstract entity
1513
*/
1614
abstract class EntityAbstract
1715
{
16+
use GetParameterClassTrait;
17+
1818
/**
1919
* Entity type abstract
2020
*/
@@ -350,22 +350,6 @@ private function extractParameterType(
350350
return $typeName;
351351
}
352352

353-
/**
354-
* Get class by reflection parameter
355-
*
356-
* @param ReflectionParameter $reflectionParameter
357-
* @return ReflectionClass|null
358-
* @throws ReflectionException
359-
*/
360-
private function getParameterClass(ReflectionParameter $reflectionParameter): ?ReflectionClass
361-
{
362-
$parameterType = $reflectionParameter->getType();
363-
364-
return $parameterType && !$parameterType->isBuiltin()
365-
? new ReflectionClass($parameterType->getName())
366-
: null;
367-
}
368-
369353
/**
370354
* Extract parameter default value
371355
*

lib/internal/Magento/Framework/Code/Reader/ArgumentsReader.php

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
*/
66
namespace Magento\Framework\Code\Reader;
77

8-
use ReflectionClass;
9-
use ReflectionException;
10-
use ReflectionParameter;
8+
use Magento\Framework\GetParameterClassTrait;
119

1210
/**
1311
* The class arguments reader
1412
*/
1513
class ArgumentsReader
1614
{
15+
use GetParameterClassTrait;
16+
1717
const NO_DEFAULT_VALUE = 'NO-DEFAULT';
1818

1919
/**
@@ -127,22 +127,6 @@ private function processType(\ReflectionClass $class, \Laminas\Code\Reflection\P
127127
return $type;
128128
}
129129

130-
/**
131-
* Get class by reflection parameter
132-
*
133-
* @param ReflectionParameter $reflectionParameter
134-
* @return ReflectionClass|null
135-
* @throws ReflectionException
136-
*/
137-
private function getParameterClass(ReflectionParameter $reflectionParameter): ?ReflectionClass
138-
{
139-
$parameterType = $reflectionParameter->getType();
140-
141-
return $parameterType && !$parameterType->isBuiltin()
142-
? new ReflectionClass($parameterType->getName())
143-
: null;
144-
}
145-
146130
/**
147131
* Get arguments of parent __construct call
148132
*

lib/internal/Magento/Framework/Code/Reader/ClassReader.php

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
namespace Magento\Framework\Code\Reader;
77

8+
use Magento\Framework\GetParameterClassTrait;
89
use ReflectionClass;
910
use ReflectionException;
1011
use ReflectionParameter;
@@ -14,6 +15,11 @@
1415
*/
1516
class ClassReader implements ClassReaderInterface
1617
{
18+
use GetParameterClassTrait;
19+
20+
/**
21+
* @var array
22+
*/
1723
private $parentsCache = [];
1824

1925
/**
@@ -56,26 +62,6 @@ public function getConstructor($className)
5662
return $result;
5763
}
5864

59-
/**
60-
* Get class by reflection parameter
61-
*
62-
* @param ReflectionParameter $reflectionParameter
63-
* @return ReflectionClass|null
64-
* @throws ReflectionException
65-
*/
66-
private function getParameterClass(ReflectionParameter $reflectionParameter): ?ReflectionClass
67-
{
68-
$parameterType = $reflectionParameter->getType();
69-
// In PHP8, $parameterType could be an instance of ReflectionUnionType, which doesn't have isBuiltin method.
70-
if ($parameterType !== null && method_exists($parameterType, 'isBuiltin') === false) {
71-
return null;
72-
}
73-
74-
return $parameterType && !$parameterType->isBuiltin()
75-
? new ReflectionClass($parameterType->getName())
76-
: null;
77-
}
78-
7965
/**
8066
* Get reflection parameter default value
8167
*

lib/internal/Magento/Framework/Code/Reader/SourceArgumentsReader.php

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
*/
66
namespace Magento\Framework\Code\Reader;
77

8-
use ReflectionClass;
9-
use ReflectionException;
10-
use ReflectionParameter;
8+
use Magento\Framework\GetParameterClassTrait;
119

1210
class SourceArgumentsReader
1311
{
12+
use GetParameterClassTrait;
13+
1414
/**
1515
* Namespace separator
1616
* @deprecated
@@ -86,22 +86,6 @@ public function getConstructorArgumentTypes(
8686
return $types;
8787
}
8888

89-
/**
90-
* Get class by reflection parameter
91-
*
92-
* @param ReflectionParameter $reflectionParameter
93-
* @return ReflectionClass|null
94-
* @throws ReflectionException
95-
*/
96-
private function getParameterClass(ReflectionParameter $reflectionParameter): ?ReflectionClass
97-
{
98-
$parameterType = $reflectionParameter->getType();
99-
100-
return $parameterType && !$parameterType->isBuiltin()
101-
? new ReflectionClass($parameterType->getName())
102-
: null;
103-
}
104-
10589
/**
10690
* Perform namespace resolution if required and return fully qualified name.
10791
*
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Framework;
8+
9+
use ReflectionClass;
10+
use ReflectionParameter;
11+
12+
/**
13+
* Returns a reflection parameter's class if possible.
14+
*/
15+
trait GetParameterClassTrait
16+
{
17+
/**
18+
* Get class by reflection parameter
19+
*
20+
* @param ReflectionParameter $reflectionParameter
21+
*
22+
* @return ReflectionClass|null
23+
* @throws ReflectionException
24+
*/
25+
private function getParameterClass(ReflectionParameter $reflectionParameter): ?ReflectionClass
26+
{
27+
$parameterType = $reflectionParameter->getType();
28+
// In PHP8, $parameterType could be an instance of ReflectionUnionType, which doesn't have isBuiltin method.
29+
if ($parameterType !== null && method_exists($parameterType, 'isBuiltin') === false) {
30+
return null;
31+
}
32+
33+
return $parameterType && !$parameterType->isBuiltin()
34+
? new ReflectionClass($parameterType->getName())
35+
: null;
36+
}
37+
}

0 commit comments

Comments
 (0)