package me.tomassetti.turin.parser.ast.expressions; import com.google.common.collect.ImmutableList; import me.tomassetti.jvm.JvmMethodDefinition; import me.tomassetti.jvm.JvmType; import me.tomassetti.turin.resolvers.SymbolResolver; import me.tomassetti.turin.parser.ast.Node; import me.tomassetti.turin.typesystem.TypeUsage; import java.util.List; public class InstanceFieldAccess extends Expression { private Expression subject; private String field; public InstanceFieldAccess(Expression subject, String field) { this.subject = subject; this.subject.setParent(this); this.field = field; } @Override public String toString() { return "InstanceFieldAccess{" + "subject=" + subject + ", field='" + field + '\'' + '}'; } public Expression getSubject() { return subject; } public String getField() { return field; } public boolean isArrayLength(SymbolResolver resolver) { return getSubject().calcType().isArray() && field.equals("length"); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; InstanceFieldAccess that = (InstanceFieldAccess) o; if (!field.equals(that.field)) return false; if (!subject.equals(that.subject)) return false; return true; } @Override public int hashCode() { int result = subject.hashCode(); result = 31 * result + field.hashCode(); return result; } @Override public TypeUsage calcType() { return subject.getField(field).calcType(); } @Override public boolean canBeAssigned(SymbolResolver resolver) { return subject.canFieldBeAssigned(field, resolver); } @Override public JvmMethodDefinition findMethodFor(List<ActualParam> argsTypes, SymbolResolver resolver, boolean staticContext) { throw new UnsupportedOperationException(); } @Override public Iterable<Node> getChildren() { return ImmutableList.of(subject); } }