Skip to content

Commit 35446d2

Browse files
committed
Support for array shapes
1 parent 53d78a9 commit 35446d2

31 files changed

+317
-21
lines changed

SlevomatCodingStandard/Helpers/Annotation/ParameterAnnotation.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,15 @@ public function getParameterName(): string
7373
}
7474

7575
/**
76-
* @return \PHPStan\PhpDocParser\Ast\Type\GenericTypeNode|\PHPStan\PhpDocParser\Ast\Type\CallableTypeNode|\PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode|\PHPStan\PhpDocParser\Ast\Type\UnionTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode
76+
* @return \PHPStan\PhpDocParser\Ast\Type\GenericTypeNode|\PHPStan\PhpDocParser\Ast\Type\CallableTypeNode|\PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode|\PHPStan\PhpDocParser\Ast\Type\UnionTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode
7777
*/
7878
public function getType(): TypeNode
7979
{
8080
if ($this->isInvalid()) {
8181
throw new LogicException(sprintf('Invalid %s annotation.', $this->name));
8282
}
8383

84-
/** @var \PHPStan\PhpDocParser\Ast\Type\GenericTypeNode|\PHPStan\PhpDocParser\Ast\Type\CallableTypeNode|\PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode|\PHPStan\PhpDocParser\Ast\Type\UnionTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode $type */
84+
/** @var \PHPStan\PhpDocParser\Ast\Type\GenericTypeNode|\PHPStan\PhpDocParser\Ast\Type\CallableTypeNode|\PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode|\PHPStan\PhpDocParser\Ast\Type\UnionTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode $type */
8585
$type = $this->contentNode->type;
8686
return $type;
8787
}

SlevomatCodingStandard/Helpers/Annotation/ReturnAnnotation.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,15 @@ public function getDescription(): ?string
6464
}
6565

6666
/**
67-
* @return \PHPStan\PhpDocParser\Ast\Type\GenericTypeNode|\PHPStan\PhpDocParser\Ast\Type\CallableTypeNode|\PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode|\PHPStan\PhpDocParser\Ast\Type\UnionTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode
67+
* @return \PHPStan\PhpDocParser\Ast\Type\GenericTypeNode|\PHPStan\PhpDocParser\Ast\Type\CallableTypeNode|\PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode|\PHPStan\PhpDocParser\Ast\Type\UnionTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode
6868
*/
6969
public function getType(): TypeNode
7070
{
7171
if ($this->isInvalid()) {
7272
throw new LogicException(sprintf('Invalid %s annotation.', $this->name));
7373
}
7474

75-
/** @var \PHPStan\PhpDocParser\Ast\Type\GenericTypeNode|\PHPStan\PhpDocParser\Ast\Type\CallableTypeNode|\PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode|\PHPStan\PhpDocParser\Ast\Type\UnionTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode $type */
75+
/** @var \PHPStan\PhpDocParser\Ast\Type\GenericTypeNode|\PHPStan\PhpDocParser\Ast\Type\CallableTypeNode|\PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode|\PHPStan\PhpDocParser\Ast\Type\UnionTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode $type */
7676
$type = $this->contentNode->type;
7777
return $type;
7878
}

SlevomatCodingStandard/Helpers/AnnotationTypeHelper.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
namespace SlevomatCodingStandard\Helpers;
44

5+
use PHPStan\PhpDocParser\Ast\Type\ArrayShapeItemNode;
6+
use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode;
57
use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode;
68
use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode;
79
use PHPStan\PhpDocParser\Ast\Type\CallableTypeParameterNode;
810
use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
11+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
912
use PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode;
1013
use PHPStan\PhpDocParser\Ast\Type\NullableTypeNode;
1114
use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode;
@@ -31,6 +34,18 @@ public static function getIdentifierTypeNodes(TypeNode $typeNode): array
3134
return self::getIdentifierTypeNodes($typeNode->type);
3235
}
3336

