diff --git a/rules.neon b/rules.neon index 48011c37..d70a9111 100644 --- a/rules.neon +++ b/rules.neon @@ -52,6 +52,10 @@ rules: - PHPStan\Rules\VariableVariables\VariableStaticPropertyFetchRule - PHPStan\Rules\VariableVariables\VariableVariablesRule +conditionalTags: + PHPStan\Rules\DisallowedConstructs\DisallowedLooseComparisonRule: + phpstan.rules.rule: %featureToggles.bleedingEdge% + services: - class: PHPStan\Rules\BooleansInConditions\BooleanRuleHelper @@ -71,3 +75,6 @@ services: universalObjectCratesClasses: %universalObjectCratesClasses% tags: - phpstan.rules.rule + + - + class: PHPStan\Rules\DisallowedConstructs\DisallowedLooseComparisonRule diff --git a/src/Rules/DisallowedConstructs/DisallowedLooseComparisonRule.php b/src/Rules/DisallowedConstructs/DisallowedLooseComparisonRule.php new file mode 100644 index 00000000..a1425c76 --- /dev/null +++ b/src/Rules/DisallowedConstructs/DisallowedLooseComparisonRule.php @@ -0,0 +1,44 @@ + + */ +class DisallowedLooseComparisonRule implements Rule +{ + + public function getNodeType(): string + { + return BinaryOp::class; + } + + public function processNode(Node $node, Scope $scope): array + { + if ($node instanceof Equal) { + return [ + RuleErrorBuilder::message( + 'Loose comparison via "==" is not allowed.' + )->tip('Use strict comparison via "===" instead.')->build(), + ]; + } + if ($node instanceof NotEqual) { + return [ + RuleErrorBuilder::message( + 'Loose comparison via "!=" is not allowed.' + )->tip('Use strict comparison via "!==" instead.')->build(), + ]; + } + + return []; + } + +} diff --git a/tests/Rules/DisallowedConstructs/DisallowedLooseComparisonRuleTest.php b/tests/Rules/DisallowedConstructs/DisallowedLooseComparisonRuleTest.php new file mode 100644 index 00000000..9e56b583 --- /dev/null +++ b/tests/Rules/DisallowedConstructs/DisallowedLooseComparisonRuleTest.php @@ -0,0 +1,35 @@ + + */ +class DisallowedLooseComparisonRuleTest extends RuleTestCase +{ + + protected function getRule(): Rule + { + return new DisallowedLooseComparisonRule(); + } + + public function testRule(): void + { + $this->analyse([__DIR__ . '/data/weak-comparison.php'], [ + [ + 'Loose comparison via "==" is not allowed.', + 3, + 'Use strict comparison via "===" instead.', + ], + [ + 'Loose comparison via "!=" is not allowed.', + 5, + 'Use strict comparison via "!==" instead.', + ], + ]); + } + +} diff --git a/tests/Rules/DisallowedConstructs/data/weak-comparison.php b/tests/Rules/DisallowedConstructs/data/weak-comparison.php new file mode 100644 index 00000000..2e7e3a97 --- /dev/null +++ b/tests/Rules/DisallowedConstructs/data/weak-comparison.php @@ -0,0 +1,6 @@ +