package org.enumerable.lambda.support.extra166y; import java.io.FileOutputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.reflect.Method; import java.lang.reflect.TypeVariable; import org.enumerable.lambda.annotation.NewLambda; import org.enumerable.lambda.exception.LambdaWeavingNotEnabledException; import extra166y.Ops; class LambdaOpsGenerator { public static void main(String[] args) throws Exception { StringWriter stringWriter = new StringWriter(); PrintWriter out = new PrintWriter(stringWriter); out.println("package lambda.extra166y;"); out.println(""); out.println("import " + NewLambda.class.getName() + ";"); out.println("import " + LambdaWeavingNotEnabledException.class.getName() + ";"); out.println("import " + Ops.class.getName() + ".*;"); out.println(); out.println("/**"); out.println(" * This is class is similar {@link lambda.Lambda}, but instead of creating"); out.println(" * lambdas inheriting from {@link lambda.Fn0} it creates lambdas implementing"); out.println(" * the interfaces defined in {@link extra166y.Ops}, to be used together with"); out.println(" * {@link extra166y.ParallelArray}."); out.println(" * <p>"); out.println(" * <i>This file was generated by " + LambdaOpsGenerator.class.getName() + ".</i>"); out.println(" */"); out.println("public class LambdaOps {"); for (Class<?> anInterface : Ops.class.getClasses()) { out.println(""); out.println(" @NewLambda"); out.print(" public static "); TypeVariable<?>[] typeParameters = anInterface.getTypeParameters(); if (typeParameters.length > 0) { out.print("<"); for (int i = 0; i < typeParameters.length; i++) { out.print(typeParameters[i].getName()); if (i < typeParameters.length - 1) out.print(", "); } out.print("> "); } out.print(anInterface.getSimpleName()); if (typeParameters.length > 0) { out.print("<"); for (int i = 0; i < typeParameters.length; i++) { out.print(typeParameters[i].getName()); if (i < typeParameters.length - 1) out.print(", "); } out.print(">"); } String simpleName = anInterface.getSimpleName(); if (simpleName.endsWith("Procedure")) out.print(" procedure("); else if (simpleName.endsWith("Reducer")) out.print(" reducer("); else if (simpleName.endsWith("Comparator")) out.print(" comparator("); else if (simpleName.endsWith("Action")) out.print(" action("); else if (simpleName.endsWith("Generator")) out.print(" op("); else if (simpleName.endsWith("Predicate")) out.print(" op("); else out.print(" op("); Method op = anInterface.getMethods()[0]; Class<?>[] parameterTypes = op.getParameterTypes(); int arg = 1; int typeParameter = 0; for (int i = 0; i < parameterTypes.length; i++) { Class<?> parameterType = parameterTypes[i]; if (parameterType == Object.class) { int index = typeParameter == typeParameters.length ? typeParameters.length - 1 : typeParameter++; out.print(typeParameters[index].getName()); } else out.print(parameterType.getName()); out.print(" a" + arg++); if (i < parameterTypes.length - 1) out.print(", "); } Class<?> returnType = op.getReturnType(); int index = typeParameter == typeParameters.length ? typeParameters.length - 1 : typeParameter; if (parameterTypes.length != 0) out.print(", "); out.print(returnType == Void.TYPE ? "Object block" : (returnType == Object.class ? typeParameters[index].getName() : returnType.getName()) + " block"); out.println(") {"); out.println(" throw new LambdaWeavingNotEnabledException();"); out.println(" }"); } out.println("}"); FileOutputStream f = new FileOutputStream("src/main/java/lambda/extra166y/LambdaOps.java"); f.write(stringWriter.toString().getBytes("UTF-8")); f.close(); System.out.println(stringWriter); } }