package coreVisitors;
import java.util.Optional;
import java.util.Set;
import tools.Map;
import ast.Ast;
import ast.ExpCore;
import ast.ExpCore.Block;
import ast.ExpCore.Block.Dec;
public class NormalizeBlocks extends CloneVisitor{
private Dec isTxEx(Block s){
if(!s.getOns().isEmpty()){return null;}
if(s.getDecs().size()!=1){return null;}
Dec dec=s.getDecs().get(0);
if(!(s.getInner() instanceof ExpCore.X)){return null;}
String x=((ExpCore.X)s.getInner()).getInner();
if(!x.equals(dec.getX())){return null;}
return dec;
}
public ExpCore visit(Block s) {
//I think reduction take care of catch already
if(s.getOns().isEmpty()&& s.getDecs().size()==0){ //(e)-->e
return s.getInner().accept(this);
}
Dec decOut=this.isTxEx(s);
if(decOut!=null && decOut.getInner() instanceof Block){//(T x=(T y= e y) x)->(T y= e y)
Dec decIn=this.isTxEx((Block)decOut.getInner());
if(validDoubleWrap(decOut,decIn)){return decIn.getInner().accept(this);}
}
return super.visit(s);
}
private boolean validDoubleWrap(Dec decOut, Dec decIn) {
if(decIn==null){return false;}
if(decOut.getT().equals(decIn.getT())){
Set<String> fvIn = coreVisitors.FreeVariables.of(decIn.getInner());
if(fvIn.contains(decOut.getX())){return false;}
return true;//to put breakpoint
}
return false;
}
public static ExpCore of(ExpCore e) {
return e.accept(new NormalizeBlocks());
}
}