package is.L42.connected.withSafeOperators; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Optional; import tools.Assertions; import tools.Map; import ast.Ast; import ast.Ast.MethodSelectorX; import ast.ExpCore; import ast.Ast.MethodSelector; import ast.Ast.NormType; import ast.Ast.Path; import ast.ExpCore.Block; import ast.ExpCore.ClassB; import ast.ExpCore.ClassB.MethodImplemented; import ast.ExpCore.MCall; import ast.Util; import ast.ExpCore.Block.Dec; import ast.ExpCore.Block.On; import ast.ExpCore.ClassB.Member; import ast.ExpCore.ClassB.MethodWithType; import ast.Util.InfoAboutMs; import ast.Util.PathMxMx; import auxiliaryGrammar.Functions; import auxiliaryGrammar.Locator; import auxiliaryGrammar.Locator.Kind; import programReduction.Program; import coreVisitors.CloneVisitorWithProgram; import coreVisitors.From; public class RenameUsage extends MethodPathCloneVisitor { RenameUsage(ClassB visitStart,CollectedLocatorsMap maps,Program p) { super(visitStart,maps,p); } public MethodSelector mSToReplaceOrNull(MethodSelector original,Path src){ assert src!=null; List<Locator> filtered=new ArrayList<>(); for(Locator pMx:maps.selectors){ MethodSelector mii=pMx.getLastMember().match( nc->{throw Assertions.codeNotReachable();}, mi->mi.getS(), mt->mt.getMs()); if(original.equals(mii)){filtered.add(pMx);} } if(filtered.isEmpty()){return null;} Locator pathOriginal=this.getLocator().copy(); pathOriginal.toFormerNodeLocator(); boolean isIn=pathOriginal.auxMoveInPath(src);//for both ms in methods and in htypes if(!isIn){return null;} for(Locator pMx:filtered){ Locator pathDef=pMx.copy(); pathDef.toFormerNodeLocator(); if(!pathDef.equals(pathOriginal)){continue;} return (MethodSelector)pMx.getAnnotation(); } return null; } @Override public MethodSelector visitMS(MethodSelector original,Path src){ MethodSelector result=mSToReplaceOrNull(original,src); if(result==null){ return original;} return result; } }