package coreVisitors; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Optional; import tools.Assertions; import tools.Map; import ast.ExpCore; import ast.ExpCore.Block; import ast.ExpCore.Block.On; import ast.ExpCore.WalkBy; import ast.ExpCore.X; public class RenameVars extends CloneVisitor{ HashMap<String,String> toRename; RenameVars(HashMap<String,String> toRename){this.toRename=toRename;} public ExpCore visit(WalkBy s) {throw Assertions.codeNotReachable();} public ExpCore visit(ExpCore.ClassB s) {return s;} public static ExpCore of(ExpCore e,HashMap<String,String> toRename){ return e.accept(new RenameVars(toRename)); } public ExpCore visit(X s) { String alt=toRename.get(s.getInner()); if(alt==null){return s;} return new X(s.getP(),alt); } public ExpCore visit(Block s) { List<On> k = Map.of(this::liftO,s.getOns()); List<On>newK=new ArrayList<>(); for (On on : k){ String altK=toRename.get(on.getX()); if(altK!=null){newK.add(on.withX(altK));} else{newK.add(on);} } List<Block.Dec> decs = new ArrayList<>(); for(Block.Dec dec:s.getDecs()){ String altxi=toRename.get(dec.getX()); if(altxi==null){decs.add(dec);} else {decs.add(dec.withX(altxi));} } return new Block(s.getDoc(),Map.of(this::liftDec,decs),lift(s.getInner()),newK,s.getP()); } }