Skip to content

Commit aac0273

Browse files
committed
[symfony 6.2] Fix attribute adding on abstract class in MessageHandlerInterfaceToAttributeRector
1 parent b3a4192 commit aac0273

File tree

7 files changed

+102
-4
lines changed

7 files changed

+102
-4
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace Rector\Symfony\Tests\Symfony62\Rector\Class_\MessageHandlerInterfaceToAttributeRector\Fixture;
4+
5+
use Rector\Symfony\Tests\Symfony62\Rector\Class_\MessageHandlerInterfaceToAttributeRector\Source\AbstractClassWithHandlerInterface;
6+
7+
class ClassThatExtendsAbstractClassThatImplementsHandler extends AbstractClassWithHandlerInterface
8+
{
9+
}
10+
11+
?>
12+
-----
13+
<?php
14+
15+
namespace Rector\Symfony\Tests\Symfony62\Rector\Class_\MessageHandlerInterfaceToAttributeRector\Fixture;
16+
17+
use Rector\Symfony\Tests\Symfony62\Rector\Class_\MessageHandlerInterfaceToAttributeRector\Source\AbstractClassWithHandlerInterface;
18+
19+
#[\Symfony\Component\Messenger\Attribute\AsMessageHandler]
20+
class ClassThatExtendsAbstractClassThatImplementsHandler extends AbstractClassWithHandlerInterface
21+
{
22+
}
23+
24+
?>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Rector\Symfony\Tests\Symfony62\Rector\Class_\MessageHandlerInterfaceToAttributeRector\Fixture;
4+
5+
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
6+
7+
abstract class OnlyRemoveInterfaceFromAbstactClass implements MessageHandlerInterface
8+
{
9+
}
10+
11+
?>
12+
-----
13+
<?php
14+
15+
namespace Rector\Symfony\Tests\Symfony62\Rector\Class_\MessageHandlerInterfaceToAttributeRector\Fixture;
16+
17+
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
18+
19+
abstract class OnlyRemoveInterfaceFromAbstactClass
20+
{
21+
}
22+
23+
?>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace Rector\Symfony\Tests\Symfony62\Rector\Class_\MessageHandlerInterfaceToAttributeRector\Source;
4+
5+
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
6+
7+
abstract class AbstractClassWithHandlerInterface implements MessageHandlerInterface
8+
{
9+
}

rules/Symfony62/Rector/Class_/MessageHandlerInterfaceToAttributeRector.php

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66

77
use PhpParser\Node;
88
use PhpParser\Node\Stmt\Class_;
9+
use PHPStan\Reflection\ReflectionProvider;
10+
use PHPStan\Type\ObjectType;
911
use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer;
1012
use Rector\Rector\AbstractRector;
1113
use Rector\Symfony\Helper\MessengerHelper;
12-
use Rector\Symfony\NodeAnalyzer\ClassAnalyzer;
1314
use Rector\Symfony\NodeManipulator\ClassManipulator;
1415
use Rector\Symfony\ValueObject\ServiceDefinition;
1516
use Rector\ValueObject\PhpVersionFeature;
@@ -25,8 +26,8 @@ final class MessageHandlerInterfaceToAttributeRector extends AbstractRector impl
2526
public function __construct(
2627
private readonly MessengerHelper $messengerHelper,
2728
private readonly ClassManipulator $classManipulator,
28-
private readonly ClassAnalyzer $classAnalyzer,
2929
private readonly PhpAttributeAnalyzer $phpAttributeAnalyzer,
30+
private readonly ReflectionProvider $reflectionProvider
3031
) {
3132
}
3233

@@ -84,11 +85,19 @@ public function getNodeTypes(): array
8485
*/
8586
public function refactor(Node $node): ?Node
8687
{
88+
if (! $this->reflectionProvider->hasClass(MessengerHelper::AS_MESSAGE_HANDLER_ATTRIBUTE)) {
89+
return null;
90+
}
91+
8792
if ($this->phpAttributeAnalyzer->hasPhpAttribute($node, MessengerHelper::AS_MESSAGE_HANDLER_ATTRIBUTE)) {
8893
return null;
8994
}
9095

91-
if (! $this->classAnalyzer->hasImplements($node, MessengerHelper::MESSAGE_HANDLER_INTERFACE)) {
96+
$classType = $this->getType($node);
97+
98+
$messageHandlerObjectType = new ObjectType(MessengerHelper::MESSAGE_HANDLER_INTERFACE);
99+
100+
if (! $messageHandlerObjectType->isSuperTypeOf($classType)->yes()) {
92101
$handlers = $this->messengerHelper->getHandlersFromServices();
93102
if ($handlers === []) {
94103
return null;
@@ -99,6 +108,11 @@ public function refactor(Node $node): ?Node
99108

100109
$this->classManipulator->removeImplements($node, [MessengerHelper::MESSAGE_HANDLER_INTERFACE]);
101110

111+
// no need to add the attribute
112+
if ($node->isAbstract()) {
113+
return $node;
114+
}
115+
102116
return $this->messengerHelper->addAttribute($node);
103117
}
104118

src/Helper/MessengerHelper.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ final class MessengerHelper
2424

2525
private string $messengerTagName = 'messenger.message_handler';
2626

27+
/**
28+
* @var ServiceDefinition[]
29+
*/
30+
private array $handlersFromServices = [];
31+
2732
public function __construct(
2833
private readonly PhpAttributeGroupFactory $phpAttributeGroupFactory,
2934
private readonly AttributeArrayNameInliner $attributeArrayNameInliner,
@@ -42,6 +47,7 @@ public function extractOptionsFromServiceDefinition(ServiceDefinition $serviceDe
4247
$options = $tag->getData();
4348
}
4449
}
50+
4551
if ($options['from_transport']) {
4652
$options['fromTransport'] = $options['from_transport'];
4753
unset($options['from_transport']);
@@ -54,8 +60,15 @@ public function extractOptionsFromServiceDefinition(ServiceDefinition $serviceDe
5460
*/
5561
public function getHandlersFromServices(): array
5662
{
63+
if ($this->handlersFromServices !== []) {
64+
return $this->handlersFromServices;
65+
}
66+
5767
$serviceMap = $this->serviceMapProvider->provide();
58-
return $serviceMap->getServicesByTag($this->messengerTagName);
68+
69+
$this->handlersFromServices = $serviceMap->getServicesByTag($this->messengerTagName);
70+
71+
return $this->handlersFromServices;
5972
}
6073

6174
/**
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Symfony\Component\Messenger\Attribute;
4+
5+
#[\Attribute(\Attribute::TARGET_CLASS)]
6+
class AsMessageHandler
7+
{
8+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace Symfony\Component\Messenger\Handler;
4+
5+
interface MessageHandlerInterface
6+
{
7+
}

0 commit comments

Comments
 (0)