From 4dfd6df447cf46e6367140414954b94c6d8c344b Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Tue, 20 Apr 2021 21:50:10 +0200 Subject: [PATCH] [TypeDeclaration] Skip exception on void (#6182) --- .../Fixture/skip_exception.php.inc | 11 +++++++++++ .../AddVoidReturnTypeWhereNoReturnRector.php | 7 ++----- .../TypeInferer/SilentVoidResolver.php | 13 +++++++++++++ 3 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 rules-tests/TypeDeclaration/Rector/ClassMethod/AddVoidReturnTypeWhereNoReturnRector/Fixture/skip_exception.php.inc diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/AddVoidReturnTypeWhereNoReturnRector/Fixture/skip_exception.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddVoidReturnTypeWhereNoReturnRector/Fixture/skip_exception.php.inc new file mode 100644 index 00000000000..d097e39c298 --- /dev/null +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddVoidReturnTypeWhereNoReturnRector/Fixture/skip_exception.php.inc @@ -0,0 +1,11 @@ +phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::SCALAR_TYPES)) { + if (! $this->isAtLeastPhpVersion(PhpVersionFeature::VOID_TYPE)) { return null; } @@ -90,10 +90,7 @@ CODE_SAMPLE return null; } - if ($this->isAtLeastPhpVersion(PhpVersionFeature::VOID_TYPE)) { - $node->returnType = new Identifier('void'); - } - + $node->returnType = new Identifier('void'); return $node; } } diff --git a/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php b/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php index 4092beed200..44893858a10 100644 --- a/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php +++ b/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php @@ -41,6 +41,10 @@ final class SilentVoidResolver return false; } + if ($this->hasNeverType($functionLike)) { + return false; + } + if ($this->betterNodeFinder->hasInstancesOf((array) $functionLike->stmts, [Yield_::class])) { return false; } @@ -133,4 +137,13 @@ final class SilentVoidResolver return true; } + + /** + * @see https://phpstan.org/writing-php-code/phpdoc-types#bottom-type + * @param ClassMethod|Closure|Function_ $functionLike + */ + private function hasNeverType(FunctionLike $functionLike): bool + { + return $this->betterNodeFinder->hasInstancesOf($functionLike, [Throw_::class]); + } }