Skip to content

Commit 68596bf

Browse files
committed
[Php83] Handle parent class consume trait on AddOverrideAttributeToOverriddenMethodsRector
1 parent 9d02f92 commit 68596bf

3 files changed

Lines changed: 64 additions & 0 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace Rector\Tests\Php83\Rector\ClassMethod\AddOverrideAttributeToOverriddenMethodsRector\Fixture;
4+
5+
use Rector\Tests\Php83\Rector\ClassMethod\AddOverrideAttributeToOverriddenMethodsRector\Source\ParentConsumeTrait;
6+
7+
class ExtendsParentConsumeTrait extends ParentConsumeTrait
8+
{
9+
public function run()
10+
{
11+
echo 'override default';
12+
}
13+
}
14+
15+
?>
16+
-----
17+
<?php
18+
19+
namespace Rector\Tests\Php83\Rector\ClassMethod\AddOverrideAttributeToOverriddenMethodsRector\Fixture;
20+
21+
use Rector\Tests\Php83\Rector\ClassMethod\AddOverrideAttributeToOverriddenMethodsRector\Source\ParentConsumeTrait;
22+
23+
class ExtendsParentConsumeTrait extends ParentConsumeTrait
24+
{
25+
#[\Override]
26+
public function run()
27+
{
28+
echo 'override default';
29+
}
30+
}
31+
32+
?>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Rector\Tests\Php83\Rector\ClassMethod\AddOverrideAttributeToOverriddenMethodsRector\Source;
4+
5+
abstract class ParentConsumeTrait
6+
{
7+
use ExampleFromTrait;
8+
}

rules/Php83/Rector/ClassMethod/AddOverrideAttributeToOverriddenMethodsRector.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use PhpParser\Node\Stmt\ClassMethod;
1717
use PhpParser\Node\Stmt\Expression;
1818
use PhpParser\Node\Stmt\Return_;
19+
use PhpParser\Node\Stmt\Trait_;
1920
use PHPStan\Reflection\ClassReflection;
2021
use PHPStan\Reflection\ReflectionProvider;
2122
use Rector\Contract\Rector\ConfigurableRectorInterface;
@@ -261,6 +262,10 @@ private function shouldSkipParentClassMethod(ClassReflection $parentClassReflect
261262
}
262263

263264
$parentClassMethod = $parentClass->getMethod($classMethod->name->toString());
265+
if (! $parentClassMethod instanceof ClassMethod) {
266+
$parentClassMethod = $this->resolveClassMethodFromTraitUse($parentClass, $classMethod->name->toString());
267+
}
268+
264269
if (! $parentClassMethod instanceof ClassMethod) {
265270
return true;
266271
}
@@ -298,6 +303,25 @@ private function shouldSkipParentClassMethod(ClassReflection $parentClassReflect
298303
return false;
299304
}
300305

306+
private function resolveClassMethodFromTraitUse(ClassLike $classLike, string $methodName): ?ClassMethod
307+
{
308+
foreach ($classLike->getTraitUses() as $traitUse) {
309+
foreach ($traitUse->traits as $traitName) {
310+
$traitClass = $this->astResolver->resolveClassFromName($traitName->__toString());
311+
if (! $traitClass instanceof Trait_) {
312+
continue;
313+
}
314+
315+
$traitClassMethod = $traitClass->getMethod($methodName);
316+
if ($traitClassMethod instanceof ClassMethod) {
317+
return $traitClassMethod;
318+
}
319+
}
320+
}
321+
322+
return null;
323+
}
324+
301325
private function implementsStringable(Class_ $class): bool
302326
{
303327
foreach ($class->implements as $implement) {

0 commit comments

Comments
 (0)