package is.L42.connected.withSafeOperators; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import tools.Assertions; import ast.Ast; import ast.Ast.Doc; import ast.Ast.Mdf; import ast.Ast.MethodSelector; import ast.ExpCore.ClassB; import ast.ExpCore.ClassB.Member; import ast.ExpCore.ClassB.MethodWithType; import ast.Util.InvalidMwtAsState; import auxiliaryGrammar.Functions; import programReduction.Program; import facade.Configuration; import platformSpecific.javaTranslation.Resources; public class AddDocumentation { public static ClassB addDocumentationOnMethod (Program p,ClassB cb, List<Ast.C> cs,MethodSelector sel,Doc doc){ Errors42.checkExistsPathMethod(cb, cs, Optional.of(sel)); if(cs.isEmpty()){cb=auxAddDocOnMethod(p,cb,sel,doc);} else{ Program p1=p.evilPush(cb); if(cs.size()>1){p1=p1.navigate(cs.subList(0, cs.size()-1));} Program p2=p1; cb= cb.onClassNavigateToPathAndDo(cs,cbi->auxAddDocOnMethod(p2,cbi,sel,doc)); } return cb; } private static ClassB auxAddDocOnMethod(Program p,ClassB cb, MethodSelector sel, Doc doc) { List<Member> newMs=new ArrayList<>(cb.getMs()); Member m=Functions.getIfInDom(newMs, sel).get(); //add comment m.match( nc->{throw Assertions.codeNotReachable();}, mi->{throw Assertions.codeNotReachable();}, mt-> { mt=mt.withDoc(mt.getDoc().sum(doc)); Functions.replaceIfInDom(newMs,mt); return null; } ); //create new class return cb.withMs(newMs); } public static ClassB addDocumentationOnNestedClass (Program p,ClassB cb, List<Ast.C> cs,Doc doc){ if(cs.isEmpty()){throw Errors42.errorInvalidOnTopLevel();} Errors42.checkExistsPathMethod(cb, cs, Optional.empty()); cb= cb.onNestedNavigateToPathAndDo( cs, nc->Optional.of(nc.withDoc(nc.getDoc().sum(doc)))); return cb; } }