> */ public function getNodeTypes() : array { return [\PhpParser\Node\Expr\BinaryOp\Concat::class]; } /** * @param Concat $node */ public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node { $this->nodeReplacementIsRestricted = \false; if (!$this->isTopMostConcatNode($node)) { return null; } $joinedNode = $this->joinConcatIfStrings($node); if (!$joinedNode instanceof \PhpParser\Node\Scalar\String_) { return null; } if ($this->nodeReplacementIsRestricted) { return null; } return $joinedNode; } private function isTopMostConcatNode(\PhpParser\Node\Expr\BinaryOp\Concat $concat) : bool { $parent = $concat->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::PARENT_NODE); return !$parent instanceof \PhpParser\Node\Expr\BinaryOp\Concat; } /** * @return Concat|String_ */ private function joinConcatIfStrings(\PhpParser\Node\Expr\BinaryOp\Concat $node) : \PhpParser\Node\Expr { $concat = clone $node; if ($concat->left instanceof \PhpParser\Node\Expr\BinaryOp\Concat) { $concat->left = $this->joinConcatIfStrings($concat->left); } if ($concat->right instanceof \PhpParser\Node\Expr\BinaryOp\Concat) { $concat->right = $this->joinConcatIfStrings($concat->right); } if (!$concat->left instanceof \PhpParser\Node\Scalar\String_) { return $node; } if (!$concat->right instanceof \PhpParser\Node\Scalar\String_) { return $node; } $leftValue = $concat->left->value; $rightValue = $concat->right->value; if ($leftValue === "\n") { $this->nodeReplacementIsRestricted = \true; return $node; } if ($rightValue === "\n") { $this->nodeReplacementIsRestricted = \true; return $node; } $resultString = new \PhpParser\Node\Scalar\String_($leftValue . $rightValue); if (\RectorPrefix20210510\Nette\Utils\Strings::length($resultString->value) >= self::LINE_BREAK_POINT) { $this->nodeReplacementIsRestricted = \true; return $node; } return $resultString; } }