Skip to content

Commit d9915f2

Browse files
authored
skip @ return this on RemoveReturnTagIncompatibleWithNativeTypeRector on Traits (#8185)
* skip return $this removal on trait on RemoveReturnTagIncompatibleWithNativeTypeRector * skip return $this removal on trait on RemoveReturnTagIncompatibleWithNativeTypeRector * fix cs * fix phpstan
1 parent 653ec23 commit d9915f2

3 files changed

Lines changed: 41 additions & 5 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace Rector\Tests\DeadCode\Rector\ClassMethod\RemoveReturnTagIncompatibleWithNativeTypeRector\Fixture;
4+
5+
use Rector\Tests\DeadCode\Rector\ClassMethod\RemoveReturnTagIncompatibleWithNativeTypeRector\Source\RouteInterface;
6+
7+
trait SkipThisReturnInTrait
8+
{
9+
/**
10+
* @return $this
11+
*/
12+
public function withVerbs(): RouteInterface
13+
{
14+
return clone $this;
15+
}
16+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Tests\DeadCode\Rector\ClassMethod\RemoveReturnTagIncompatibleWithNativeTypeRector\Source;
6+
7+
interface RouteInterface
8+
{
9+
}

rules/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector.php

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@
1212
use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
1313
use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
1414
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
15+
use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode;
16+
use PHPStan\Reflection\ClassReflection;
17+
use PHPStan\Type\ObjectType;
1518
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
1619
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
1720
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
18-
use Rector\NodeTypeResolver\Node\AttributeKey;
21+
use Rector\PHPStan\ScopeFetcher;
1922
use Rector\Rector\AbstractRector;
2023
use Rector\StaticTypeMapper\StaticTypeMapper;
2124
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
@@ -109,11 +112,20 @@ public function refactor(Node $node): ?Node
109112
return null;
110113
}
111114

112-
if ($this->isClassTypeAlias($node, $returnTagValueNode)) {
115+
$scope = ScopeFetcher::fetch($node);
116+
if ($this->isClassTypeAlias($scope, $returnTagValueNode)) {
113117
return null;
114118
}
115119

116120
$nativeReturnType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($node->returnType);
121+
$classReflection = $scope->getClassReflection();
122+
if ($classReflection instanceof ClassReflection && $classReflection->isTrait()
123+
&& $returnTagValueNode->type instanceof ThisTypeNode
124+
&& $nativeReturnType instanceof ObjectType
125+
) {
126+
return null;
127+
}
128+
117129
if ($this->isReturnTemplate($phpDocInfo, $returnTagValueNode)) {
118130
return null;
119131
}
@@ -134,10 +146,9 @@ public function refactor(Node $node): ?Node
134146
return $node;
135147
}
136148

137-
private function isClassTypeAlias(Node $node, ReturnTagValueNode $returnTagValueNode): bool
149+
private function isClassTypeAlias(Scope $scope, ReturnTagValueNode $returnTagValueNode): bool
138150
{
139-
$scope = $node->getAttribute(AttributeKey::SCOPE);
140-
if (! $scope instanceof Scope || ! $scope->isInClass()) {
151+
if (! $scope->isInClass()) {
141152
return false;
142153
}
143154

0 commit comments

Comments
 (0)