Skip to content

Commit 395e835

Browse files
committed
avoid using array in nested doc type, used array<mixed>
1 parent 966cfd9 commit 395e835

5 files changed

Lines changed: 63 additions & 5 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\Class_\AddReturnDocblockDataProviderRector\Fixture;
4+
5+
use PHPUnit\Framework\Attributes\DataProvider;
6+
use PHPUnit\Framework\TestCase;
7+
8+
final class NestedArrayIsMixed extends TestCase
9+
{
10+
#[DataProvider('provideData')]
11+
public function testSomething()
12+
{
13+
}
14+
15+
public static function provideData(): \Generator
16+
{
17+
yield [[]];
18+
yield [[1, 2, 3, 4]];
19+
}
20+
}
21+
22+
?>
23+
-----
24+
<?php
25+
26+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\Class_\AddReturnDocblockDataProviderRector\Fixture;
27+
28+
use PHPUnit\Framework\Attributes\DataProvider;
29+
use PHPUnit\Framework\TestCase;
30+
31+
final class NestedArrayIsMixed extends TestCase
32+
{
33+
#[DataProvider('provideData')]
34+
public function testSomething()
35+
{
36+
}
37+
38+
/**
39+
* @return \Generator<array<int, array<mixed>>>
40+
*/
41+
public static function provideData(): \Generator
42+
{
43+
yield [[]];
44+
yield [[1, 2, 3, 4]];
45+
}
46+
}
47+
48+
?>

rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,13 @@ public function decorateGenericIterableReturnType(
6262
PhpDocInfo $classMethodPhpDocInfo,
6363
ClassMethod $classMethod
6464
): bool {
65-
$typeNode = $this->createTypeNode($type);
66-
6765
if ($this->isBareMixedType($type)) {
6866
// no value
6967
return false;
7068
}
7169

70+
$typeNode = $this->createTypeNode($type);
71+
7272
// no value iterable type
7373
if ($typeNode instanceof IdentifierTypeNode) {
7474
return false;

rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use PhpParser\Node\Stmt\Class_;
1010
use PhpParser\Node\Stmt\Return_;
1111
use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
12+
use PHPStan\Type\Type;
1213
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
1314
use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer;
1415
use Rector\Rector\AbstractRector;
@@ -108,7 +109,6 @@ public function refactor(Node $node): ?Node
108109
$hasChanged = false;
109110

110111
$dataProviderClassMethods = $this->dataProviderMethodsFinder->findDataProviderNodesInClass($node);
111-
112112
if ($dataProviderClassMethods === []) {
113113
return null;
114114
}

src/PHPStanStaticTypeMapper/TypeMapper/ArrayTypeMapper.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public function mapToPHPStanPhpDocTypeNode(Type $type): TypeNode
7575
}
7676

7777
if ($itemType instanceof ArrayType && $this->isGenericArrayCandidate($itemType)) {
78+
7879
return $this->createGenericArrayType($type, true);
7980
}
8081

@@ -182,6 +183,7 @@ private function createGenericArrayType(ArrayType $arrayType, bool $withKey = fa
182183
}
183184

184185
$identifierTypeNode->setAttribute(self::HAS_GENERIC_TYPE_PARENT, $withKey);
186+
185187
return new GenericTypeNode($identifierTypeNode, $genericTypes);
186188
}
187189

src/PHPStanStaticTypeMapper/TypeMapper/ObjectTypeMapper.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
use PhpParser\Node\Name;
1010
use PhpParser\Node\Name\FullyQualified;
1111
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
12+
use PHPStan\Type\ArrayType;
1213
use PHPStan\Type\Generic\GenericObjectType;
14+
use PHPStan\Type\MixedType;
1315
use PHPStan\Type\ObjectType;
1416
use PHPStan\Type\Type;
1517
use PHPStan\Type\TypeTraverser;
@@ -36,6 +38,12 @@ public function getNodeClass(): string
3638
public function mapToPHPStanPhpDocTypeNode(Type $type): TypeNode
3739
{
3840
$type = TypeTraverser::map($type, static function (Type $type, callable $traverse): Type {
41+
if ($type instanceof ArrayType) {
42+
if ($type->getItemType() instanceof MixedType && $type->getKeyType() instanceof MixedType) {
43+
return new ArrayType(new MixedType(), new MixedType(true));
44+
}
45+
}
46+
3947
if (! $type instanceof ObjectType) {
4048
return $traverse($type);
4149
}
@@ -52,10 +60,10 @@ public function mapToPHPStanPhpDocTypeNode(Type $type): TypeNode
5260
}
5361

5462
if ($type instanceof GenericObjectType) {
55-
return $traverse(new GenericObjectType('\\' . $type->getClassName(), $type->getTypes()));
63+
return $traverse(new GenericObjectType('\\' . $type->getClassName(), $type->getTypes()), $traverse);
5664
}
5765

58-
return $traverse($type);
66+
return $traverse($type, $traverse);
5967
});
6068

6169
return $type->toPhpDocNode();

0 commit comments

Comments
 (0)