From 4607562c9d217a1026c9effde4fc78065571fd19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaroslav=20Hansl=C3=ADk?= Date: Fri, 9 Jul 2021 11:05:28 +0200 Subject: [PATCH] ReturnTypeHintSniff: It knows unofficial "void" type hints --- SlevomatCodingStandard/Helpers/TypeHintHelper.php | 7 ++++++- .../Sniffs/TypeHints/ReturnTypeHintSniff.php | 6 ++++-- tests/Sniffs/TypeHints/ReturnTypeHintSniffTest.php | 3 ++- tests/Sniffs/TypeHints/data/returnTypeHintErrors.fixed.php | 7 +++++++ tests/Sniffs/TypeHints/data/returnTypeHintErrors.php | 7 +++++++ 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/SlevomatCodingStandard/Helpers/TypeHintHelper.php b/SlevomatCodingStandard/Helpers/TypeHintHelper.php index c8f76f2f8..21aa4d88f 100644 --- a/SlevomatCodingStandard/Helpers/TypeHintHelper.php +++ b/SlevomatCodingStandard/Helpers/TypeHintHelper.php @@ -76,6 +76,11 @@ public static function isUnofficialUnionTypeHint(string $typeHint): bool return in_array($typeHint, ['scalar', 'numeric'], true); } + public static function isVoidTypeHint(string $typeHint): bool + { + return in_array($typeHint, ['void', 'never', 'never-return', 'never-returns', 'no-return'], true); + } + /** * @param string $typeHint * @return string[] @@ -358,7 +363,7 @@ private static function normalize(string $typeHint): string if (count($convertedParts) > 1) { $convertedParts = array_map(static function (string $part): string { - return $part === 'void' ? 'null' : $part; + return TypeHintHelper::isVoidTypeHint($part) ? 'null' : $part; }, $convertedParts); } diff --git a/SlevomatCodingStandard/Sniffs/TypeHints/ReturnTypeHintSniff.php b/SlevomatCodingStandard/Sniffs/TypeHints/ReturnTypeHintSniff.php index d51fcd25a..f57a60943 100644 --- a/SlevomatCodingStandard/Sniffs/TypeHints/ReturnTypeHintSniff.php +++ b/SlevomatCodingStandard/Sniffs/TypeHints/ReturnTypeHintSniff.php @@ -164,7 +164,9 @@ private function checkFunctionTypeHint( $hasReturnAnnotation = $this->hasReturnAnnotation($returnAnnotation); $returnTypeNode = $this->getReturnTypeNode($returnAnnotation); - $isAnnotationReturnTypeVoid = $returnTypeNode instanceof IdentifierTypeNode && strtolower($returnTypeNode->name) === 'void'; + $isAnnotationReturnTypeVoid = $returnTypeNode instanceof IdentifierTypeNode && TypeHintHelper::isVoidTypeHint( + strtolower($returnTypeNode->name) + ); $isAbstract = FunctionHelper::isAbstract($phpcsFile, $functionPointer); $returnsValue = $isAbstract ? ($hasReturnAnnotation && !$isAnnotationReturnTypeVoid) @@ -353,7 +355,7 @@ private function checkFunctionTypeHint( return; } - $typeHintsWithConvertedUnion[$typeHintNo] = $typeHint === 'void' + $typeHintsWithConvertedUnion[$typeHintNo] = TypeHintHelper::isVoidTypeHint($typeHint) ? 'null' : TypeHintHelper::convertLongSimpleTypeHintToShort($typeHint); } diff --git a/tests/Sniffs/TypeHints/ReturnTypeHintSniffTest.php b/tests/Sniffs/TypeHints/ReturnTypeHintSniffTest.php index ec96c472f..00067b449 100644 --- a/tests/Sniffs/TypeHints/ReturnTypeHintSniffTest.php +++ b/tests/Sniffs/TypeHints/ReturnTypeHintSniffTest.php @@ -27,7 +27,7 @@ public function testErrors(): void 'traversableTypeHints' => ['Traversable', '\ArrayIterator'], ]); - self::assertSame(49, $report->getErrorCount()); + self::assertSame(50, $report->getErrorCount()); self::assertSniffError($report, 6, ReturnTypeHintSniff::CODE_MISSING_ANY_TYPE_HINT); self::assertSniffError($report, 14, ReturnTypeHintSniff::CODE_MISSING_NATIVE_TYPE_HINT); @@ -82,6 +82,7 @@ public function testErrors(): void self::assertSniffError($report, 298, ReturnTypeHintSniff::CODE_USELESS_SUPPRESS); self::assertSniffError($report, 305, ReturnTypeHintSniff::CODE_MISSING_NATIVE_TYPE_HINT); + self::assertSniffError($report, 313, ReturnTypeHintSniff::CODE_MISSING_NATIVE_TYPE_HINT); self::assertAllFixedInFile($report); } diff --git a/tests/Sniffs/TypeHints/data/returnTypeHintErrors.fixed.php b/tests/Sniffs/TypeHints/data/returnTypeHintErrors.fixed.php index a993adb95..ccd7d0bdf 100644 --- a/tests/Sniffs/TypeHints/data/returnTypeHintErrors.fixed.php +++ b/tests/Sniffs/TypeHints/data/returnTypeHintErrors.fixed.php @@ -297,4 +297,11 @@ public function voidButReturnsValue() return true; } + /** + * @return no-return + */ + public function noReturnTypeHint(): void + { + } + } diff --git a/tests/Sniffs/TypeHints/data/returnTypeHintErrors.php b/tests/Sniffs/TypeHints/data/returnTypeHintErrors.php index e995da3ec..b31c03b7c 100644 --- a/tests/Sniffs/TypeHints/data/returnTypeHintErrors.php +++ b/tests/Sniffs/TypeHints/data/returnTypeHintErrors.php @@ -307,4 +307,11 @@ public function voidButReturnsValue() return true; } + /** + * @return no-return + */ + public function noReturnTypeHint() + { + } + }