exprAnalyzer = $exprAnalyzer; } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove useless return Expr in __construct()', [new CodeSample(<<<'CODE_SAMPLE' class SomeClass { public function __construct() { if (rand(0, 1)) { $this->init(); return true; } if (rand(2, 3)) { return parent::construct(); } $this->execute(); } } CODE_SAMPLE , <<<'CODE_SAMPLE' class SomeClass { public function __construct() { if (rand(0, 1)) { $this->init(); return; } if (rand(2, 3)) { parent::construct(); return; } $this->execute(); } } CODE_SAMPLE )]); } /** * @return array> */ public function getNodeTypes() : array { return [ClassMethod::class]; } /** * @param ClassMethod $node */ public function refactor(Node $node) : ?Node { if ($node->stmts === null) { return null; } if (!$this->isName($node, MethodName::CONSTRUCT)) { return null; } $hasChanged = \false; $this->traverseNodesWithCallable($node->stmts, function (Node $subNode) use(&$hasChanged) { if ($subNode instanceof Class_ || $subNode instanceof Function_ || $subNode instanceof Closure) { return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; } if (!$subNode instanceof Return_) { return null; } if (!$subNode->expr instanceof Expr) { return null; } $hasChanged = \true; if ($this->exprAnalyzer->isDynamicExpr($subNode->expr)) { return [new Expression($subNode->expr), new Return_()]; } $subNode->expr = null; return $subNode; }); if ($hasChanged) { return $node; } return null; } }