From 9ebea49b798018efff21f158a182c760c5f6520c Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Tue, 22 Sep 2026 21:38:11 +0200 Subject: [PATCH] Name the node types the arithmetic operand rules want Each of them handles one operator in its binary and its compound-assign form, and registered for Expr to get both - so it was called for every expression in the analysed code just to reject it. PHPStan 2.3.0's MultipleNodeTypesRule lets them name the two classes instead. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01QL6WG3TUaXc6ggSoDLdorG --- .../Operators/OperandsInArithmeticAdditionRule.php | 11 ++++++++--- .../Operators/OperandsInArithmeticDivisionRule.php | 11 ++++++++--- .../OperandsInArithmeticExponentiationRule.php | 11 ++++++++--- .../Operators/OperandsInArithmeticModuloRule.php | 11 ++++++++--- .../OperandsInArithmeticMultiplicationRule.php | 11 ++++++++--- .../Operators/OperandsInArithmeticSubtractionRule.php | 11 ++++++++--- 6 files changed, 48 insertions(+), 18 deletions(-) diff --git a/src/Rules/Operators/OperandsInArithmeticAdditionRule.php b/src/Rules/Operators/OperandsInArithmeticAdditionRule.php index 80de146..82bf7dd 100644 --- a/src/Rules/Operators/OperandsInArithmeticAdditionRule.php +++ b/src/Rules/Operators/OperandsInArithmeticAdditionRule.php @@ -7,16 +7,16 @@ use PhpParser\Node\Expr\AssignOp\Plus as AssignOpPlus; use PhpParser\Node\Expr\BinaryOp\Plus as BinaryOpPlus; use PHPStan\Analyser\Scope; -use PHPStan\Rules\Rule; +use PHPStan\Rules\MultipleNodeTypesRule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Type\VerbosityLevel; use function count; use function sprintf; /** - * @implements Rule + * @implements MultipleNodeTypesRule */ -class OperandsInArithmeticAdditionRule implements Rule +class OperandsInArithmeticAdditionRule implements MultipleNodeTypesRule { private OperatorRuleHelper $helper; @@ -26,6 +26,11 @@ public function __construct(OperatorRuleHelper $helper) $this->helper = $helper; } + public function getNodeTypes(): array + { + return [BinaryOpPlus::class, AssignOpPlus::class]; + } + public function getNodeType(): string { return Expr::class; diff --git a/src/Rules/Operators/OperandsInArithmeticDivisionRule.php b/src/Rules/Operators/OperandsInArithmeticDivisionRule.php index e95b3d6..08f1533 100644 --- a/src/Rules/Operators/OperandsInArithmeticDivisionRule.php +++ b/src/Rules/Operators/OperandsInArithmeticDivisionRule.php @@ -7,15 +7,15 @@ use PhpParser\Node\Expr\AssignOp\Div as AssignOpDiv; use PhpParser\Node\Expr\BinaryOp\Div as BinaryOpDiv; use PHPStan\Analyser\Scope; -use PHPStan\Rules\Rule; +use PHPStan\Rules\MultipleNodeTypesRule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Type\VerbosityLevel; use function sprintf; /** - * @implements Rule + * @implements MultipleNodeTypesRule */ -class OperandsInArithmeticDivisionRule implements Rule +class OperandsInArithmeticDivisionRule implements MultipleNodeTypesRule { private OperatorRuleHelper $helper; @@ -25,6 +25,11 @@ public function __construct(OperatorRuleHelper $helper) $this->helper = $helper; } + public function getNodeTypes(): array + { + return [BinaryOpDiv::class, AssignOpDiv::class]; + } + public function getNodeType(): string { return Expr::class; diff --git a/src/Rules/Operators/OperandsInArithmeticExponentiationRule.php b/src/Rules/Operators/OperandsInArithmeticExponentiationRule.php index 1992b84..ccae6ee 100644 --- a/src/Rules/Operators/OperandsInArithmeticExponentiationRule.php +++ b/src/Rules/Operators/OperandsInArithmeticExponentiationRule.php @@ -7,15 +7,15 @@ use PhpParser\Node\Expr\AssignOp\Pow as AssignOpPow; use PhpParser\Node\Expr\BinaryOp\Pow as BinaryOpPow; use PHPStan\Analyser\Scope; -use PHPStan\Rules\Rule; +use PHPStan\Rules\MultipleNodeTypesRule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Type\VerbosityLevel; use function sprintf; /** - * @implements Rule + * @implements MultipleNodeTypesRule */ -class OperandsInArithmeticExponentiationRule implements Rule +class OperandsInArithmeticExponentiationRule implements MultipleNodeTypesRule { private OperatorRuleHelper $helper; @@ -25,6 +25,11 @@ public function __construct(OperatorRuleHelper $helper) $this->helper = $helper; } + public function getNodeTypes(): array + { + return [BinaryOpPow::class, AssignOpPow::class]; + } + public function getNodeType(): string { return Expr::class; diff --git a/src/Rules/Operators/OperandsInArithmeticModuloRule.php b/src/Rules/Operators/OperandsInArithmeticModuloRule.php index 5b5f3c3..0771439 100644 --- a/src/Rules/Operators/OperandsInArithmeticModuloRule.php +++ b/src/Rules/Operators/OperandsInArithmeticModuloRule.php @@ -7,15 +7,15 @@ use PhpParser\Node\Expr\AssignOp\Mod as AssignOpMod; use PhpParser\Node\Expr\BinaryOp\Mod as BinaryOpMod; use PHPStan\Analyser\Scope; -use PHPStan\Rules\Rule; +use PHPStan\Rules\MultipleNodeTypesRule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Type\VerbosityLevel; use function sprintf; /** - * @implements Rule + * @implements MultipleNodeTypesRule */ -class OperandsInArithmeticModuloRule implements Rule +class OperandsInArithmeticModuloRule implements MultipleNodeTypesRule { private OperatorRuleHelper $helper; @@ -25,6 +25,11 @@ public function __construct(OperatorRuleHelper $helper) $this->helper = $helper; } + public function getNodeTypes(): array + { + return [BinaryOpMod::class, AssignOpMod::class]; + } + public function getNodeType(): string { return Expr::class; diff --git a/src/Rules/Operators/OperandsInArithmeticMultiplicationRule.php b/src/Rules/Operators/OperandsInArithmeticMultiplicationRule.php index 353df4c..bc8491e 100644 --- a/src/Rules/Operators/OperandsInArithmeticMultiplicationRule.php +++ b/src/Rules/Operators/OperandsInArithmeticMultiplicationRule.php @@ -7,15 +7,15 @@ use PhpParser\Node\Expr\AssignOp\Mul as AssignOpMul; use PhpParser\Node\Expr\BinaryOp\Mul as BinaryOpMul; use PHPStan\Analyser\Scope; -use PHPStan\Rules\Rule; +use PHPStan\Rules\MultipleNodeTypesRule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Type\VerbosityLevel; use function sprintf; /** - * @implements Rule + * @implements MultipleNodeTypesRule */ -class OperandsInArithmeticMultiplicationRule implements Rule +class OperandsInArithmeticMultiplicationRule implements MultipleNodeTypesRule { private OperatorRuleHelper $helper; @@ -25,6 +25,11 @@ public function __construct(OperatorRuleHelper $helper) $this->helper = $helper; } + public function getNodeTypes(): array + { + return [BinaryOpMul::class, AssignOpMul::class]; + } + public function getNodeType(): string { return Expr::class; diff --git a/src/Rules/Operators/OperandsInArithmeticSubtractionRule.php b/src/Rules/Operators/OperandsInArithmeticSubtractionRule.php index 5559d60..63ffc86 100644 --- a/src/Rules/Operators/OperandsInArithmeticSubtractionRule.php +++ b/src/Rules/Operators/OperandsInArithmeticSubtractionRule.php @@ -7,15 +7,15 @@ use PhpParser\Node\Expr\AssignOp\Minus as AssignOpMinus; use PhpParser\Node\Expr\BinaryOp\Minus as BinaryOpMinus; use PHPStan\Analyser\Scope; -use PHPStan\Rules\Rule; +use PHPStan\Rules\MultipleNodeTypesRule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Type\VerbosityLevel; use function sprintf; /** - * @implements Rule + * @implements MultipleNodeTypesRule */ -class OperandsInArithmeticSubtractionRule implements Rule +class OperandsInArithmeticSubtractionRule implements MultipleNodeTypesRule { private OperatorRuleHelper $helper; @@ -25,6 +25,11 @@ public function __construct(OperatorRuleHelper $helper) $this->helper = $helper; } + public function getNodeTypes(): array + { + return [BinaryOpMinus::class, AssignOpMinus::class]; + } + public function getNodeType(): string { return Expr::class;