package programReduction; import java.util.List; import ast.Ast; import ast.Ast.Position; import ast.ExpCore; import ast.ExpCore.ClassB; import ast.ExpCore.ClassB.Member; import ast.ExpCore.ClassB.NestedClass; import coreVisitors.IsCompiled; import tools.Assertions; public class CtxL { ExpCore.ClassB origin; int pos; CtxC ctx; CtxL(ExpCore.ClassB origin,int pos,CtxC ctx){ this.origin=origin; this.pos=pos; this.ctx=ctx; } public ExpCore.ClassB fillHole(ExpCore hole){ Member m=origin.getMs().get(pos); m=m.withInner(ctx.fillHole(hole)); return origin.withMember(m); } public ExpCore originalHole(){return ctx.originalHole();} public CtxL divide(ExpCore.ClassB all){ Member m=all.getMs().get(pos);//already checking there are enough members CtxC divided=ctx.divide(m.getInner()); return new CtxL(all,pos,divided); } public Member originalCtxM(){return origin.getMs().get(pos);} public String nameWhereThereisTheHole(){ Member m = this.origin.getMs().get(this.pos); return m.match( nc->nc.getName().toString(), mi->mi.getS().toString(), mwt->mwt.getMs().toString()); } public String toString() {return "CtxL["+sugarVisitors.ToFormattedText.of(this.fillHole(new ExpCore.X(Position.noInfo,"_HOLE_")))+",originalHole:"+sugarVisitors.ToFormattedText.of(this.originalHole())+"]";} public int hashCode() {return this.fillHole(new ExpCore.WalkBy()).hashCode();} public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; CtxL other = (CtxL) obj; ExpCore oE=other.fillHole(new ExpCore.WalkBy()); ExpCore thisE=this.fillHole(new ExpCore.WalkBy()); return thisE.equals(oE); } public static CtxL _split (ExpCore.ClassB l){ int pos=firstNotCompiled(l.getMs()); if(pos==l.getMs().size()){return null;} Member m=l.getMs().get(pos); ExpCore inner=m.getInner(); boolean metaReady=m instanceof NestedClass && IsCompiled.of(m.getInner()); CtxC innerSplit; if(metaReady){innerSplit=CtxC.hole(inner);} else {innerSplit=CtxC.split(inner);} return new CtxL(l,pos,innerSplit); } public static CtxL split (ExpCore.ClassB l,Ast.C c){ int pos=findC(l,c); CtxC ctx=CtxC.hole(l.getMs().get(pos).getInner()); return new CtxL(l,pos,ctx); } private static int findC(ExpCore.ClassB l,Ast.C c){ int i=0; for(Member m:l.getMs()){ if (m instanceof ExpCore.ClassB.NestedClass && ((ExpCore.ClassB.NestedClass)m).getName().equals(c)){ return i; } i++; } throw Assertions.codeNotReachable(); } private static int firstNotCompiled(List<Member> ms) { for(int i=0;i<ms.size();i++){ if (!IsCompiled.of(ms.get(i))){return i;} } return ms.size(); } }