package jetbrains.mps.vcs.changesmanager.tree.features;
/*Generated by MPS */
import org.jetbrains.mps.openapi.model.SModelReference;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.mps.openapi.module.SRepository;
import java.util.List;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
/**
* Feature is either node, node's property, node's reference, node's property list,
* or node's reference list (see subclasses)
*/
public abstract class Feature {
private final SModelReference myModelReference;
private int myHashCode;
protected Feature(@NotNull SModelReference modelReference) {
myModelReference = modelReference;
}
@NotNull
public final SModelReference getModelReference() {
return myModelReference;
}
@Nullable
protected abstract Feature getParent(SRepository repo);
@Override
public int hashCode() {
if (myHashCode == 0) {
myHashCode = toString().hashCode();
if (myHashCode == 0) {
assert false : "Feature hash code cannot be 0";
}
}
return myHashCode;
}
@Override
public boolean equals(Object object) {
if (this.getClass() == object.getClass()) {
Feature that = ((Feature) object);
if (this.hashCode() == that.hashCode()) {
if (this.myModelReference.equals(that.myModelReference)) {
return true;
}
}
}
return false;
}
@NotNull
@Override
public abstract String toString();
public Feature[] getAncestors(SRepository repo) {
List<Feature> features = ListSequence.fromList(new ArrayList<Feature>());
for (Feature current = getParent(repo); current != null; current = current.getParent(repo)) {
ListSequence.fromList(features).addElement(current);
}
return ListSequence.fromList(features).toGenericArray(Feature.class);
}
}