package sugarVisitors;
import java.util.List;
import ast.Ast;
import ast.Ast.Path;
import ast.Ast.VarDec;
import ast.ErrorMessage;
import ast.Expression;
import ast.Expression.*;
import ast.Expression.With.On;
public class CheckTerminatingBlock implements Visitor<Void> {
private CurlyBlock start;
private CheckTerminatingBlock(CurlyBlock start) {this.start = start;}
public static void of(CurlyBlock s) {
s.accept(new CheckTerminatingBlock(s));
}
public Void visit(Signal s) {return null;}
public Void visit(Loop s) {return null;}
public Void visit(If s) {
s.getThen().accept(this);
if(s.get_else().isPresent()){s.get_else().get().accept(this);}
else{return fail(s);}
return null;
}
public Void visit(With s) {
if(!s.getIs().isEmpty()){return fail(s);}
if(s.getDefaultE().isPresent()){s.getDefaultE().get().accept(this);}
for(On on:s.getOns()){
on.getInner().accept(this);
}
return null;
}
public Void visit(RoundBlock s) {
checkBlockContent(s.getContents());
return s.getInner().accept(this);
}
public Void visit(CurlyBlock s) {
checkBlockContent(s.getContents());
Expression.BlockContent bc = s.getContents().get(s.getContents().size()-1);
VarDec dec = bc.getDecs().get(bc.getDecs().size()-1);
if(!(dec instanceof Ast.VarDecE)){return fail(s);}
Ast.VarDecE decE=(Ast.VarDecE)dec;
return decE.getInner().accept(this);
}
public void checkBlockContent(List<Expression.BlockContent> l) {
for( Expression.BlockContent c:l){
if(c.get_catch().isEmpty()){continue;}
for( Expression.Catch ki : c.get_catch()){
if(ki instanceof Expression.CatchProp){continue;}
ki.getInner().accept(this);
}
}
}
private Void fail(Expression s){
throw new ErrorMessage.NotWellFormedMsk(s, this.start, "The expression is not a valid terminator for the block");
}
public Void visit(X s) {return fail(s);}
public Void visit(BinOp s) {return fail(s);}
public Void visit(DocE s) {return fail(s);}
public Void visit(UnOp s) {return fail(s);}
public Void visit(MCall s) {return fail(s);}
public Void visit(FCall s) {return fail(s);}
public Void visit(SquareCall s) {return fail(s);}
public Void visit(SquareWithCall s) {return fail(s);}
public Void visit(UseSquare s) {return fail(s);}
public Void visit(Using s) {return fail(s);}
public Void visit(ClassB s) {return fail(s);}
public Void visit(DotDotDot s) {return fail(s);}
public Void visit(WalkBy s) {return fail(s);}
public Void visit(_void s) {return fail(s);}
public Void visit(Literal s) {return fail(s);}
public Void visit(While s) {return fail(s);}
public Void visit(Expression.EPath s) {return fail(s);}
public Void visit(ClassReuse s) {return fail(s);}
public Void visit(ContextId s) {return fail(s);}
}