package sugarVisitors; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Set; import ast.Ast; import ast.Expression; import ast.Ast.ConcreteHeader; import ast.Ast.Doc; import ast.Ast.Path; import ast.Ast.Type; import ast.Expression.ClassB; import ast.Expression.ClassReuse; import ast.Expression.ClassB.Member; import ast.Expression.ClassB.NestedClass; public class DesugarPaths extends CloneVisitor{ public static Expression of(Expression e){ DesugarPaths d=new DesugarPaths(); Expression result= e.accept(d); return result; } ArrayList<ClassB> p=new ArrayList<ClassB>(); public Expression visit(ClassReuse s) { ClassB res=s.getInner();//lift(s.getInner()); ArrayList<ClassB> oldP = this.p; this.p=new ArrayList<ClassB>(); try{res=(ClassB) res.accept(this);} finally{this.p=oldP;} return s.withInner(res); } public Expression visit(ClassB s) { try{ p.add(0,s); s=(ClassB)super.visit(s); return s; } finally{p.remove(0); } } @Override protected Path liftP(Path s) { if(s.isCore()|| s.isPrimitive()){return s;} List<Ast.C> rd =s.sugarNames(); assert !rd.isEmpty(); Ast.C key=rd.get(0); int index = searchForScope(key); if(index==-1){index=0;}//TODO: is what we want? not to the nearest reuse? return Path.outer(index,rd); } private int searchForScope(Ast.C key) { assert !key.toString().equals("This"); int index=-1; for(ClassB cb:p){ index+=1; //if (cb.getH()) for(Member m:cb.getMs()){ if(!(m instanceof NestedClass)){continue;} NestedClass nc=(NestedClass)m; if(!nc.getName().equals(key)){continue;} return index; } } return index; } }