37+
if ($typeNode instanceof ArrayShapeNode) {
38+
$identifierTypeNodes = [];
39+
foreach ($typeNode->items as $arrayShapeItemNode) {
40+
if ($arrayShapeItemNode->keyName instanceof IdentifierTypeNode) {
41+
$identifierTypeNodes[] = $arrayShapeItemNode->keyName;
42+
}
43+
44+
$identifierTypeNodes = array_merge($identifierTypeNodes, self::getIdentifierTypeNodes($arrayShapeItemNode->valueType));
45+
}
46+
return $identifierTypeNodes;
47+
}
48+
3449
if (
3550
$typeNode instanceof UnionTypeNode
3651
|| $typeNode instanceof IntersectionTypeNode
@@ -85,6 +100,14 @@ public static function getUnionTypeNodes(TypeNode $typeNode): array
85100
return self::getUnionTypeNodes($typeNode->type);
86101
}
87102

103+
if ($typeNode instanceof ArrayShapeNode) {
104+
$unionTypeNodes = [];
105+
foreach ($typeNode->items as $arrayShapeItemNode) {
106+
$unionTypeNodes = array_merge($unionTypeNodes, self::getUnionTypeNodes($arrayShapeItemNode->valueType));
107+
}
108+
return $unionTypeNodes;
109+
}
110+
88111
if ($typeNode instanceof IntersectionTypeNode) {
89112
$unionTypeNodes = [];
90113
foreach ($typeNode->types as $innerTypeNode) {
@@ -122,6 +145,14 @@ public static function getArrayTypeNodes(TypeNode $typeNode): array
122145
return array_merge([$typeNode], self::getArrayTypeNodes($typeNode->type));
123146
}
124147

148+
if ($typeNode instanceof ArrayShapeNode) {
149+
$arrayTypeNodes = [];
150+
foreach ($typeNode->items as $arrayShapeItemNode) {
151+
$arrayTypeNodes = array_merge($arrayTypeNodes, self::getArrayTypeNodes($arrayShapeItemNode->valueType));
152+
}
153+
return $arrayTypeNodes;
154+
}
155+
125156
if ($typeNode instanceof NullableTypeNode) {
126157
return self::getArrayTypeNodes($typeNode->type);
127158
}
@@ -220,6 +251,24 @@ public static function change(TypeNode $masterTypeNode, TypeNode $typeNodeToChan
220251
return new ArrayTypeNode(self::change($masterTypeNode->type, $typeNodeToChange, $changedTypeNode));
221252
}
222253

254+
if ($masterTypeNode instanceof ArrayShapeNode) {
255+
$arrayShapeItemNodes = [];
256+
foreach ($masterTypeNode->items as $arrayShapeItemNode) {
257+
$arrayShapeItemNodes[] = self::change($arrayShapeItemNode, $typeNodeToChange, $changedTypeNode);
258+
}
259+
260+
return new ArrayShapeNode($arrayShapeItemNodes);
261+
}
262+
263+
if ($masterTypeNode instanceof ArrayShapeItemNode) {
264+
/** @var \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|null $keyName */
265+
$keyName = $masterTypeNode->keyName instanceof IdentifierTypeNode
266+
? self::change($masterTypeNode->keyName, $typeNodeToChange, $changedTypeNode)
267+
: $masterTypeNode->keyName;
268+
269+
return new ArrayShapeItemNode($keyName, $masterTypeNode->optional, self::change($masterTypeNode->valueType, $typeNodeToChange, $changedTypeNode));
270+
}
271+
223272
if ($masterTypeNode instanceof NullableTypeNode) {
224273
return new NullableTypeNode(self::change($masterTypeNode->type, $typeNodeToChange, $changedTypeNode));
225274
}

SlevomatCodingStandard/Sniffs/TypeHints/TypeHintDeclarationSniff.php

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use PHP_CodeSniffer\Files\File;
66
use PHP_CodeSniffer\Sniffs\Sniff;
7+
use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode;
78
use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode;
89
use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode;
910
use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
@@ -210,9 +211,11 @@ private function checkParametersTypeHints(File $phpcsFile, int $functionPointer)
210211
}
211212

