Skip to content

Commit 7195ea0

Browse files
committed
Add tests
1 parent 01c4cb5 commit 7195ea0

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

src/Rules/Operators/InvalidBinaryOperationRule.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
use PHPStan\Analyser\MutatingScope;
77
use PHPStan\Analyser\Scope;
88
use PHPStan\Node\Printer\ExprPrinter;
9+
use PHPStan\Php\PhpVersion;
910
use PHPStan\Rules\Rule;
1011
use PHPStan\Rules\RuleErrorBuilder;
1112
use PHPStan\Rules\RuleLevelHelper;
1213
use PHPStan\ShouldNotHappenException;
1314
use PHPStan\TrinaryLogic;
1415
use PHPStan\Type\ErrorType;
16+
use PHPStan\Type\ObjectType;
1517
use PHPStan\Type\Type;
1618
use PHPStan\Type\VerbosityLevel;
1719
use function sprintf;
@@ -26,6 +28,7 @@ final class InvalidBinaryOperationRule implements Rule
2628

2729
public function __construct(
2830
private ExprPrinter $exprPrinter,
31+
private PhpVersion $phpVersion,
2932
private RuleLevelHelper $ruleLevelHelper,
3033
)
3134
{
@@ -70,9 +73,13 @@ public function processNode(Node $node, Scope $scope): array
7073
if ($node instanceof Node\Expr\AssignOp\Concat || $node instanceof Node\Expr\BinaryOp\Concat) {
7174
$callback = static fn (Type $type): bool => !$type->toString() instanceof ErrorType;
7275
} elseif ($node instanceof Node\Expr\AssignOp\Plus || $node instanceof Node\Expr\BinaryOp\Plus) {
73-
$callback = static fn (Type $type): bool => !$type->toNumber() instanceof ErrorType || $type->isArray()->yes();
76+
$callback = $this->phpVersion->supportsBcMathNumberOperatorOverloading()
77+
? static fn (Type $type): bool => !$type->toNumber() instanceof ErrorType || $type->isArray()->yes() || $type->isSuperTypeOf(new ObjectType('BcMath\Number'))->yes()
78+
: static fn (Type $type): bool => !$type->toNumber() instanceof ErrorType || $type->isArray()->yes();
7479
} else {
75-
$callback = static fn (Type $type): bool => !$type->toNumber() instanceof ErrorType;
80+
$callback = $this->phpVersion->supportsBcMathNumberOperatorOverloading()
81+
? static fn (Type $type): bool => !$type->toNumber() instanceof ErrorType || $type->isSuperTypeOf(new ObjectType('BcMath\Number'))->yes()
82+
: static fn (Type $type): bool => !$type->toNumber() instanceof ErrorType;
7683
}
7784

7885
$leftType = $this->ruleLevelHelper->findTypeToCheck(

tests/PHPStan/Rules/Operators/InvalidBinaryOperationRuleTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use PHPStan\Node\Printer\ExprPrinter;
66
use PHPStan\Node\Printer\Printer;
7+
use PHPStan\Php\PhpVersion;
78
use PHPStan\Rules\Rule;
89
use PHPStan\Rules\RuleLevelHelper;
910
use PHPStan\Testing\RuleTestCase;
@@ -23,6 +24,7 @@ protected function getRule(): Rule
2324
{
2425
return new InvalidBinaryOperationRule(
2526
new ExprPrinter(new Printer()),
27+
new PhpVersion(PHP_VERSION_ID),
2628
new RuleLevelHelper($this->createReflectionProvider(), true, false, true, $this->checkExplicitMixed, $this->checkImplicitMixed, false),
2729
);
2830
}

0 commit comments

Comments
 (0)