package io.trygvis.persistence.generators; import io.trygvis.container.compiler.model.FieldRef; import io.trygvis.container.compiler.model.MethodRef; import io.trygvis.container.compiler.model.Parameters; import io.trygvis.container.compiler.model.TypeRef; import java.io.CharArrayWriter; import java.io.PrintWriter; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; import static java.lang.reflect.Modifier.*; import static org.apache.commons.lang.StringUtils.join; public class GeneratorUtils { public static FieldRef staticVersion(TypeRef interfaceType, String interfaceMethod, MethodRef methodRef, TypeRef klass) { if (!Modifier.isStatic(methodRef.modifiers)) { throw new RuntimeException("This only works on static methods."); } List params = new ArrayList<>(); List args = new ArrayList<>(); for (Parameters.ParameterRef parameter : methodRef.parameters) { params.add(parameter.klass.plainName + " " + parameter.name); args.add(parameter.name); } List exceptions = new ArrayList<>(); for (TypeRef exception : methodRef.exceptions) { exceptions.add(exception.plainName); } String e = exceptions.isEmpty() ? "" : "throws " + join(exceptions, ", ") + " "; CharArrayWriter buffer = new CharArrayWriter(); PrintWriter w = new PrintWriter(buffer); w.println("new " + interfaceType.plainName + "() {"); w.println(" public " + methodRef.returnType.plainName + " " + interfaceMethod + "(" + join(params, ", ") + ") " + e + "{"); w.println(" return " + klass.plainName + "." + methodRef.name + "(" + join(args, ", ") + ");"); w.println(" }"); w.println("}"); return new FieldRef(PUBLIC | STATIC | FINAL, interfaceType, methodRef.name).value(buffer.toString()); } }