212213
if ($annotationContainsOneType) {
213-
/** @var \PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode|\PHPStan\PhpDocParser\Ast\Type\GenericTypeNode $parameterTypeNode */
214+
/** @var \PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode|\PHPStan\PhpDocParser\Ast\Type\GenericTypeNode $parameterTypeNode */
214215
$parameterTypeNode = $parameterTypeNode;
215-
$possibleParameterTypeHint = $parameterTypeNode instanceof ArrayTypeNode ? 'array' : $this->getTypeHintFromOneType($parameterTypeNode);
216+
$possibleParameterTypeHint = $parameterTypeNode instanceof ArrayTypeNode || $parameterTypeNode instanceof ArrayShapeNode
217+
? 'array'
218+
: $this->getTypeHintFromOneType($parameterTypeNode);
216219
$nullableParameterTypeHint = false;
217220

218221
} else {
@@ -227,9 +230,11 @@ private function checkParametersTypeHints(File $phpcsFile, int $functionPointer)
227230
}
228231

229232
if ($this->annotationTypeContainsNullType($parameterTypeNode)) {
230-
/** @var \PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode|\PHPStan\PhpDocParser\Ast\Type\GenericTypeNode $notNullTypeHintNode */
233+
/** @var \PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode|\PHPStan\PhpDocParser\Ast\Type\GenericTypeNode $notNullTypeHintNode */
231234
$notNullTypeHintNode = $this->getTypeFromNullableType($parameterTypeNode);
232-
$possibleParameterTypeHint = $notNullTypeHintNode instanceof ArrayTypeNode ? 'array' : $this->getTypeHintFromOneType($notNullTypeHintNode);
235+
$possibleParameterTypeHint = $notNullTypeHintNode instanceof ArrayTypeNode || $notNullTypeHintNode instanceof ArrayShapeNode
236+
? 'array'
237+
: $this->getTypeHintFromOneType($notNullTypeHintNode);
233238
$nullableParameterTypeHint = true;
234239
} else {
235240

@@ -439,9 +444,11 @@ private function checkReturnTypeHints(File $phpcsFile, int $functionPointer): vo
439444
}
440445

441446
if ($annotationContainsOneType) {
442-
/** @var \PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\GenericTypeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode $returnTypeNode */
447+
/** @var \PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode|\PHPStan\PhpDocParser\Ast\Type\GenericTypeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode $returnTypeNode */
443448
$returnTypeNode = $returnTypeNode;
444-
$possibleReturnTypeHint = $returnTypeNode instanceof ArrayTypeNode ? 'array' : $this->getTypeHintFromOneType($returnTypeNode);
449+
$possibleReturnTypeHint = $returnTypeNode instanceof ArrayTypeNode || $returnTypeNode instanceof ArrayShapeNode
450+
? 'array'
451+
: $this->getTypeHintFromOneType($returnTypeNode);
445452
$nullableReturnTypeHint = false;
446453

447454
} else {
@@ -456,9 +463,11 @@ private function checkReturnTypeHints(File $phpcsFile, int $functionPointer): vo
456463
}
457464

458465
if ($this->annotationTypeContainsNullType($returnTypeNode)) {
459-
/** @var \PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode|\PHPStan\PhpDocParser\Ast\Type\GenericTypeNode $notNullTypeHintNode */
466+
/** @var \PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode|\PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode|\PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode|\PHPStan\PhpDocParser\Ast\Type\ThisTypeNode|\PHPStan\PhpDocParser\Ast\Type\GenericTypeNode $notNullTypeHintNode */
460467
$notNullTypeHintNode = $this->getTypeFromNullableType($returnTypeNode);
461-
$possibleReturnTypeHint = $notNullTypeHintNode instanceof ArrayTypeNode ? 'array' : $this->getTypeHintFromOneType($notNullTypeHintNode);
468+
$possibleReturnTypeHint = $notNullTypeHintNode instanceof ArrayTypeNode || $notNullTypeHintNode instanceof ArrayShapeNode
469+
? 'array'
470+
: $this->getTypeHintFromOneType($notNullTypeHintNode);
462471
$nullableReturnTypeHint = true;
463472
} else {
464473
$itemsSpecificationTypeHint = $this->getItemsSpecificationTypeFromType($returnTypeNode);
@@ -859,6 +868,10 @@ private function annotationContainsOneType(TypeNode $typeNode): bool
859868
return true;
860869
}
861870

