CommonAssignFieldExpr.java
package edu.udel.cis.vsl.abc.analysis.pointsTo.common;
import edu.udel.cis.vsl.abc.analysis.pointsTo.IF.AssignExprIF;
import edu.udel.cis.vsl.abc.analysis.pointsTo.IF.AssignFieldExprIF;
import edu.udel.cis.vsl.abc.ast.type.IF.Field;
import edu.udel.cis.vsl.abc.ast.type.IF.Type;
public class CommonAssignFieldExpr extends CommonAssignExpr
implements
AssignFieldExprIF {
private Field field;
private AssignExprIF struct;
CommonAssignFieldExpr(int id, Type type, AssignExprIF struct, Field field) {
super(id, type);
this.struct = struct;
this.field = field;
assert type != null;
assert struct != null;
assert field != null;
}
@Override
public AssignExprIF struct() {
return struct;
}
@Override
public AssignExprKind kind() {
return AssignExprKind.FIELD;
}
@Override
public boolean isFull() {
return false;
}
@Override
public Field field() {
return field;
}
@Override
public AssignExprIF root() {
return this.struct.root();
}
@Override
public String toString() {
String str = struct.toString();
if (struct.kind() == AssignExprKind.OFFSET)
str = "(" + str + ")";
return str + "." + field.getName();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof CommonAssignFieldExpr) {
CommonAssignFieldExpr that = (CommonAssignFieldExpr) obj;
return that.type().equals(this.type()) && that.struct.equals(struct)
&& that.field() == this.field;
}
return false;
}
@Override
public int hashCode() {
return ((this.type().hashCode() * this.struct.hashCode()) / 17 + 1)
* this.field.hashCode();
}
@Override
public boolean mayEquals(AssignExprIF o) {
if (o.kind() == AssignExprKind.FIELD) {
AssignFieldExprIF other = (AssignFieldExprIF) o;
if (other.field() == this.field)
return other.struct().mayEquals(struct);
}
return false;
}
}