package is.L42.connected.withSafeOperators; import java.util.ArrayList; import java.util.List; import java.util.Optional; import ast.Ast; import ast.Ast.MethodSelector; import ast.Ast.Path; import ast.ExpCore.ClassB; import ast.ExpCore.ClassB.Member; import ast.ExpCore.ClassB.MethodImplemented; import ast.ExpCore.ClassB.MethodWithType; import ast.ExpCore.ClassB.NestedClass; import ast.Util.InfoAboutMs; import auxiliaryGrammar.Functions; import auxiliaryGrammar.Locator; import programReduction.Program; import auxiliaryGrammar.Locator.Kind; import tools.Assertions; class RenameAlsoDefinition extends RenameUsage{ public RenameAlsoDefinition(ClassB visitStart,CollectedLocatorsMap maps,Program p) { super(visitStart,maps,p);} public List<Member> liftMembers(List<Member> s) { List<Member>result1=super.liftMembers(s); List<Member>result2=new ArrayList<>(); for(Member m:result1){ Optional<Member> optM = Functions.getIfInDom(result2,m); if (!optM.isPresent()){result2.add(m);continue;} Member m2=optM.get(); result2.remove(m2); assert m.getClass()==m2.getClass(); _Sum.doubleSimmetricalMatch(null/*boh, null program, does it breaks?*/, visitStart,visitStart,result2,this.getLocator().getClassNamesPath(),m,m2); //remove clashes here } return result2; } public MethodWithType visit(MethodWithType mi){ if(mi.getMt().isRefine()){ mi=potentiallyRenameMethodImplementedHeader(super.visit(mi)); } return super.visit(mi); } private MethodWithType potentiallyRenameMethodImplementedHeader(MethodWithType mi) { assert mi.getMt().isRefine(); ClassB currentCb=this.getLocator().getLastCb(); Program ep=p;for(ClassB cbi:this.getLocator().getCbs()){ep=ep.evilPush(cbi);} //List<Path> supers = Program.getAllSupertypes(ep, currentCb); Path origin=Functions.originDecOf(ep,mi.getMs(),currentCb); Locator original=this.getLocator().copy(); boolean isOut=original.moveInPath(origin); if(isOut){return mi;} for(Locator pMx :maps.selectors){ assert pMx.kind()==Kind.Method; MethodSelector s=pMx.getLastMember().match( nc->{throw Assertions.codeNotReachable();}, mimpl->mimpl.getS(), mt->mt.getMs()); if(!mi.getMs().equals(s)){continue;} Locator renamed =pMx.copy(); renamed.toFormerNodeLocator(); if(!original.equals(renamed)){return mi;} MethodSelector ms2=(MethodSelector) pMx.getAnnotation(); return mi.withMs(ms2); } return mi; } public ClassB.NestedClass visit(ClassB.NestedClass nc){ //System.out.println("visitNestedClass "+nc.getName()); Locator current=this.getLocator().copy(); current.pushMember(nc); for(Locator nl:maps.nesteds){ if(!(nl.getAnnotation() instanceof Ast.C)){continue;} if(!nl.equals(current)){continue;} assert nl.getAnnotation() instanceof Ast.C:nl.getAnnotation(); return super.visit(nc.withName((Ast.C)nl.getAnnotation())); } return super.visit(nc); } }