871+
if ($typeNode instanceof ArrayShapeNode) {
872+
return true;
873+
}
874+
862875
return $typeNode instanceof ArrayTypeNode;
863876
}
864877

@@ -891,6 +904,10 @@ private function annotationContainsTraversableType(File $phpcsFile, int $pointer
891904
return true;
892905
}
893906

907+
if ($typeNode instanceof ArrayShapeNode) {
908+
return true;
909+
}
910+
894911
if ($typeNode instanceof ArrayTypeNode) {
895912
return true;
896913
}
@@ -926,6 +943,16 @@ private function annotationContainsItemsSpecificationForTraversable(File $phpcsF
926943
return true;
927944
}
928945

946+
if ($typeNode instanceof ArrayShapeNode) {
947+
foreach ($typeNode->items as $arrayShapeItemNode) {
948+
if (!$this->annotationContainsItemsSpecificationForTraversable($phpcsFile, $pointer, $arrayShapeItemNode->valueType, true)) {
949+
return false;
950+
}
951+
}
952+
953+
return true;
954+
}
955+
929956
if ($typeNode instanceof IdentifierTypeNode) {
930957
if (!$inTraversable) {
931958
return false;

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
},
1111
"require": {
1212
"php": "^7.2",
13-
"phpstan/phpdoc-parser": "0.3.1 - 0.3.4",
13+
"phpstan/phpdoc-parser": "0.3.5",
1414
"squizlabs/php_codesniffer": "^3.4.1"
1515
},
1616
"require-dev": {

tests/Sniffs/Namespaces/FullyQualifiedClassNameInAnnotationSniffTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public function testErrors(): void
1616
{
1717
$report = self::checkFile(__DIR__ . '/data/fullyQualifiedClassNameInAnnotationErrors.php');
1818

19-
self::assertSame(47, $report->getErrorCount());
19+
self::assertSame(49, $report->getErrorCount());
2020

2121
self::assertSniffError($report, 16, FullyQualifiedClassNameInAnnotationSniff::CODE_NON_FULLY_QUALIFIED_CLASS_NAME, 'Class name \XXX\PropertySameNamespace in @var should be referenced via a fully qualified name');
2222
self::assertSniffError($report, 19, FullyQualifiedClassNameInAnnotationSniff::CODE_NON_FULLY_QUALIFIED_CLASS_NAME, 'Class name \YYY\PropertyUsed in @var should be referenced via a fully qualified name');
@@ -67,6 +67,9 @@ public function testErrors(): void
6767
self::assertSniffError($report, 140, FullyQualifiedClassNameInAnnotationSniff::CODE_NON_FULLY_QUALIFIED_CLASS_NAME, 'Class name \Iterator in @return should be referenced via a fully qualified name');
6868
self::assertSniffError($report, 140, FullyQualifiedClassNameInAnnotationSniff::CODE_NON_FULLY_QUALIFIED_CLASS_NAME, 'Class name \Traversable in @return should be referenced via a fully qualified name');
6969

70+
self::assertSniffError($report, 149, FullyQualifiedClassNameInAnnotationSniff::CODE_NON_FULLY_QUALIFIED_CLASS_NAME, 'Class name \Iterator in @var should be referenced via a fully qualified name');
71+
self::assertSniffError($report, 152, FullyQualifiedClassNameInAnnotationSniff::CODE_NON_FULLY_QUALIFIED_CLASS_NAME, 'Class name \Iterator in @var should be referenced via a fully qualified name');
72+
7073
self::assertAllFixedInFile($report);
7174
}
7275

tests/Sniffs/Namespaces/ReferenceUsedNamesOnlySniffTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -882,7 +882,7 @@ public function testSearchingInAnnotations(): void
882882
]
883883
);
884884

