gumtree.spoon.builder.NodeCreator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of gumtree-spoon-ast-diff Show documentation
Show all versions of gumtree-spoon-ast-diff Show documentation
Computes the AST difference between two Spoon abstract syntax trees using the Gumtree algorithm.
package gumtree.spoon.builder;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
import com.github.gumtreediff.tree.ITree;
import spoon.reflect.declaration.CtMethod;
import spoon.reflect.declaration.CtModifiable;
import spoon.reflect.declaration.CtVariable;
import spoon.reflect.declaration.ModifierKind;
import spoon.reflect.reference.CtTypeReference;
import spoon.reflect.visitor.CtInheritanceScanner;
/**
* responsible to add additional nodes only overrides scan* to add new nodes
*/
class NodeCreator extends CtInheritanceScanner {
private final TreeScanner builder;
NodeCreator(TreeScanner builder) {
this.builder = builder;
}
@Override
public void scanCtModifiable(CtModifiable m) {
ITree modifiers = builder.createNode("Modifiers", "");
modifiers.setMetadata(SpoonGumTreeBuilder.SPOON_OBJECT, m);
// ensuring an order (instead of hashset)
// otherwise some flaky tests in CI
Set modifiers1 = new TreeSet<>(new Comparator() {
@Override
public int compare(ModifierKind o1, ModifierKind o2) {
return o1.name().compareTo(o2.name());
}
});
modifiers1.addAll(m.getModifiers());
for (ModifierKind kind : modifiers1) {
ITree modifier = builder.createNode("Modifier", kind.toString());
modifier.setMetadata(SpoonGumTreeBuilder.SPOON_OBJECT, m);
modifiers.addChild(modifier);
}
builder.addSiblingNode(modifiers);
}
@Override
public void scanCtVariable(CtVariable e) {
CtTypeReference type = e.getType();
if (type != null) {
ITree variableType = builder.createNode("VARIABLE_TYPE", type.getQualifiedName());
variableType.setMetadata(SpoonGumTreeBuilder.SPOON_OBJECT, type);
type.putMetadata(SpoonGumTreeBuilder.GUMTREE_NODE, variableType);
builder.addSiblingNode(variableType);
}
}
@Override
public void visitCtMethod(CtMethod e) {
// add the return type of the method
CtTypeReference type = e.getType();
if (type != null) {
ITree returnType = builder.createNode("RETURN_TYPE", type.getQualifiedName());
returnType.setMetadata(SpoonGumTreeBuilder.SPOON_OBJECT, type);
type.putMetadata(SpoonGumTreeBuilder.GUMTREE_NODE, returnType);
builder.addSiblingNode(returnType);
}
for (CtTypeReference thrown : e.getThrownTypes()) {
ITree thrownType = builder.createNode("THROWS", thrown.getQualifiedName());
thrownType.setMetadata(SpoonGumTreeBuilder.SPOON_OBJECT, thrown);
type.putMetadata(SpoonGumTreeBuilder.GUMTREE_NODE, thrownType);
builder.addSiblingNode(thrownType);
}
super.visitCtMethod(e);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy