package synthesijer.ast.expr; import java.util.ArrayList; import synthesijer.ast.Expr; import synthesijer.ast.Op; import synthesijer.ast.Scope; import synthesijer.ast.Type; import synthesijer.ast.Variable; public class BinaryExpr extends Expr{ private Expr lhs, rhs; private Op op; public BinaryExpr(Scope scope){ super(scope); } public void setLhs(Expr expr){ this.lhs = expr; } public void setRhs(Expr expr){ this.rhs = expr; } public void setOp(Op op){ this.op = op; } public Expr getLhs(){ return this.lhs; } public Expr getRhs(){ return this.rhs; } public Op getOp(){ return this.op; } public void accept(SynthesijerExprVisitor v){ v.visitBinaryExpr(this); } public String toString(){ return String.format("BinaryExpr::(%s %s %s)", op, lhs, rhs); } @Override public boolean isConstant() { return rhs.isConstant() && lhs.isConstant(); } @Override public boolean isVariable() { return lhs.isVariable() && rhs.isVariable(); } @Override public Type getType(){ Type r = rhs.getType(); Type l = lhs.getType(); // return r.isPrimary(l) ? r : l; // select primary type return r; } @Override public Variable[] getSrcVariables(){ ArrayList<Variable> list = new ArrayList<>(); if(op != Op.ASSIGN){ for(Variable var: lhs.getSrcVariables()) list.add(var); } for(Variable var: rhs.getSrcVariables()) list.add(var); return list.toArray(new Variable[]{}); } @Override public Variable[] getDestVariables(){ ArrayList<Variable> list = new ArrayList<>(); if(op == Op.ASSIGN){ for(Variable var: lhs.getSrcVariables()) list.add(var); } return list.toArray(new Variable[]{}); } @Override public boolean hasMethodInvocation() { return lhs.hasMethodInvocation() || rhs.hasMethodInvocation(); } }