885-
self::assertSame(25, $report->getErrorCount());
885+
self::assertSame(27, $report->getErrorCount());
886886

887887
self::assertSniffError($report, 8, ReferenceUsedNamesOnlySniff::CODE_REFERENCE_VIA_FULLY_QUALIFIED_NAME, 'Class \Foo\DateTime should not be referenced via a fully qualified name, but via a use statement.');
888888
self::assertSniffError($report, 9, ReferenceUsedNamesOnlySniff::CODE_REFERENCE_VIA_FULLY_QUALIFIED_NAME, 'Class \Foo\DateTime should not be referenced via a fully qualified name, but via a use statement.');
@@ -912,6 +912,9 @@ public function testSearchingInAnnotations(): void
912912
self::assertSniffError($report, 104, ReferenceUsedNamesOnlySniff::CODE_REFERENCE_VIA_FULLY_QUALIFIED_NAME, 'Class \Foo\ArrayObject should not be referenced via a fully qualified name, but via a use statement.');
913913
self::assertSniffError($report, 104, ReferenceUsedNamesOnlySniff::CODE_REFERENCE_VIA_FULLY_QUALIFIED_NAME, 'Class \Foo\DateTime should not be referenced via a fully qualified name, but via a use statement.');
914914

915+
self::assertSniffError($report, 113, ReferenceUsedNamesOnlySniff::CODE_REFERENCE_VIA_FULLY_QUALIFIED_NAME, 'Class \Foo\DateTime should not be referenced via a fully qualified name, but via a use statement.');
916+
self::assertSniffError($report, 116, ReferenceUsedNamesOnlySniff::CODE_REFERENCE_VIA_FULLY_QUALIFIED_NAME, 'Class \Foo\DateTime should not be referenced via a fully qualified name, but via a use statement.');
917+
915918
self::assertAllFixedInFile($report);
916919
}
917920

tests/Sniffs/Namespaces/UnusedUsesSniffTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public function testUsedUseInAnnotationWithDisabledSearchAnnotations(): void
111111
'searchAnnotations' => false,
112112
]);
113113

114-
self::assertSame(57, $report->getErrorCount());
114+
self::assertSame(59, $report->getErrorCount());
115115

116116
self::assertSniffError($report, 5, UnusedUsesSniff::CODE_UNUSED_USE, 'Type Assert is not used in this file.');
117117
self::assertSniffError($report, 6, UnusedUsesSniff::CODE_UNUSED_USE, 'Type Doctrine\ORM\Mapping (as ORM) is not used in this file.');
@@ -169,6 +169,8 @@ public function testUsedUseInAnnotationWithDisabledSearchAnnotations(): void
169169
self::assertSniffError($report, 59, UnusedUsesSniff::CODE_UNUSED_USE, 'Type Iag14 is not used in this file.');
170170
self::assertSniffError($report, 60, UnusedUsesSniff::CODE_UNUSED_USE, 'Type Callable1 is not used in this file.');
171171
self::assertSniffError($report, 61, UnusedUsesSniff::CODE_UNUSED_USE, 'Type Callable2 is not used in this file.');
172+
self::assertSniffError($report, 62, UnusedUsesSniff::CODE_UNUSED_USE, 'Type ArrayShape1 is not used in this file.');
173+
self::assertSniffError($report, 63, UnusedUsesSniff::CODE_UNUSED_USE, 'Type ArrayShape2 is not used in this file.');
172174
}
173175

174176
public function testUsedUseInAnnotationWithEnabledSearchAnnotations(): void

tests/Sniffs/Namespaces/data/fullyQualifiedClassNameInAnnotationErrors.fixed.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,9 @@ public function returnsCallable()
145145
}
146146

147147
}
148+
149+
/** @var array{int, \Iterator} $arrayShape1 */
150+
$arrayShape1 = [];
151+
152+
/** @var array{\Iterator: int} $arrayShape2 */
153+
$arrayShape2 = [];

