RecordNavigationExpression.java
package edu.udel.cis.vsl.tass.model.impl.expression;
import edu.udel.cis.vsl.tass.model.IF.ModelFactoryIF;
import edu.udel.cis.vsl.tass.model.IF.expression.LHSExpressionIF;
import edu.udel.cis.vsl.tass.model.IF.expression.RecordNavigationExpressionIF;
import edu.udel.cis.vsl.tass.model.IF.type.RecordTypeIF;
public class RecordNavigationExpression extends Expression implements
RecordNavigationExpressionIF {
private int fieldIndex;
private LHSExpressionIF recordExpression;
public RecordNavigationExpression(ModelFactoryIF modelFactory,
LHSExpressionIF recordExpression, int fieldIndex) {
super(modelFactory, ExpressionKind.NAVIGATE);
this.recordExpression = recordExpression;
this.fieldIndex = fieldIndex;
freeVariables.addAll(recordExpression.freeVariables());
type = ((RecordTypeIF) recordExpression.type()).fieldType(fieldIndex);
}
public int fieldIndex() {
return fieldIndex;
}
public LHSExpressionIF recordExpression() {
return recordExpression;
}
public String toString() {
RecordTypeIF type = (RecordTypeIF) recordExpression.type();
String fieldName = type.fieldName(fieldIndex);
return recordExpression.atomString() + "." + fieldName;
}
public String atomString() {
return "(" + toString() + ")";
}
public boolean equals(Object object) {
if (object instanceof RecordNavigationExpression) {
RecordNavigationExpression that = (RecordNavigationExpression) object;
return fieldIndex == that.fieldIndex
&& recordExpression.equals(that.recordExpression);
}
return false;
}
public int hashCode() {
return recordExpression.hashCode() + fieldIndex * 32768;
}
}