package cide.gast;
public class PropertyZeroOrOne<T extends IASTNode> extends Property {
protected T value;
public PropertyZeroOrOne(String name, T value) {
super(name, PropertyType.ZEROORONE);
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
notifyChange();
}
public boolean canRemoveSubtree(IASTNode node) {
return value == node;
}
public void removeSubtree(IASTNode node) {
if (value == node)
setValue(null);
}
@Override
public void replaceChild(IASTNode oldChild, IASTNode newChild) {
if (value == oldChild)
setValue((T) newChild);
}
void setParent(IASTNode parent) {
super.setParent(parent);
if (value != null)
value.setParentProperty(this);
}
public boolean hasValue() {
return value != null;
}
Property deepCopy() {
T newValue = null;
if (value != null)
newValue = (T) value.deepCopy();
return new PropertyZeroOrOne<T>(new String(name), newValue);
}
public IASTNode[] getChildren() {
if (value != null)
return new IASTNode[] { value };
else
return new IASTNode[] {};
}
}