sideEffectNodeDetector = $sideEffectNodeDetector; } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove dead condition above return', [new CodeSample(<<<'CODE_SAMPLE' final class SomeClass { public function go() { if (1 === 1) { return 'yes'; } return 'yes'; } } CODE_SAMPLE , <<<'CODE_SAMPLE' final class SomeClass { public function go() { return 'yes'; } } CODE_SAMPLE )]); } /** * @return array> */ public function getNodeTypes() : array { return [StmtsAwareInterface::class]; } /** * @param StmtsAwareInterface $node */ public function refactor(Node $node) : ?StmtsAwareInterface { foreach ((array) $node->stmts as $key => $stmt) { if (!$stmt instanceof Return_) { continue; } $previousNode = $node->stmts[$key - 1] ?? null; if (!$this->isBareIf($previousNode)) { continue; } /** @var Scope $scope */ $scope = $stmt->getAttribute(AttributeKey::SCOPE); /** @var If_ $previousNode */ if ($this->sideEffectNodeDetector->detect($previousNode->cond, $scope)) { continue; } $countStmt = \count($previousNode->stmts); if ($countStmt === 0) { unset($node->stmts[$key - 1]); return $node; } if ($countStmt > 1) { return null; } $previousFirstStmt = $previousNode->stmts[0]; if (!$previousFirstStmt instanceof Return_) { return null; } if (!$this->nodeComparator->areNodesEqual($previousFirstStmt, $stmt)) { return null; } unset($node->stmts[$key - 1]); return $node; } return null; } private function isBareIf(?Stmt $stmt) : bool { if (!$stmt instanceof If_) { return \false; } if ($stmt->elseifs !== []) { return \false; } return !$stmt->else instanceof Else_; } }