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 NewArray extends Expr{
private ArrayList<Expr> dimExpr = new ArrayList<>();
private ArrayList<Expr> elemExpr = new ArrayList<>();
public NewArray(Scope scope){
super(scope);
}
public void addDimExpr(Expr expr){
if(expr instanceof Literal){
dimExpr.add(expr);
}else if(expr instanceof Ident){
String sym = ((Ident)expr).getSymbol();
Variable var = getScope().search(sym);
dimExpr.add(var.getInitExpr());
}else{
dimExpr.add(expr);
}
}
public ArrayList<Expr> getDimExpr(){
return dimExpr;
}
public void accept(SynthesijerExprVisitor v){
v.visitNewArray(this);
}
public void addElem(Expr expr){
elemExpr.add(expr);
}
public ArrayList<Expr> getElems(){
return elemExpr;
}
@Override
public boolean isConstant() {
return false;
}
@Override
public boolean isVariable() {
return false;
}
@Override
public Type getType() {
return PrimitiveTypeKind.ARRAY;
}
@Override
public Variable[] getSrcVariables(){
ArrayList<Variable> list = new ArrayList<>();
for(Expr expr: dimExpr){
for(Variable var: expr.getSrcVariables()) list.add(var);
}
for(Expr expr: elemExpr){
for(Variable var: expr.getSrcVariables()) list.add(var);
}
return list.toArray(new Variable[]{});
}
@Override
public Variable[] getDestVariables(){
return new Variable[]{};
}
@Override
public boolean hasMethodInvocation() {
for(Expr expr: dimExpr){
if(expr.hasMethodInvocation()) return true;
}
for(Expr expr: elemExpr){
if(expr.hasMethodInvocation()) return true;
}
return false;
}
}