package cide.gast;
/**
* optional value that is replaced by a string for print-visitors if removed.
*
*/
public class PropertyOptionalWithDefault<T extends IASTNode> extends Property {
protected T value;
private final String defaultValue;
private final ASTStringNode defaultNode;
public PropertyOptionalWithDefault(String name, T value, String defaultValue) {
super(name, PropertyType.ONE);
this.value = value;
this.defaultValue = defaultValue;
defaultNode = new ASTStringNode(defaultValue, genToken());
}
private IToken genToken() {
return new IToken() {
public int getLength() {
return 0;
}
public int getOffset() {
return -1;
}
public int getLine() {
return -1;
}
};
}
public IASTNode getValue() {
if (value == null)
return defaultNode;
return value;
}
public void setValue(T value) {
this.value = value;
notifyChange();
}
public boolean canRemoveSubtree(IASTNode node) {
return node == value;
}
public void removeSubtree(IASTNode node) {
if (node == value){
value = null;
notifyChange();
}
}
@Override
public void replaceChild(IASTNode oldChild, IASTNode newChild) {
if (value == oldChild)
setValue((T) newChild);
}
void setParent(IASTNode parent) {
super.setParent(parent);
value.setParentProperty(this);
}
Property deepCopy() {
return new PropertyOptionalWithDefault<T>(new String(name), (T) value.deepCopy(), new String(defaultValue));
}
public IASTNode[] getChildren() {
if (value != null)
return new IASTNode[] { value };
else
return new IASTNode[] { defaultNode };
}
}