package com.pixelmaid.dresscode.antlr.types.tree;
import com.pixelmaid.dresscode.antlr.types.VarType;
import com.pixelmaid.dresscode.drawing.primitive2d.Drawable;
import java.util.ArrayList;
import java.util.List;
public class BlockNode extends NodeEvent implements DCNode {
private List<DCNode> statements;
private DCNode returnStatement;
public BlockNode() {
statements = new ArrayList<DCNode>();
returnStatement = null;
}
public void addReturn(DCNode stat) {
returnStatement = stat;
}
public void addStatement(DCNode stat) {
statements.add(stat);
//System.out.println("added statement, size="+statements.size());
}
@Override
public VarType evaluate(){
Drawable d = new Drawable();
boolean drawAdded=false;
for(int i=0;i<statements.size(); i++){
VarType value = statements.get(i).evaluate();
if(value != VarType.VOID) {
// return early from this block if value is a return statement
//return value;
}
//if value is drawable then add it to master drawable and remove it from the canvas
if (value.isDrawable()){
d = value.asDrawable();
drawAdded=true;
}
}
// return VOID or returnStatement.evaluate() if it's not null
if(returnStatement ==null){
if(drawAdded){
//TODO: add actual line number instead of 0 here
return new VarType(d);
}
else{
return VarType.VOID;
}
}
else{
return returnStatement.evaluate();
}
}
@Override
public String toString() {
StringBuilder b = new StringBuilder();
for(DCNode stat : statements) {
b.append(stat).append("\n");
}
if(returnStatement != null) {
b.append("return ").append(returnStatement).append("\n");
}
return b.toString();
}
}