package cide.gast; public abstract class Property { protected final String name; protected final PropertyType type; protected IASTNode parent; public enum PropertyType { ONE, ZEROORONE, ZEROORMORE, ONEORMORE, LIST } public Property(String name, PropertyType type) { this.name = name; this.type = type; } public abstract boolean canRemoveSubtree(IASTNode node); public abstract void removeSubtree(IASTNode node); public abstract IASTNode[] getChildren(); public abstract void replaceChild(IASTNode oldChild, IASTNode newChild); /** * Setzt den Parent des Propertys auf den gegebenen AST-Knoten * ACHTUNG: Dieses Property wird nicht als Kind des gegebenen AST-Knoten eingetragen. Dies muss manuell geschehen * und passiert im Konstruktor von ASTNode. * @param node Parent-Knoten */ void setParent(IASTNode node) { this.parent = node; } public IASTNode getNode() { return parent; } public String getName() { return name; } public PropertyType getType() { return type; } /** * generates part of the IASTNode's id * * @param node * @return */ String getId(IASTNode node) { return name; } abstract Property deepCopy(); protected void notifyChange() { if (parent != null) parent.notifyPropertyChanged(this); } }