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;
	}
}