From 1b2037c1c8094053f7a97c777a06fc071692d47b Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 9 Sep 2024 15:08:41 +0200 Subject: [PATCH] test `@throws` tag --- .../Operators/InvalidBinaryOperationRule.php | 16 ++++++++++++++++ .../Rules/Operators/data/invalid-division.php | 6 ++++++ 2 files changed, 22 insertions(+) diff --git a/src/Rules/Operators/InvalidBinaryOperationRule.php b/src/Rules/Operators/InvalidBinaryOperationRule.php index d771cfe7000..8e051a2fad5 100644 --- a/src/Rules/Operators/InvalidBinaryOperationRule.php +++ b/src/Rules/Operators/InvalidBinaryOperationRule.php @@ -124,6 +124,7 @@ public function processNode(Node $node, Scope $scope): array || $node instanceof Node\Expr\BinaryOp\Mod ) && !$this->isDivisionByZeroCaught($node) + && !$this->hasDivisionByZeroThrowsTag($scope) ) { $zeroType = new ConstantIntegerType(0); if ($zeroType->isSuperTypeOf($rightType)->maybe()) { @@ -169,4 +170,19 @@ private function isDivisionByZeroCaught(Node $node): bool return $tryCatchType->isSuperTypeOf(new ObjectType(DivisionByZeroError::class))->yes(); } + private function hasDivisionByZeroThrowsTag(Scope $scope): bool + { + $function = $scope->getFunction(); + if ($function === null) { + return false; + } + + $throwsType = $function->getThrowType(); + if ($throwsType === null) { + return false; + } + + return $throwsType->isSuperTypeOf(new ObjectType(DivisionByZeroError::class))->yes(); + } + } diff --git a/tests/PHPStan/Rules/Operators/data/invalid-division.php b/tests/PHPStan/Rules/Operators/data/invalid-division.php index cb19463fff5..99bcf76bf95 100644 --- a/tests/PHPStan/Rules/Operators/data/invalid-division.php +++ b/tests/PHPStan/Rules/Operators/data/invalid-division.php @@ -68,3 +68,9 @@ function (int $i, int $x): void { } }; +/** + * @throws \DivisionByZeroError + */ +function throws(int $i, int $x) { + return $i / $x; +};