Skip to content

Commit 1e6ced6

Browse files
authored
avoid using array in nested doc type, used array<mixed> (#7360)
1 parent e220b9f commit 1e6ced6

File tree

6 files changed

+61
-10
lines changed

6 files changed

+61
-10
lines changed
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/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,7 @@ public function resolveTypesFromCalls(array $calls): array
7676
continue;
7777
}
7878

79-
if ($arg->name instanceof Identifier) {
80-
$positionOrName = $arg->name->toString();
81-
} else {
82-
$positionOrName = $position;
83-
}
79+
$positionOrName = $arg->name instanceof Identifier ? $arg->name->toString() : $position;
8480

8581
$staticTypesByArgumentPosition[$positionOrName][] = $this->resolveArgValueType($arg);
8682
}

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: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ public function refactor(Node $node): ?Node
108108
$hasChanged = false;
109109

110110
$dataProviderClassMethods = $this->dataProviderMethodsFinder->findDataProviderNodesInClass($node);
111-
112111
if ($dataProviderClassMethods === []) {
113112
return null;
114113
}

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: 8 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,10 @@ 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 && ($type->getItemType() instanceof MixedType && $type->getKeyType() instanceof MixedType)) {
42+
return new ArrayType(new MixedType(), new MixedType(true));
43+
}
44+
3945
if (! $type instanceof ObjectType) {
4046
return $traverse($type);
4147
}
@@ -52,10 +58,10 @@ public function mapToPHPStanPhpDocTypeNode(Type $type): TypeNode
5258
}
5359

5460
if ($type instanceof GenericObjectType) {
55-
return $traverse(new GenericObjectType('\\' . $type->getClassName(), $type->getTypes()));
61+
return $traverse(new GenericObjectType('\\' . $type->getClassName(), $type->getTypes()), $traverse);
5662
}
5763

58-
return $traverse($type);
64+
return $traverse($type, $traverse);
5965
});
6066

6167
return $type->toPhpDocNode();

0 commit comments

Comments
 (0)