exprAnalyzer = $exprAnalyzer; } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Use ===/!== over ==/!=, it values have the same type', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function run(int $firstValue, int $secondValue) { $isSame = $firstValue == $secondValue; $isDiffernt = $firstValue != $secondValue; } } CODE_SAMPLE , <<<'CODE_SAMPLE' class SomeClass { public function run(int $firstValue, int $secondValue) { $isSame = $firstValue === $secondValue; $isDiffernt = $firstValue !== $secondValue; } } CODE_SAMPLE )]); } /** * @return array> */ public function getNodeTypes() : array { return [Equal::class, NotEqual::class]; } /** * @param Equal|NotEqual $node */ public function refactor(Node $node) : ?Node { $leftStaticType = $this->getType($node->left); // objects can be different by content if ($leftStaticType instanceof ObjectType) { return null; } if ($leftStaticType instanceof MixedType) { return null; } $rightStaticType = $this->getType($node->right); if ($rightStaticType instanceof MixedType) { return null; } // different types if (!$leftStaticType->equals($rightStaticType)) { return null; } if ($this->areNonTypedFromParam($node->left, $node->right)) { return null; } if ($node instanceof Equal) { return new Identical($node->left, $node->right); } return new NotIdentical($node->left, $node->right); } private function areNonTypedFromParam(Expr $left, Expr $right) : bool { if ($this->exprAnalyzer->isNonTypedFromParam($left)) { return \true; } return $this->exprAnalyzer->isNonTypedFromParam($right); } }