Skip to content

Commit 69ec05c

Browse files
marcospassospepakriz
authored andcommitted
Add support for ReflectionObject and fix ReflectionZendExtension logic (#50)
* Add support for ReflectionObject and fix ReflectionZendExtension logic * Fix code style violations * Fix code style violations
1 parent 83fd9a4 commit 69ec05c

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

src/Extension/ReflectionExtension.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
use ReflectionClass;
2020
use ReflectionException;
2121
use ReflectionFunction;
22+
use ReflectionObject;
2223
use ReflectionProperty;
2324
use ReflectionZendExtension;
25+
use function extension_loaded;
2426
use function is_a;
2527

2628
class ReflectionExtension implements DynamicConstructorThrowTypeExtension
@@ -45,6 +47,10 @@ public function getThrowTypeFromConstructor(MethodReflection $methodReflection,
4547
{
4648
$className = $methodReflection->getDeclaringClass()->getName();
4749

50+
if (is_a($className, ReflectionObject::class, true)) {
51+
return new VoidType();
52+
}
53+
4854
if (is_a($className, ReflectionClass::class, true)) {
4955
return $this->resolveReflectionClass($newNode, $scope);
5056
}
@@ -58,7 +64,7 @@ public function getThrowTypeFromConstructor(MethodReflection $methodReflection,
5864
}
5965

6066
if (is_a($className, ReflectionZendExtension::class, true)) {
61-
return $this->resolveReflectionClass($newNode, $scope);
67+
return $this->resolveReflectionExtension($newNode, $scope);
6268
}
6369

6470
throw new UnsupportedClassException();
@@ -153,4 +159,28 @@ private function resolveReflectionProperty(New_ $newNode, Scope $scope): Type
153159
return new VoidType();
154160
}
155161

162+
private function resolveReflectionExtension(New_ $newNode, Scope $scope): Type
163+
{
164+
$reflectionExceptionType = new ObjectType(ReflectionException::class);
165+
if (!isset($newNode->args[0])) {
166+
return $reflectionExceptionType;
167+
}
168+
169+
$valueType = $scope->getType($newNode->args[0]->value);
170+
171+
foreach (TypeUtils::getConstantStrings($valueType) as $constantString) {
172+
if (!extension_loaded($constantString->getValue())) {
173+
return $reflectionExceptionType;
174+
}
175+
176+
$valueType = TypeCombinator::remove($valueType, $constantString);
177+
}
178+
179+
if (!$valueType instanceof NeverType) {
180+
return $reflectionExceptionType;
181+
}
182+
183+
return new VoidType();
184+
}
185+
156186
}

tests/src/Rules/data/throws-php-internal-functions.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
use DateTimeImmutable;
77
use ReflectionClass;
88
use ReflectionFunction;
9+
use ReflectionObject;
910
use ReflectionProperty;
1011
use ReflectionZendExtension;
12+
use stdClass;
1113
use Throwable;
1214
use function rand;
1315

@@ -29,6 +31,8 @@ class Example
2931

3032
public function testReflection(): void
3133
{
34+
new ReflectionObject(new stdClass());
35+
3236
new ReflectionClass(self::class);
3337
new ReflectionClass('undefinedClass'); // error: Missing @throws ReflectionException annotation
3438

@@ -40,6 +44,7 @@ public function testReflection(): void
4044
new ReflectionFunction('count');
4145
new ReflectionFunction('undefinedFunction'); // error: Missing @throws ReflectionException annotation
4246

47+
new ReflectionZendExtension('json');
4348
new ReflectionZendExtension('unknownZendExtension'); // error: Missing @throws ReflectionException annotation
4449

4550
new ReflectionClass(rand(0, 1) === 0 ? self::class : Throwable::class);

0 commit comments

Comments
 (0)