From 10c19e48609b81e94e78f1c60940dc4df5123e15 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 13 Dec 2022 11:00:47 +0100 Subject: [PATCH 1/2] Prevent overly greedy $scope->getType() calls in ImpossibleInstanceOfRule --- src/Rules/Classes/ImpossibleInstanceOfRule.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Rules/Classes/ImpossibleInstanceOfRule.php b/src/Rules/Classes/ImpossibleInstanceOfRule.php index 5558b8fba5..21dd144a91 100644 --- a/src/Rules/Classes/ImpossibleInstanceOfRule.php +++ b/src/Rules/Classes/ImpossibleInstanceOfRule.php @@ -34,9 +34,6 @@ public function getNodeType(): string public function processNode(Node $node, Scope $scope): array { - $instanceofType = $scope->getType($node); - $expressionType = $scope->getType($node->expr); - if ($node->class instanceof Node\Name) { $className = $scope->resolveName($node->class); $classType = new ObjectType($className); @@ -50,13 +47,14 @@ public function processNode(Node $node, Scope $scope): array return [ RuleErrorBuilder::message(sprintf( 'Instanceof between %s and %s results in an error.', - $expressionType->describe(VerbosityLevel::typeOnly()), + $scope->getType($node->expr)->describe(VerbosityLevel::typeOnly()), $classType->describe(VerbosityLevel::typeOnly()), ))->build(), ]; } } + $instanceofType = $scope->getType($node); if (!$instanceofType instanceof ConstantBooleanType) { return []; } @@ -78,7 +76,7 @@ public function processNode(Node $node, Scope $scope): array return [ $addTip(RuleErrorBuilder::message(sprintf( 'Instanceof between %s and %s will always evaluate to false.', - $expressionType->describe(VerbosityLevel::typeOnly()), + $scope->getType($node->expr)->describe(VerbosityLevel::typeOnly()), $classType->describe(VerbosityLevel::getRecommendedLevelByType($classType)), )))->build(), ]; @@ -86,7 +84,7 @@ public function processNode(Node $node, Scope $scope): array return [ $addTip(RuleErrorBuilder::message(sprintf( 'Instanceof between %s and %s will always evaluate to true.', - $expressionType->describe(VerbosityLevel::typeOnly()), + $scope->getType($node->expr)->describe(VerbosityLevel::typeOnly()), $classType->describe(VerbosityLevel::getRecommendedLevelByType($classType)), )))->build(), ]; From 27eefa8a896b1cbf18701c71725d263bea6a8eff Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 13 Dec 2022 11:06:54 +0100 Subject: [PATCH 2/2] Prevent overly greedy $scope->getType() calls in ExistingClassInInstanceOfRule --- src/Rules/Classes/ExistingClassInInstanceOfRule.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Rules/Classes/ExistingClassInInstanceOfRule.php b/src/Rules/Classes/ExistingClassInInstanceOfRule.php index c04a3d4b11..293dd6285d 100644 --- a/src/Rules/Classes/ExistingClassInInstanceOfRule.php +++ b/src/Rules/Classes/ExistingClassInInstanceOfRule.php @@ -77,9 +77,10 @@ public function processNode(Node $node, Scope $scope): array } $classReflection = $this->reflectionProvider->getClass($name); - $expressionType = $scope->getType($node->expr); if ($classReflection->isTrait()) { + $expressionType = $scope->getType($node->expr); + $errors[] = RuleErrorBuilder::message(sprintf( 'Instanceof between %s and trait %s will always evaluate to false.', $expressionType->describe(VerbosityLevel::typeOnly()),