Skip to content

Commit 68117dc

Browse files
committed
change existing dummy array
1 parent 7d9853f commit 68117dc

File tree

3 files changed

+50
-13
lines changed

3 files changed

+50
-13
lines changed

rules/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector.php

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
use PhpParser\Node\Stmt\ClassMethod;
1010
use PhpParser\Node\Stmt\Function_;
1111
use PhpParser\Node\Stmt\Return_;
12-
use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
1312
use PHPStan\Type\Constant\ConstantArrayType;
1413
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
15-
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
14+
use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger;
1615
use Rector\Rector\AbstractRector;
1716
use Rector\TypeDeclarationDocblocks\NodeFinder\ReturnNodeFinder;
17+
use Rector\TypeDeclarationDocblocks\TagNodeAnalyzer\UsefulArrayTagNodeAnalyzer;
1818
use Rector\TypeDeclarationDocblocks\TypeResolver\ConstantArrayTypeGeneralizer;
1919
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
2020
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@@ -26,9 +26,10 @@ final class DocblockReturnArrayFromDirectArrayInstanceRector extends AbstractRec
2626
{
2727
public function __construct(
2828
private readonly PhpDocInfoFactory $phpDocInfoFactory,
29-
private readonly DocBlockUpdater $docBlockUpdater,
29+
private readonly PhpDocTypeChanger $phpDocTypeChanger,
3030
private readonly ConstantArrayTypeGeneralizer $constantArrayTypeGeneralizer,
3131
private readonly ReturnNodeFinder $returnNodeFinder,
32+
private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer
3233
) {
3334
}
3435

@@ -80,14 +81,13 @@ public function getItems(): array
8081
*/
8182
public function refactor(Node $node): ?Node
8283
{
83-
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node);
84-
85-
// return tag is already given
86-
if ($phpDocInfo->getReturnTagValue() instanceof ReturnTagValueNode) {
84+
if ($node->stmts === null) {
8785
return null;
8886
}
8987

90-
if ($node->stmts === null) {
88+
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node);
89+
90+
if ($this->usefulArrayTagNodeAnalyzer->isUsefulArrayTag($phpDocInfo->getReturnTagValue())) {
9191
return null;
9292
}
9393

@@ -107,11 +107,7 @@ public function refactor(Node $node): ?Node
107107
}
108108

109109
$genericTypeNode = $this->constantArrayTypeGeneralizer->generalize($returnedType);
110-
111-
$returnTagValueNode = new ReturnTagValueNode($genericTypeNode, '');
112-
$phpDocInfo->addTagValueNode($returnTagValueNode);
113-
114-
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node);
110+
$this->phpDocTypeChanger->changeReturnTypeNode($node, $phpDocInfo, $genericTypeNode);
115111

116112
return $node;
117113
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\TypeDeclarationDocblocks\TagNodeAnalyzer;
6+
7+
use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
8+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
9+
10+
final class UsefulArrayTagNodeAnalyzer
11+
{
12+
public function isUsefulArrayTag(?ReturnTagValueNode $returnTagValueNode): bool
13+
{
14+
if (! $returnTagValueNode instanceof ReturnTagValueNode) {
15+
return false;
16+
}
17+
18+
$type = $returnTagValueNode->type;
19+
if (! $type instanceof IdentifierTypeNode) {
20+
return true;
21+
}
22+
23+
return $type->name !== 'array';
24+
}
25+
}

src/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,22 @@ public function changeVarType(Stmt $stmt, PhpDocInfo $phpDocInfo, Type $newType)
9797
return true;
9898
}
9999

100+
public function changeReturnTypeNode(
101+
FunctionLike $functionLike,
102+
PhpDocInfo $phpDocInfo,
103+
TypeNode $newTypeNode
104+
): void {
105+
$existingReturnTagValueNode = $phpDocInfo->getReturnTagValue();
106+
if ($existingReturnTagValueNode instanceof ReturnTagValueNode) {
107+
$existingReturnTagValueNode->type = $newTypeNode;
108+
} else {
109+
$returnTagValueNode = new ReturnTagValueNode($newTypeNode, '');
110+
$phpDocInfo->addTagValueNode($returnTagValueNode);
111+
}
112+
113+
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($functionLike);
114+
}
115+
100116
public function changeReturnType(FunctionLike $functionLike, PhpDocInfo $phpDocInfo, Type $newType): bool
101117
{
102118
// better not touch this, can crash

0 commit comments

Comments
 (0)