tests/Sniffs/Namespaces/data/fullyQualifiedClassNameInAnnotationErrors.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,9 @@ public function returnsCallable()
145145
}
146146

147147
}
148+
149+
/** @var array{int, Iterator} $arrayShape1 */
150+
$arrayShape1 = [];
151+
152+
/** @var array{Iterator: int} $arrayShape2 */
153+
$arrayShape2 = [];

tests/Sniffs/Namespaces/data/shouldBeInUseStatementSearchingInAnnotations.fixed.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,3 +113,9 @@ public function returnsCallable()
113113
}
114114

115115
}
116+
117+
/** @var array{int, DateTime} $arrayShape1 */
118+
$arrayShape1 = [];
119+
120+
/** @var array{DateTime: int} $arrayShape2 */
121+
$arrayShape2 = [];

tests/Sniffs/Namespaces/data/shouldBeInUseStatementSearchingInAnnotations.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,9 @@ public function returnsCallable()
109109
}
110110

111111
}
112+
113+
/** @var array{int, \Foo\DateTime} $arrayShape1 */
114+
$arrayShape1 = [];
115+
116+
/** @var array{\Foo\DateTime: int} $arrayShape2 */
117+
$arrayShape2 = [];

tests/Sniffs/Namespaces/data/unusedUsesInAnnotation.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@
5959
use Iag14;
6060
use Callable1;
6161
use Callable2;
62+
use ArrayShape1;
63+
use ArrayShape2;
6264

6365
/**
6466
* @ORM\Entity()
@@ -218,3 +220,9 @@ public function returnsCallable()
218220
}
219221

220222
}
223+
224+
/** @var array{int, ArrayShape1} $arrayShape1 */
225+
$arrayShape1 = [];
226+
227+
/** @var array{ArrayShape2: int} $arrayShape2 */
228+
$arrayShape2 = [];

tests/Sniffs/TypeHints/DisallowArrayTypeHintSyntaxSniffTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public function testErrors(): void
2121
],
2222
]);
2323

24-
self::assertSame(22, $report->getErrorCount());
24+
self::assertSame(23, $report->getErrorCount());
2525

2626
self::assertSniffError($report, 6, DisallowArrayTypeHintSyntaxSniff::CODE_DISALLOWED_ARRAY_TYPE_HINT_SYNTAX, 'Usage of array type hint syntax in "\DateTimeImmutable[]" is disallowed, use generic type hint syntax instead.');
2727
self::assertSniffError($report, 7, DisallowArrayTypeHintSyntaxSniff::CODE_DISALLOWED_ARRAY_TYPE_HINT_SYNTAX, 'Usage of array type hint syntax in "bool[]" is disallowed, use generic type hint syntax instead.');
@@ -45,6 +45,7 @@ public function testErrors(): void
4545
self::assertSniffError($report, 55, DisallowArrayTypeHintSyntaxSniff::CODE_DISALLOWED_ARRAY_TYPE_HINT_SYNTAX, 'Usage of array type hint syntax in "string[][]" is disallowed, use generic type hint syntax instead.');
4646
self::assertSniffError($report, 60, DisallowArrayTypeHintSyntaxSniff::CODE_DISALLOWED_ARRAY_TYPE_HINT_SYNTAX, 'Usage of array type hint syntax in "string[][]" is disallowed, use generic type hint syntax instead.');
4747
self::assertSniffError($report, 65, DisallowArrayTypeHintSyntaxSniff::CODE_DISALLOWED_ARRAY_TYPE_HINT_SYNTAX, 'Usage of array type hint syntax in "string[][]" is disallowed, use generic type hint syntax instead.');
48+
self::assertSniffError($report, 70, DisallowArrayTypeHintSyntaxSniff::CODE_DISALLOWED_ARRAY_TYPE_HINT_SYNTAX, 'Usage of array type hint syntax in "int[]" is disallowed, use generic type hint syntax instead.');
4849

4950
self::assertAllFixedInFile($report);
5051
}

0 commit comments

Comments
 (0)