package synthesijer.ast.expr;
import java.util.ArrayList;
import synthesijer.ast.Expr;
import synthesijer.ast.Scope;
import synthesijer.ast.Type;
import synthesijer.ast.Variable;
import synthesijer.ast.type.PrimitiveTypeKind;
public class FieldAccess extends Expr{
Expr selected;
Ident ident;
public FieldAccess(Scope scope){
super(scope);
}
public void setSelected(Expr selected){
this.selected = selected;
}
public Expr getSelected(){
return this.selected;
}
public void setIdent(Ident ident){
this.ident = ident;
}
public Ident getIdent(){
return ident;
}
public void accept(SynthesijerExprVisitor v){
v.visitFieldAccess(this);
}
@Override
public boolean isConstant() {
return false;
}
public String toString(){
return "FieldAccess: " + ident;
}
@Override
public boolean isVariable() {
//return false;
return true;
}
@Override
public Type getType(){
if(selected instanceof Ident){
Variable v = getScope().search(((Ident)selected).getSymbol());
if(v != null){
return v.getType();
}else{
return PrimitiveTypeKind.UNDEFINED;
}
}else{
throw new RuntimeException("Unsupported multi- field access");
}
}
@Override
public Variable[] getSrcVariables(){
ArrayList<Variable> list = new ArrayList<>();
for(Variable var: selected.getSrcVariables()) list.add(var);
for(Variable var: ident.getSrcVariables()) list.add(var);
return list.toArray(new Variable[]{});
}
@Override
public Variable[] getDestVariables(){
ArrayList<Variable> list = new ArrayList<>();
for(Variable var: selected.getSrcVariables()) list.add(var);
return list.toArray(new Variable[]{});
}
@Override
public boolean hasMethodInvocation() {
//return selected.hasMethodInvocation();
return true;
}
}