Skip to content

Commit f7bf1e0

Browse files
Bartłomiej Nowakbnowak
Bartłomiej Nowak
authored andcommitted
code review 1
1 parent 5cba4ba commit f7bf1e0

File tree

3 files changed

+32
-11
lines changed

3 files changed

+32
-11
lines changed

src/Symfony/MessageMap.php

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

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

13-
/**
14-
* @param array<string, Type> $messageMap
15-
*/
13+
/** @param array<class-string, Type> $messageMap */
1614
public function __construct(array $messageMap)
1715
{
1816
$this->messageMap = $messageMap;
1917
}
2018

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

src/Symfony/MessageMapFactory.php

+27-6
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
use PHPStan\Reflection\ClassReflection;
66
use PHPStan\Reflection\MissingMethodFromReflectionException;
77
use PHPStan\Reflection\ReflectionProvider;
8+
use PHPStan\ShouldNotHappenException;
89
use Symfony\Component\Messenger\Handler\MessageSubscriberInterface;
10+
use function class_exists;
911
use function count;
12+
use function is_array;
1013
use function is_int;
11-
use function is_null;
1214
use function is_string;
1315

1416
final class MessageMapFactory
@@ -36,7 +38,7 @@ public function create(): MessageMap
3638
foreach ($this->serviceMap->getServices() as $service) {
3739
$serviceClass = $service->getClass();
3840

39-
if (is_null($serviceClass)) {
41+
if ($serviceClass === null) {
4042
continue;
4143
}
4244

@@ -45,6 +47,7 @@ public function create(): MessageMap
4547
continue;
4648
}
4749

50+
/** @var array{handles?: class-string, method?: string} $tagAttributes */
4851
$tagAttributes = $tag->getAttributes();
4952
$reflectionClass = $this->reflectionProvider->getClass($serviceClass);
5053

@@ -76,15 +79,15 @@ public function create(): MessageMap
7679
return new MessageMap($messageMap);
7780
}
7881

79-
/** @return array<string, array<string, string>> */
82+
/** @return array<class-string, array<string, string>> */
8083
private function guessHandledMessages(ClassReflection $reflectionClass): iterable
8184
{
8285
if ($reflectionClass->implementsInterface(MessageSubscriberInterface::class)) {
8386
foreach ($reflectionClass->getName()::getHandledMessages() as $index => $value) {
84-
if (is_int($index) && is_string($value)) {
85-
yield $value => ['method' => self::DEFAULT_HANDLER_METHOD];
86-
} else {
87+
if (self::containOptions($index, $value)) {
8788
yield $index => $value;
89+
} else {
90+
yield $value => ['method' => self::DEFAULT_HANDLER_METHOD];
8891
}
8992
}
9093

@@ -108,6 +111,7 @@ private function guessHandledMessages(ClassReflection $reflectionClass): iterabl
108111
return;
109112
}
110113

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

113117
if (count($classNames) !== 1) {
@@ -117,4 +121,21 @@ private function guessHandledMessages(ClassReflection $reflectionClass): iterabl
117121
yield $classNames[0] => ['method' => self::DEFAULT_HANDLER_METHOD];
118122
}
119123

124+
/**
125+
* @phpstan-assert-if-true class-string $index
126+
* @phpstan-assert-if-true array<string, mixed> $value
127+
* @phpstan-assert-if-false int $index
128+
* @phpstan-assert-if-false class-string $value
129+
*/
130+
private static function containOptions(mixed $index, mixed $value): bool
131+
{
132+
if (is_string($index) && class_exists($index) && is_array($value)) {
133+
return true;
134+
} elseif (is_int($index) && is_string($value) && class_exists($value)) {
135+
return false;
136+
}
137+
138+
throw new ShouldNotHappenException();
139+
}
140+
120141
}

src/Type/Symfony/MessengerHandleTraitReturnTypeExtension.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public function getType(Expr $expr, Scope $scope): ?Type
3535
{
3636
if ($this->isSupported($expr, $scope)) {
3737
$arg = $expr->getArgs()[0]->value;
38+
/** @var class-string[] $argClassNames */
3839
$argClassNames = $scope->getType($arg)->getObjectClassNames();
3940

4041
if (count($argClassNames) === 1) {
@@ -52,7 +53,7 @@ public function getType(Expr $expr, Scope $scope): ?Type
5253

5354
private function getMessageMap(): MessageMap
5455
{
55-
if (is_null($this->messageMap)) {
56+
if ($this->messageMap === null) {
5657
$this->messageMap = $this->messageMapFactory->create();
5758
}
5859

0 commit comments

Comments
 (0)