Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit d4619ca

Browse filesBrowse files
committed
Add EnvelopeReturnTypeExtension for symfony/messenger
1 parent 649c258 commit d4619ca
Copy full SHA for d4619ca

File tree

Expand file treeCollapse file tree

4 files changed

+90
-1
lines changed
Filter options
Expand file treeCollapse file tree

4 files changed

+90
-1
lines changed

‎composer.json

Copy file name to clipboardExpand all lines: composer.json
+2-1Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
"phpstan/phpstan-phpunit": "^0.11",
3434
"symfony/framework-bundle": "^3.0 || ^4.0",
3535
"squizlabs/php_codesniffer": "^3.3.2",
36-
"symfony/serializer": "^3|^4"
36+
"symfony/serializer": "^3|^4",
37+
"symfony/messenger": "^4.2"
3738
},
3839
"conflict": {
3940
"symfony/framework-bundle": "<3.0"
+47Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Type\Symfony;
4+
5+
use PhpParser\Node\Expr\MethodCall;
6+
use PHPStan\Analyser\Scope;
7+
use PHPStan\Reflection\MethodReflection;
8+
use PHPStan\Type\ArrayType;
9+
use PHPStan\Type\Constant\ConstantStringType;
10+
use PHPStan\Type\DynamicMethodReturnTypeExtension;
11+
use PHPStan\Type\MixedType;
12+
use PHPStan\Type\ObjectType;
13+
use PHPStan\Type\Type;
14+
use Symfony\Component\Messenger\Stamp\StampInterface;
15+
16+
final class EnvelopeReturnTypeExtension implements DynamicMethodReturnTypeExtension
17+
{
18+
19+
public function getClass(): string
20+
{
21+
return 'Symfony\Component\Messenger\Envelope';
22+
}
23+
24+
public function isMethodSupported(MethodReflection $methodReflection): bool
25+
{
26+
return $methodReflection->getName() === 'all';
27+
}
28+
29+
public function getTypeFromMethodCall(
30+
MethodReflection $methodReflection,
31+
MethodCall $methodCall,
32+
Scope $scope
33+
): Type
34+
{
35+
if (count($methodCall->args) === 0) {
36+
return new ArrayType(new MixedType(), new ArrayType(new MixedType(), new ObjectType(StampInterface::class)));
37+
}
38+
39+
$argType = $scope->getType($methodCall->args[0]->value);
40+
if (!$argType instanceof ConstantStringType) {
41+
return new ArrayType(new MixedType(), new ObjectType(StampInterface::class));
42+
}
43+
44+
return new ArrayType(new MixedType(), new ObjectType($argType->getValue()));
45+
}
46+
47+
}
+32Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Type\Symfony;
4+
5+
use Iterator;
6+
use Symfony\Component\Messenger\Stamp\ReceivedStamp;
7+
use Symfony\Component\Messenger\Stamp\StampInterface;
8+
9+
final class EnvelopeReturnTypeExtensionTest extends ExtensionTestCase
10+
{
11+
12+
/**
13+
* @dataProvider getProvider
14+
*/
15+
public function testAll(string $expression, string $type): void
16+
{
17+
$this->processFile(
18+
__DIR__ . '/envelope_all.php',
19+
$expression,
20+
$type,
21+
new EnvelopeReturnTypeExtension()
22+
);
23+
}
24+
25+
public function getProvider(): Iterator
26+
{
27+
yield ['$test1', 'array<' . ReceivedStamp::class . '>'];
28+
yield ['$test2', 'array<' . StampInterface::class . '>'];
29+
yield ['$test3', 'array<array<' . StampInterface::class . '>>'];
30+
}
31+
32+
}

‎tests/Type/Symfony/envelope_all.php

Copy file name to clipboard
+9Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php declare(strict_types = 1);
2+
3+
$envelope = new \Symfony\Component\Messenger\Envelope(new stdClass());
4+
5+
$test1 = $envelope->all(\Symfony\Component\Messenger\Stamp\ReceivedStamp::class);
6+
$test2 = $envelope->all(random_bytes(1));
7+
$test3 = $envelope->all();
8+
9+
die;

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.