void (@NotNull ASTNode parent, @NotNull ASTNode oldChild, @NotNull ASTNode newChild) { saveWhitespacesInfo(oldChild); saveWhitespacesInfo(newChild); LeafElement oldFirst = TreeUtil.findFirstLeaf(oldChild); parent.replaceChild(oldChild, newChild); LeafElement firstLeaf = TreeUtil.findFirstLeaf(newChild); ASTNode prevToken = TreeUtil.prevLeaf(newChild); if (firstLeaf != null) { ASTNode nextLeaf = TreeUtil.nextLeaf(newChild); makePlaceHolderBetweenTokens(prevToken, firstLeaf, isFormattingRequired(prevToken, newChild), false); if (nextLeaf != null && !CharArrayUtil.containLineBreaks(nextLeaf.getText())) { makePlaceHolderBetweenTokens(TreeUtil.prevLeaf(nextLeaf), nextLeaf, false, false); } } else { if (oldFirst != null && prevToken == null) { ASTNode whitespaceNode = newChild.getTreeNext(); if (whitespaceNode != null && whitespaceNode.getElementType() == TokenType.WHITE_SPACE) { // Replacing non-empty prefix to empty shall remove whitespace parent.removeChild(whitespaceNode); } } makePlaceHolderBetweenTokens(prevToken, TreeUtil.nextLeaf(newChild), isFormattingRequired(prevToken, newChild), false); } }