package org.joni.ast;
import org.joni.constants.internal.NodeType;
public abstract class Node implements NodeType {
public Node parent;
protected int type;
Node(int type) {
this.type = type;
}
public final int getType() {
return type;
}
public final int getType2Bit() {
return 1 << getType();
}
protected void setChild(Node tgt){
}
protected Node getChild(){
return null;
};
public void replaceWith(Node with) {
with.parent = parent;
parent.setChild(with);
parent = null;
}
public abstract String getName();
protected abstract String toString(int level);
public String getAddressName() {
return getName() + ":0x" + Integer.toHexString(System.identityHashCode(this));
}
public final String toString() {
StringBuilder s = new StringBuilder();
s.append("<" + getAddressName() + " (" + (parent == null ? "NULL" : parent.getAddressName()) + ")>");
return s + toString(0);
}
protected static String pad(Object value, int level) {
if (value == null) return "NULL";
StringBuilder pad = new StringBuilder(" ");
for (int i=0; i<level; i++) pad.append(pad);
return value.toString().replace("\n", "\n" + pad);
}
public final boolean isSimple() {
return (getType2Bit() & SIMPLE) != 0;
}
public static TopNode newTop(Node root) {
return new TopNode(root);
}
public static final class TopNode extends Node {
private Node root;
TopNode(Node root) {
super(-1);
root.parent = this;
setChild(root);
}
public Node getRoot() {
return root;
}
@Override
public void setChild(Node node) {
node.parent = this;
root = node;
}
@Override
public Node getChild() {
return root;
}
@Override
public String getName() {
return "ROOT";
}
@Override
public String toString(int level) {
return "\n" + pad(root, level + 1);
}
}
}