package sugarVisitors;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import tools.Map;
import ast.Ast.Doc;
import ast.Ast.MethodSelector;
import ast.Ast.Parameters;
import ast.Ast.ConcreteHeader;
import ast.Ast.FieldDec;
import ast.Ast.Header;
import ast.Ast.HistoricType;
import ast.Ast.MethodType;
import ast.Ast.NormType;
import ast.Ast.Path;
import ast.Ast.Type;
import ast.Ast.VarDec;
import ast.Ast;
import ast.Expression;
import ast.Expression.ClassB.Member;
import ast.Expression.*;
import ast.Expression.ClassB.*;
public class PropagatorVisitor implements Visitor<Void>{
protected void lift(Expression e){ e.accept(this); }
protected void liftP(Path p){}
protected void liftT(Type t){
t.match(
nt->{
liftP(nt.getPath());
liftDoc(nt.getDoc());
return null;},
ht->{
liftP(ht.getPath());
ht.getSelectors().forEach(this::liftMsX);
liftDoc(ht.getDoc());
return null;}
);
}
protected void liftK(Expression.Catch k){
if (k instanceof DesugarCatchDefault.CatchToComplete){
this.liftK(((DesugarCatchDefault.CatchToComplete) k).catch1);
}
k.match(
k1->{
liftT(k1.getT());
lift(k1.getInner());
return null;},
kM->{
kM.getTs().forEach(this::liftT);
lift(kM.getInner());
return null;},
kP->{
kP.getTs().forEach(this::liftT);
lift(kP.getInner());
return null;}
);
}
protected void liftO(Expression.With.On on){
on.getTs().forEach(this::liftT);
lift(on.getInner());
}
protected void liftH(Header h) {
h.match(
ch->{
ch.getFs().forEach(this::liftF);
return null;
}, th->th, ih->ih);
}
protected void liftF(FieldDec f) {
liftT(f.getT());
liftDoc(f.getDoc());
}
protected void liftDoc(Doc doc) {
doc.getAnnotations().forEach(ann->{
if(ann instanceof Path){
this.liftP((Path)ann);
}});
}
protected void liftBC(Expression.BlockContent c) {
liftVarDecs(c.getDecs());
this.liftKs(c.get_catch());
}
protected void liftKs(List<Catch> ks) {
for(Catch k:ks){liftK(k);}
}
protected void liftVarDecs(List<ast.Ast.VarDec> ds) {
for(VarDec d:ds){this.liftVarDec(d);}
}
protected void liftVarDec(ast.Ast.VarDec d) {
d.match(
_d->{this.liftVarDecXE(_d);return null;},
_d->{this.liftVarDecE(_d);return null;},
_d->{this.liftVarDecCE(_d);return null;}
);
}
protected void liftVarDecXE(ast.Ast.VarDecXE d) {
d.getT().ifPresent(this::liftT);
lift(d.getInner());
}
protected void liftVarDecE(ast.Ast.VarDecE d) {
lift(d.getInner());
}
protected void liftVarDecCE(ast.Ast.VarDecCE d) {
this.visit(d.getInner());
}
protected void liftM(Member m) {
m.match(
nc->{visit(nc); return null;},
mi->{visit(mi); return null;},
mt->{visit(mt); return null;}
);
}
public void visit(NestedClass nc){
liftDoc(nc.getDoc());
lift(nc.getInner());
}
public void visit(MethodImplemented mi){
liftDoc(mi.getDoc());
liftMs(mi.getS());
lift(mi.getInner());
}
public void visit(MethodWithType mt){
liftDoc(mt.getDoc());
liftMs(mt.getMs());
liftMT(mt.getMt());
mt.getInner().ifPresent(this::lift);
}
protected void liftMs(MethodSelector ms) {}
protected void liftMsX(Ast.MethodSelectorX msx) {
liftMs(msx.getMs());
}
protected void liftMT(MethodType mt) {
mt.getTs().forEach(this::liftT);
liftT(mt.getReturnType());
mt.getExceptions().forEach(this::liftT);
}
public Void visit(Expression.EPath s) {liftP(s.getInner());return null;}
public Void visit(X s) { return null;}
public Void visit(_void s) {return null;}
public Void visit(WalkBy s) {return null;}
public Void visit(Using s) {
liftP(s.getPath());
liftDoc(s.getDocs());
liftPs(s.getPs());
lift(s.getInner());
return null;
}
protected void liftPs(Parameters ps) {
ps.getE().ifPresent(this::lift);
ps.getEs().forEach(this::lift);
}
public Void visit(Signal s) {
lift(s.getInner());
return null;
}
public Void visit(Loop s) {
lift(s.getInner());
return null;
}
public Void visit(MCall s) {
lift(s.getReceiver());
liftDoc(s.getDoc());
liftPs(s.getPs());
return null;
}
public Void visit(ClassB s) {
liftH(s.getH());
s.getFields().forEach(this::liftF);
s.getSupertypes().forEach(this::liftT);
s.getMs().forEach(this::liftM);
liftDoc(s.getDoc1());
return null;
}
public Void visit(If s) {
lift(s.getCond());
lift(s.getThen());
s.get_else().ifPresent(this::lift);
return null;
}
public Void visit(While s) {
lift(s.getCond());
lift(s.getThen());
return null;
}
public Void visit(With s) {
s.getIs().forEach(this::liftVarDecXE);
s.getDecs().forEach(this::liftVarDecXE);
s.getOns().forEach(this::liftO);
s.getDefaultE().ifPresent(this::lift);
return null;
}
public Void visit(BinOp s) {
lift(s.getLeft());
lift(s.getRight());
return null;
}
public Void visit(DocE s) {
lift(s.getInner());
liftDoc(s.getDoc());
return null;
}
public Void visit(UnOp s) {
lift(s.getInner());
return null;
}
public Void visit(FCall s) {
lift(s.getReceiver());
liftDoc(s.getDoc());
liftPs(s.getPs());
return null;
}
public Void visit(SquareCall s) {
lift(s.getReceiver());
liftDoc(s.getDoc());
s.getDocs().forEach(this::liftDoc);
s.getPss().forEach(this::liftPs);
return null;
}
public Void visit(SquareWithCall s) {
lift(s.getReceiver());
lift(s.getWith());
return null;
}
public Void visit(UseSquare s) {
lift(s.getInner());
return null;
}
public Void visit(RoundBlock s) {
s.getContents().forEach(this::liftBC);
lift(s.getInner());
liftDoc(s.getDoc());
return null;
}
public Void visit(CurlyBlock s) {
liftDoc(s.getDoc());
s.getContents().forEach(this::liftBC);
return null;
}
public Void visit(DotDotDot s) {
return null;
}
public Void visit(Literal s) {
lift(s.getReceiver());
return null;
}
public Void visit(ClassReuse s) {
lift(s.getInner());
return null;
}
public Void visit(ContextId s) {
return null;
}
}