package me.tomassetti.turin.parser.ast.expressions;
import com.google.common.collect.ImmutableList;
import me.tomassetti.jvm.JvmMethodDefinition;
import me.tomassetti.turin.resolvers.SymbolResolver;
import me.tomassetti.turin.parser.ast.Node;
import me.tomassetti.turin.parser.ast.typeusage.TypeUsageNode;
import me.tomassetti.turin.symbols.FormalParameter;
import java.util.List;
import java.util.Optional;
public class FieldAccess extends Expression {
private Expression subject;
private String field;
public Expression getSubject() {
return subject;
}
public String getField() {
return field;
}
public FieldAccess(Expression subject, String field) {
this.subject = subject;
this.subject.setParent(this);
this.field = field;
}
@Override
public String toString() {
return "FieldAccess{" +
"subject=" + subject +
", field='" + field + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
FieldAccess that = (FieldAccess) 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 JvmMethodDefinition findMethodFor(List<ActualParam> argsTypes, SymbolResolver resolver, boolean staticContext) {
return subject.calcType().getMethod(this.field, staticContext).get()
.internalInvokableDefinitionFor(argsTypes).get()
.asMethod().getJvmMethodDefinition();
}
@Override
public TypeUsageNode calcType() {
throw new UnsupportedOperationException();
}
@Override
public Iterable<Node> getChildren() {
return ImmutableList.of(subject);
}
@Override
public Optional<List<? extends FormalParameter>> findFormalParametersFor(InvokableExpr invokable) {
if (invokable instanceof Creation) {
//return Optional.of(typeDefinition.getConstructorParams(invokable.getActualParams(), resolver));
throw new UnsupportedOperationException();
} else if (invokable instanceof FunctionCall) {
return subject.calcType().asInvokable().internalInvokableDefinitionFor(invokable.getActualParams()).map(
(iid) -> iid.getFormalParameters());
} else {
throw new UnsupportedOperationException(invokable.getClass().getCanonicalName());
}
}
}