Skip to content

Commit 89c7534

Browse files
author
Bartłomiej Nowak
committed
code review fixes
1 parent d62ec03 commit 89c7534

File tree

4 files changed

+42
-29
lines changed

4 files changed

+42
-29
lines changed

.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
/tests/tmp
22
/build-cs
33
/vendor
4-
/.idea
54
/composer.lock
65
.phpunit.result.cache

src/Symfony/MessageMap.php

+2-3
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,15 @@
77
final class MessageMap
88
{
99

10-
/** @var array<class-string, Type> */
10+
/** @var array<string, Type> */
1111
private $messageMap;
1212

13-
/** @param array<class-string, Type> $messageMap */
13+
/** @param array<string, Type> $messageMap */
1414
public function __construct(array $messageMap)
1515
{
1616
$this->messageMap = $messageMap;
1717
}
1818

19-
/** @param class-string $class */
2019
public function getTypeForClass(string $class): ?Type
2120
{
2221
return $this->messageMap[$class] ?? null;

src/Symfony/MessageMapFactory.php

+32-17
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace PHPStan\Symfony;
44

55
use PHPStan\Reflection\ClassReflection;
6-
use PHPStan\Reflection\MissingMethodFromReflectionException;
76
use PHPStan\Reflection\ReflectionProvider;
87
use PHPStan\ShouldNotHappenException;
98
use Symfony\Component\Messenger\Handler\MessageSubscriberInterface;
@@ -47,9 +46,14 @@ public function create(): MessageMap
4746
continue;
4847
}
4948

49+
if (!$this->reflectionProvider->hasClass($serviceClass)) {
50+
continue;
51+
}
52+
53+
$reflectionClass = $this->reflectionProvider->getClass($serviceClass);
54+
5055
/** @var array{handles?: class-string, method?: string} $tagAttributes */
5156
$tagAttributes = $tag->getAttributes();
52-
$reflectionClass = $this->reflectionProvider->getClass($serviceClass);
5357

5458
if (isset($tagAttributes['handles'])) {
5559
$handles = [$tagAttributes['handles'] => ['method' => $tagAttributes['method'] ?? self::DEFAULT_HANDLER_METHOD]];
@@ -58,7 +62,13 @@ public function create(): MessageMap
5862
}
5963

6064
foreach ($handles as $messageClassName => $options) {
61-
$methodReflection = $reflectionClass->getNativeMethod($options['method'] ?? self::DEFAULT_HANDLER_METHOD);
65+
$methodName = $options['method'] ?? self::DEFAULT_HANDLER_METHOD;
66+
67+
if (!$reflectionClass->hasNativeMethod($methodName)) {
68+
continue;
69+
}
70+
71+
$methodReflection = $reflectionClass->getNativeMethod($methodName);
6272

6373
foreach ($methodReflection->getVariants() as $variant) {
6474
$returnTypesMap[$messageClassName][] = $variant->getReturnType();
@@ -79,27 +89,33 @@ public function create(): MessageMap
7989
return new MessageMap($messageMap);
8090
}
8191

82-
/** @return array<class-string, array<string, string>> */
92+
/** @return iterable<string, array<string, string>> */
8393
private function guessHandledMessages(ClassReflection $reflectionClass): iterable
8494
{
8595
if ($reflectionClass->implementsInterface(MessageSubscriberInterface::class)) {
86-
foreach ($reflectionClass->getName()::getHandledMessages() as $index => $value) {
87-
if (self::containOptions($index, $value)) {
88-
yield $index => $value;
89-
} else {
90-
yield $value => ['method' => self::DEFAULT_HANDLER_METHOD];
96+
$className = $reflectionClass->getName();
97+
98+
foreach ($className::getHandledMessages() as $index => $value) {
99+
try {
100+
if (self::containOptions($index, $value)) {
101+
yield $index => $value;
102+
} else {
103+
yield $value => ['method' => self::DEFAULT_HANDLER_METHOD];
104+
}
105+
} catch (ShouldNotHappenException $e) {
106+
continue;
91107
}
92108
}
93109

94110
return;
95111
}
96112

97-
try {
98-
$methodReflection = $reflectionClass->getNativeMethod(self::DEFAULT_HANDLER_METHOD);
99-
} catch (MissingMethodFromReflectionException $e) {
113+
if (!$reflectionClass->hasNativeMethod(self::DEFAULT_HANDLER_METHOD)) {
100114
return;
101115
}
102116

117+
$methodReflection = $reflectionClass->getNativeMethod(self::DEFAULT_HANDLER_METHOD);
118+
103119
$variants = $methodReflection->getVariants();
104120
if (count($variants) !== 1) {
105121
return;
@@ -111,7 +127,6 @@ private function guessHandledMessages(ClassReflection $reflectionClass): iterabl
111127
return;
112128
}
113129

114-
/** @var class-string[] $classNames */
115130
$classNames = $parameters[0]->getType()->getObjectClassNames();
116131

117132
if (count($classNames) !== 1) {
@@ -124,10 +139,10 @@ private function guessHandledMessages(ClassReflection $reflectionClass): iterabl
124139
/**
125140
* @param mixed $index
126141
* @param mixed $value
127-
* @phpstan-assert-if-true class-string $index
128-
* @phpstan-assert-if-true array<string, mixed> $value
129-
* @phpstan-assert-if-false int $index
130-
* @phpstan-assert-if-false class-string $value
142+
* @phpstan-assert-if-true =class-string $index
143+
* @phpstan-assert-if-true =array<string, mixed> $value
144+
* @phpstan-assert-if-false =int $index
145+
* @phpstan-assert-if-false =class-string $value
131146
*/
132147
private static function containOptions($index, $value): bool
133148
{

src/Type/Symfony/MessengerHandleTraitReturnTypeExtension.php

+8-8
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
use PHPStan\Symfony\MessageMapFactory;
1111
use PHPStan\Type\ExpressionTypeResolverExtension;
1212
use PHPStan\Type\Type;
13-
use ReflectionException;
1413
use function count;
1514
use function is_null;
1615

@@ -35,7 +34,6 @@ public function getType(Expr $expr, Scope $scope): ?Type
3534
{
3635
if ($this->isSupported($expr, $scope)) {
3736
$arg = $expr->getArgs()[0]->value;
38-
/** @var class-string[] $argClassNames */
3937
$argClassNames = $scope->getType($arg)->getObjectClassNames();
4038

4139
if (count($argClassNames) === 1) {
@@ -61,7 +59,7 @@ private function getMessageMap(): MessageMap
6159
}
6260

6361
/**
64-
* @phpstan-assert-if-true MethodCall $expr
62+
* @phpstan-assert-if-true =MethodCall $expr
6563
*/
6664
private function isSupported(Expr $expr, Scope $scope): bool
6765
{
@@ -73,14 +71,16 @@ private function isSupported(Expr $expr, Scope $scope): bool
7371
return false;
7472
}
7573

76-
try {
77-
$methodReflection = $scope->getClassReflection()->getNativeReflection()->getMethod(self::TRAIT_METHOD_NAME);
78-
$declaringClassReflection = $methodReflection->getBetterReflection()->getDeclaringClass();
74+
$reflectionClass = $scope->getClassReflection()->getNativeReflection();
7975

80-
return $declaringClassReflection->getName() === self::TRAIT_NAME;
81-
} catch (ReflectionException $e) {
76+
if (!$reflectionClass->hasMethod(self::TRAIT_METHOD_NAME)) {
8277
return false;
8378
}
79+
80+
$methodReflection = $reflectionClass->getMethod(self::TRAIT_METHOD_NAME);
81+
$declaringClassReflection = $methodReflection->getBetterReflection()->getDeclaringClass();
82+
83+
return $declaringClassReflection->getName() === self::TRAIT_NAME;
8484
}
8585

8686
}

0 commit comments

Comments
 (0)