Skip to content

Commit 2bcf401

Browse files
committed
Fixed "TypeHintDeclarationSniff incorrectly reports about missing typehint when parameter docBlock contains union of two types, one is traversable and the second one does not specify the traversable type"
1 parent eb43ba0 commit 2bcf401

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

SlevomatCodingStandard/Sniffs/TypeHints/TypeHintDeclarationSniff.php

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,20 @@ private function checkParametersTypeHints(\PHP_CodeSniffer_File $phpcsFile, int
192192
}
193193
} elseif ($this->definitionContainsTraversableTypeHint($phpcsFile, $functionPointer, $parameterTypeHintDefinition)) {
194194
$parameterTypeHintDefinitionParts = explode('|', $parameterTypeHintDefinition);
195-
$possibleParameterTypeHint = $this->isTraversableTypeHint(TypeHintHelper::getFullyQualifiedTypeHint($phpcsFile, $functionPointer, $parameterTypeHintDefinitionParts[0])) ? $parameterTypeHintDefinitionParts[0] : $parameterTypeHintDefinitionParts[1];
196195
$nullableParameterTypeHint = false;
196+
197+
if ($this->isTraversableTypeHint(TypeHintHelper::getFullyQualifiedTypeHint($phpcsFile, $functionPointer, $parameterTypeHintDefinitionParts[0]))) {
198+
$possibleParameterTypeHint = $parameterTypeHintDefinitionParts[0];
199+
$itemsTypeHintDefinition = $parameterTypeHintDefinitionParts[1];
200+
} else {
201+
$possibleParameterTypeHint = $parameterTypeHintDefinitionParts[1];
202+
$itemsTypeHintDefinition = $parameterTypeHintDefinitionParts[0];
203+
}
204+
205+
if (!$this->definitionContainsTraversableTypeHintSpeficication($itemsTypeHintDefinition)) {
206+
return;
207+
}
208+
197209
} else {
198210
return;
199211
}
@@ -398,8 +410,20 @@ private function checkReturnTypeHints(\PHP_CodeSniffer_File $phpcsFile, int $fun
398410
}
399411
} elseif ($this->definitionContainsTraversableTypeHint($phpcsFile, $functionPointer, $returnTypeHintDefinition)) {
400412
$returnTypeHintDefinitionParts = explode('|', $returnTypeHintDefinition);
401-
$possibleReturnTypeHint = $this->isTraversableTypeHint(TypeHintHelper::getFullyQualifiedTypeHint($phpcsFile, $functionPointer, $returnTypeHintDefinitionParts[0])) ? $returnTypeHintDefinitionParts[0] : $returnTypeHintDefinitionParts[1];
402413
$nullableReturnTypeHint = false;
414+
415+
if ($this->isTraversableTypeHint(TypeHintHelper::getFullyQualifiedTypeHint($phpcsFile, $functionPointer, $returnTypeHintDefinitionParts[0]))) {
416+
$possibleReturnTypeHint = $returnTypeHintDefinitionParts[0];
417+
$itemsTypeHintDefinition = $returnTypeHintDefinitionParts[1];
418+
} else {
419+
$possibleReturnTypeHint = $returnTypeHintDefinitionParts[1];
420+
$itemsTypeHintDefinition = $returnTypeHintDefinitionParts[0];
421+
}
422+
423+
if (!$this->definitionContainsTraversableTypeHintSpeficication($itemsTypeHintDefinition)) {
424+
return;
425+
}
426+
403427
} else {
404428
return;
405429
}

tests/Sniffs/TypeHints/data/typeHintDeclarationNoErrors.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,4 +554,21 @@ private function nullableMultidimensionalArrayParameter($a)
554554
*/
555555
abstract public function invalidAnnotations();
556556

557+
/**
558+
* @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingTraversableParameterTypeHintSpecification
559+
* @param string|array $a
560+
*/
561+
public function mixedContainingTraversable($a)
562+
{
563+
}
564+
565+
/**
566+
* @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingTraversableReturnTypeHintSpecification
567+
* @return string|array
568+
*/
569+
public function returnsMixedContainingTraversable()
570+
{
571+
return [];
572+
}
573+
557574
}

0 commit comments

Comments
 (0)