io.codemodder.codemods.DeclareVariableOnSeparateLine Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of core-codemods Show documentation
Show all versions of core-codemods Show documentation
Codemods for fixing common errors across many Java projects
package io.codemodder.codemods;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.nodeTypes.NodeWithVariables;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
abstract class DeclareVariableOnSeparateLine {
protected final NodeWithVariables> parentNode;
protected DeclareVariableOnSeparateLine(final NodeWithVariables> parentNode) {
this.parentNode = Objects.requireNonNull(parentNode);
}
/**
* Splits multiple inline variables within a parent node into separate variable declaration
* statements.
*/
protected boolean splitVariablesIntoTheirOwnStatements() {
final List inlineVariables = parentNode.getVariables().stream().toList();
final List remainingVariables =
inlineVariables.subList(1, inlineVariables.size());
final List newVariableNodes = createVariableNodesToAdd(remainingVariables);
if (!addNewNodesToParentNode(newVariableNodes)) {
return false;
}
// Replace parent's node that has all inline variables with only the first variable
parentNode.setVariables(new NodeList<>(inlineVariables.get(0)));
return true;
}
/** Returns a list of nodes created from the list of inline variables. */
protected abstract List createVariableNodesToAdd(List inlineVariables);
/** Adds new variable nodes to the parent node. */
protected abstract boolean addNewNodesToParentNode(List nodesToAdd);
/**
* Inserts a list of nodes after a specified reference node within an original list of nodes. The
* result of this operation is a new list containing the original nodes with the additional nodes
* inserted after the specified reference node while maintaining the original order of elements.
*/
static List insertNodesAfterReference(
final List originalNodes, final Node referenceNode, final List nodesToAdd) {
// Find the index of the reference node in the original list
final int referenceIndex = originalNodes.indexOf(referenceNode);
// Split the original list into elements before and after the reference node
final List elementsBefore = originalNodes.subList(0, referenceIndex + 1);
final List elementsAfter = originalNodes.subList(referenceIndex + 1, originalNodes.size());
// Create a new list with nodes inserted after the reference node
final List newElements = new ArrayList<>(elementsBefore);
nodesToAdd.forEach(node -> newElements.add((T) node));
newElements.addAll(elementsAfter);
return newElements;
}
}