> */ public function getNodeTypes() : array { return [If_::class, ElseIf_::class, Else_::class]; } /** * @param If_|ElseIf_|Else_ $node */ public function refactor(Node $node) : ?Node { if ($this->isBareNewNode($node)) { return null; } $oldTokens = $this->file->getOldTokens(); if ($this->isIfConditionFollowedByOpeningCurlyBracket($node, $oldTokens)) { return null; } // invoke reprint with brackets $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); return $node; } /** * @param mixed[] $oldTokens * @param \PhpParser\Node\Stmt\If_|\PhpParser\Node\Stmt\ElseIf_|\PhpParser\Node\Stmt\Else_ $if */ private function isIfConditionFollowedByOpeningCurlyBracket($if, array $oldTokens) : bool { $startStmt = \current($if->stmts); if (!$startStmt instanceof Stmt) { return \true; } $startTokenPos = $if->getStartTokenPos(); $i = $startStmt->getStartTokenPos() - 1; $condEndTokenPos = $if instanceof Else_ ? $startTokenPos : $if->cond->getEndTokenPos(); while (isset($oldTokens[$i])) { if ($i === $condEndTokenPos) { return \false; } if (\in_array($oldTokens[$i], ['{', ':'], \true)) { // all good return \true; } if ($i === $startTokenPos) { return \false; } --$i; } return \false; } /** * @param \PhpParser\Node\Stmt\If_|\PhpParser\Node\Stmt\ElseIf_|\PhpParser\Node\Stmt\Else_ $if */ private function isBareNewNode($if) : bool { $originalNode = $if->getAttribute(AttributeKey::ORIGINAL_NODE); if (!$originalNode instanceof Node) { return \true; } // not defined, probably new if return $if->getStartTokenPos() === -1; } }