Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.64 KB | None | 0 0
  1. package io.github.socraticphoenix.inversey.generator;
  2.  
  3. import io.github.socraticphoenix.inversey.interfaces.ConsumerX;
  4. import io.github.socraticphoenix.inversey.interfaces.DangerousConsumerX;
  5. import io.github.socraticphoenix.inversey.interfaces.DangerousFunctionX;
  6. import io.github.socraticphoenix.inversey.interfaces.FunctionX;
  7. import io.github.socraticphoenix.jource.ast.annotation.JavaSourceAnnotation;
  8. import io.github.socraticphoenix.jource.ast.block.JavaSourceIfBlock;
  9. import io.github.socraticphoenix.jource.ast.definition.JavaSourceInterfaceDefinition;
  10. import io.github.socraticphoenix.jource.ast.member.JavaSourceMethod;
  11. import io.github.socraticphoenix.jource.ast.member.JavaSourceParameter;
  12. import io.github.socraticphoenix.jource.ast.modifier.JavaSourceModifier;
  13. import io.github.socraticphoenix.jource.ast.statement.JavaSourceReturnStatement;
  14. import io.github.socraticphoenix.jource.ast.statement.JavaSourceThrowStatement;
  15. import io.github.socraticphoenix.jource.ast.type.JavaSourceFilledGenerics;
  16. import io.github.socraticphoenix.jource.ast.type.JavaSourceGenerics;
  17. import io.github.socraticphoenix.jource.ast.type.JavaSourceNamespace;
  18. import io.github.socraticphoenix.jource.ast.value.JavaSourceArrayGet;
  19. import io.github.socraticphoenix.jource.ast.value.JavaSourceCast;
  20. import io.github.socraticphoenix.jource.ast.value.JavaSourceConstructorCall;
  21. import io.github.socraticphoenix.jource.ast.value.JavaSourceFieldReference;
  22. import io.github.socraticphoenix.jource.ast.value.JavaSourceLiteral;
  23. import io.github.socraticphoenix.jource.ast.value.JavaSourceMethodCall;
  24. import io.github.socraticphoenix.jource.ast.value.JavaSourceThisReference;
  25. import io.github.socraticphoenix.jource.ast.value.JavaSourceVariableReference;
  26. import io.github.socraticphoenix.jource.ast.value.operator.JavaSourceBinaryOperator;
  27. import io.github.socraticphoenix.jource.ast.value.operator.JavaSourceOperator;
  28. import io.github.socraticphoenix.jource.io.JavaSourceFile;
  29. import io.github.socraticphoenix.jource.io.JavaSourceFileSet;
  30.  
  31. import java.io.File;
  32. import java.io.IOException;
  33. import java.util.Arrays;
  34. import java.util.Collections;
  35.  
  36. public class FunctionGenerator {
  37. public static final int MAX_PARAMS = 255;
  38. public static final String PACKAGE = "io.github.socraticphoenix.inversey";
  39.  
  40. public static JavaSourceFileSet generateConsumers() {
  41. JavaSourceFileSet set = new JavaSourceFileSet();
  42. for (int i = 0; i < MAX_PARAMS; i++) {
  43. JavaSourceGenerics generics = JavaSourceGenerics.empty();
  44. JavaSourceMethod call = JavaSourceMethod.of(JavaSourceGenerics.empty(), JavaSourceNamespace.VOID, "accept");
  45. JavaSourceMethodCall arrayCall = JavaSourceMethodCall.of(JavaSourceThisReference.of(), "accept");
  46. JavaSourceNamespace dangerous = JavaSourceNamespace.of(PACKAGE + ".DangerousConsumer" + i, JavaSourceGenerics.empty(), false);
  47. JavaSourceFilledGenerics dangerousFilled = JavaSourceFilledGenerics.empty();
  48. dangerousFilled.addElement(JavaSourceFilledGenerics.Element.of(JavaSourceNamespace.of(RuntimeException.class).fill()));
  49.  
  50. for (int j = 0; j < i; j++) {
  51. String name = "P" + (j + 1);
  52. JavaSourceNamespace namespace = JavaSourceNamespace.of(name, JavaSourceGenerics.empty(), false);
  53. generics.set(name, Collections.emptyList());
  54. call.addParameter(JavaSourceParameter.of(namespace,
  55. name.toLowerCase()));
  56.  
  57. arrayCall.addParameter(JavaSourceCast.of(namespace, JavaSourceArrayGet.of(JavaSourceVariableReference.of("params"), JavaSourceLiteral.of(j))));
  58. dangerousFilled.addElement(JavaSourceFilledGenerics.Element.of(namespace.fill()));
  59. }
  60.  
  61. JavaSourceMethod array = JavaSourceMethod.of(JavaSourceGenerics.empty(), JavaSourceNamespace.VOID, "acceptArray");
  62. array.addParameter(JavaSourceParameter.of(JavaSourceNamespace.of(Object[].class), "params", true));
  63.  
  64. array.addStatement(JavaSourceIfBlock.ifBlock(JavaSourceBinaryOperator.of(
  65. JavaSourceFieldReference.of(JavaSourceVariableReference.of("params"), "length"),
  66. JavaSourceOperator.NOT_EQUAL,
  67. JavaSourceLiteral.of(i)
  68. )).addStatement(JavaSourceThrowStatement.of(JavaSourceConstructorCall.of(JavaSourceNamespace.of(IllegalArgumentException.class).fill())
  69. .addParameter(JavaSourceLiteral.of("Expected exactly " + i + " parameters")))));
  70. array.addStatement(arrayCall);
  71. array.addModifier(JavaSourceModifier.DEFAULT).addAnnotation(new JavaSourceAnnotation(Override.class));
  72.  
  73. JavaSourceMethod parameterCount = JavaSourceMethod.of(JavaSourceGenerics.empty(), JavaSourceNamespace.of(int.class).fill(), "parameterCount");
  74. parameterCount.addStatement(JavaSourceReturnStatement.of(JavaSourceLiteral.of(i)));
  75. parameterCount.addModifier(JavaSourceModifier.DEFAULT).addAnnotation(new JavaSourceAnnotation(Override.class));
  76.  
  77. JavaSourceInterfaceDefinition definition = new JavaSourceInterfaceDefinition(PACKAGE + ".Consumer" + i, generics);
  78. definition.addInterface(JavaSourceNamespace.of(ConsumerX.class).fill()).addInterface(dangerous.fill(dangerousFilled)).addModifier(JavaSourceModifier.PUBLIC)
  79. .addMethod(call).addMethod(array).addMethod(parameterCount);
  80. set.add(new JavaSourceFile(definition));
  81. }
  82.  
  83. return set;
  84. }
  85.  
  86. public static JavaSourceFileSet generateDangerousConsumers() {
  87. JavaSourceFileSet set = new JavaSourceFileSet();
  88. for (int i = 0; i < MAX_PARAMS; i++) {
  89. JavaSourceGenerics generics = JavaSourceGenerics.empty();
  90. generics.set("T", Arrays.asList(JavaSourceNamespace.of(Throwable.class).fill()));
  91. JavaSourceMethod call = JavaSourceMethod.of(JavaSourceGenerics.empty(), JavaSourceNamespace.VOID, "accept");
  92. JavaSourceMethodCall arrayCall = JavaSourceMethodCall.of(JavaSourceThisReference.of(), "accept");
  93. JavaSourceNamespace.Filled throwable = JavaSourceNamespace.of("T", JavaSourceGenerics.empty(), false).fill();
  94. call.addThrowable(throwable);
  95.  
  96. for (int j = 0; j < i; j++) {
  97. String name = "P" + (j + 1);
  98. JavaSourceNamespace namespace = JavaSourceNamespace.of(name, JavaSourceGenerics.empty(), false);
  99. generics.set(name, Collections.emptyList());
  100. call.addParameter(JavaSourceParameter.of(namespace,
  101. name.toLowerCase()));
  102.  
  103. arrayCall.addParameter(JavaSourceCast.of(namespace, JavaSourceArrayGet.of(JavaSourceVariableReference.of("params"), JavaSourceLiteral.of(j))));
  104. }
  105.  
  106. JavaSourceMethod array = JavaSourceMethod.of(JavaSourceGenerics.empty(), JavaSourceNamespace.VOID, "acceptArray");
  107. array.addParameter(JavaSourceParameter.of(JavaSourceNamespace.of(Object[].class), "params", true));
  108.  
  109. array.addStatement(JavaSourceIfBlock.ifBlock(JavaSourceBinaryOperator.of(
  110. JavaSourceFieldReference.of(JavaSourceVariableReference.of("params"), "length"),
  111. JavaSourceOperator.NOT_EQUAL,
  112. JavaSourceLiteral.of(i)
  113. )).addStatement(JavaSourceThrowStatement.of(JavaSourceConstructorCall.of(JavaSourceNamespace.of(IllegalArgumentException.class).fill())
  114. .addParameter(JavaSourceLiteral.of("Expected exactly " + i + " parameters")))));
  115. array.addStatement(arrayCall);
  116. array.addModifier(JavaSourceModifier.DEFAULT).addAnnotation(new JavaSourceAnnotation(Override.class));
  117. array.addThrowable(throwable);
  118.  
  119. JavaSourceMethod parameterCount = JavaSourceMethod.of(JavaSourceGenerics.empty(), JavaSourceNamespace.of(int.class).fill(), "parameterCount");
  120. parameterCount.addStatement(JavaSourceReturnStatement.of(JavaSourceLiteral.of(i)));
  121. parameterCount.addModifier(JavaSourceModifier.DEFAULT).addAnnotation(new JavaSourceAnnotation(Override.class));
  122.  
  123. JavaSourceInterfaceDefinition definition = new JavaSourceInterfaceDefinition(PACKAGE + ".DangerousConsumer" + i, generics);
  124. definition.addInterface(JavaSourceNamespace.of(DangerousConsumerX.class).fill(JavaSourceFilledGenerics.empty().addElement(JavaSourceFilledGenerics.Element.of(throwable)))).addModifier(JavaSourceModifier.PUBLIC)
  125. .addMethod(call).addMethod(array).addMethod(parameterCount);
  126. set.add(new JavaSourceFile(definition));
  127. }
  128.  
  129. return set;
  130. }
  131.  
  132. public static JavaSourceFileSet generateFunctions() {
  133. JavaSourceFileSet set = new JavaSourceFileSet();
  134. for (int i = 0; i < MAX_PARAMS; i++) {
  135. JavaSourceGenerics generics = JavaSourceGenerics.empty().set("R", Collections.emptyList());
  136. JavaSourceNamespace ret = JavaSourceNamespace.of("R", JavaSourceGenerics.empty(), false);
  137. JavaSourceFilledGenerics consumerGenerics = JavaSourceFilledGenerics.empty();
  138. JavaSourceMethod accept = JavaSourceMethod.of(JavaSourceGenerics.empty(), JavaSourceNamespace.VOID, "accept");
  139. JavaSourceMethodCall acceptCall = JavaSourceMethodCall.of(JavaSourceThisReference.of(), "apply");
  140. JavaSourceMethod call = JavaSourceMethod.of(JavaSourceGenerics.empty(), ret.fill(), "apply");
  141. JavaSourceMethodCall arrayCall = JavaSourceMethodCall.of(JavaSourceThisReference.of(), "apply");
  142. JavaSourceMethodCall acceptArrayCall = JavaSourceMethodCall.of(JavaSourceThisReference.of(), "accept");
  143. JavaSourceNamespace dangerous = JavaSourceNamespace.of(PACKAGE + ".DangerousFunction" + i, JavaSourceGenerics.empty(), false);
  144. JavaSourceFilledGenerics dangerousFilled = JavaSourceFilledGenerics.empty();
  145. dangerousFilled.addElement(JavaSourceFilledGenerics.Element.of(ret.fill()));
  146. dangerousFilled.addElement(JavaSourceFilledGenerics.Element.of(JavaSourceNamespace.of(RuntimeException.class).fill()));
  147.  
  148. for (int j = 0; j < i; j++) {
  149. String name = "P" + (j + 1);
  150. JavaSourceNamespace namespace = JavaSourceNamespace.of(name, JavaSourceGenerics.empty(), false);
  151. generics.set(name, Collections.emptyList());
  152. consumerGenerics.addElement(JavaSourceFilledGenerics.Element.of(namespace.fill()));
  153. call.addParameter(JavaSourceParameter.of(namespace,
  154. name.toLowerCase()));
  155. accept.addParameter(JavaSourceParameter.of(namespace,
  156. name.toLowerCase()));
  157. acceptCall.addParameter(JavaSourceVariableReference.of(name.toLowerCase()));
  158. arrayCall.addParameter(JavaSourceCast.of(namespace, JavaSourceArrayGet.of(JavaSourceVariableReference.of("params"), JavaSourceLiteral.of(j))));
  159. acceptArrayCall.addParameter(JavaSourceCast.of(namespace, JavaSourceArrayGet.of(JavaSourceVariableReference.of("params"), JavaSourceLiteral.of(j))));
  160. dangerousFilled.addElement(JavaSourceFilledGenerics.Element.of(namespace.fill()));
  161. }
  162.  
  163. JavaSourceMethod array = JavaSourceMethod.of(JavaSourceGenerics.empty(), ret.fill(), "applyArray");
  164. array.addParameter(JavaSourceParameter.of(JavaSourceNamespace.of(Object[].class), "params", true));
  165.  
  166. array.addStatement(JavaSourceIfBlock.ifBlock(JavaSourceBinaryOperator.of(
  167. JavaSourceFieldReference.of(JavaSourceVariableReference.of("params"), "length"),
  168. JavaSourceOperator.NOT_EQUAL,
  169. JavaSourceLiteral.of(i)
  170. )).addStatement(JavaSourceThrowStatement.of(JavaSourceConstructorCall.of(JavaSourceNamespace.of(IllegalArgumentException.class).fill())
  171. .addParameter(JavaSourceLiteral.of("Expected exactly " + i + " parameters")))));
  172. array.addStatement(JavaSourceReturnStatement.of(arrayCall));
  173. array.addModifier(JavaSourceModifier.DEFAULT).addAnnotation(new JavaSourceAnnotation(Override.class));
  174.  
  175. JavaSourceMethod acceptArray = JavaSourceMethod.of(JavaSourceGenerics.empty(), JavaSourceNamespace.VOID, "acceptArray");
  176. acceptArray.addParameter(JavaSourceParameter.of(JavaSourceNamespace.of(Object[].class), "params", true));
  177.  
  178. acceptArray.addStatement(JavaSourceIfBlock.ifBlock(JavaSourceBinaryOperator.of(
  179. JavaSourceFieldReference.of(JavaSourceVariableReference.of("params"), "length"),
  180. JavaSourceOperator.NOT_EQUAL,
  181. JavaSourceLiteral.of(i)
  182. )).addStatement(JavaSourceThrowStatement.of(JavaSourceConstructorCall.of(JavaSourceNamespace.of(IllegalArgumentException.class).fill())
  183. .addParameter(JavaSourceLiteral.of("Expected exactly " + i + " parameters")))));
  184. acceptArray.addStatement(acceptArrayCall);
  185. acceptArray.addModifier(JavaSourceModifier.DEFAULT).addAnnotation(new JavaSourceAnnotation(Override.class));
  186.  
  187. accept.addStatement(acceptCall);
  188. accept.addModifier(JavaSourceModifier.DEFAULT).addAnnotation(new JavaSourceAnnotation(Override.class));
  189.  
  190. JavaSourceMethod parameterCount = JavaSourceMethod.of(JavaSourceGenerics.empty(), JavaSourceNamespace.of(int.class).fill(), "parameterCount");
  191. parameterCount.addStatement(JavaSourceReturnStatement.of(JavaSourceLiteral.of(i)));
  192. parameterCount.addModifier(JavaSourceModifier.DEFAULT).addAnnotation(new JavaSourceAnnotation(Override.class));
  193.  
  194. JavaSourceInterfaceDefinition definition = new JavaSourceInterfaceDefinition(PACKAGE + ".Function" + i, generics);
  195. definition.addInterface(JavaSourceNamespace.of(FunctionX.class).fill(JavaSourceFilledGenerics.empty().addElement(JavaSourceFilledGenerics.Element.of(ret.fill())))).addInterface(dangerous.fill(dangerousFilled)).addModifier(JavaSourceModifier.PUBLIC)
  196. .addMethod(call).addMethod(array).addMethod(acceptArray).addMethod(accept).addMethod(parameterCount);
  197. set.add(new JavaSourceFile(definition));
  198. }
  199.  
  200. return set;
  201. }
  202.  
  203. public static JavaSourceFileSet generateDangerousFunctions() {
  204. JavaSourceFileSet set = new JavaSourceFileSet();
  205. for (int i = 0; i < MAX_PARAMS; i++) {
  206. JavaSourceGenerics generics = JavaSourceGenerics.empty().set("R", Collections.emptyList());
  207. JavaSourceFilledGenerics consumerGenerics = JavaSourceFilledGenerics.empty();
  208. JavaSourceNamespace ret = JavaSourceNamespace.of("R", JavaSourceGenerics.empty(), false);
  209. JavaSourceMethodCall acceptCall = JavaSourceMethodCall.of(JavaSourceThisReference.of(), "apply");
  210. generics.set("T", Arrays.asList(JavaSourceNamespace.of(Throwable.class).fill()));
  211. JavaSourceMethod call = JavaSourceMethod.of(JavaSourceGenerics.empty(), ret.fill(), "apply");
  212. JavaSourceMethod accept = JavaSourceMethod.of(JavaSourceGenerics.empty(), JavaSourceNamespace.VOID, "accept");
  213. JavaSourceMethodCall arrayCall = JavaSourceMethodCall.of(JavaSourceThisReference.of(), "apply");
  214. JavaSourceNamespace.Filled throwable = JavaSourceNamespace.of("T", JavaSourceGenerics.empty(), false).fill();
  215. consumerGenerics.addElement(JavaSourceFilledGenerics.Element.of(throwable));
  216. call.addThrowable(throwable);
  217.  
  218. for (int j = 0; j < i; j++) {
  219. String name = "P" + (j + 1);
  220. JavaSourceNamespace namespace = JavaSourceNamespace.of(name, JavaSourceGenerics.empty(), false);
  221. generics.set(name, Collections.emptyList());
  222. consumerGenerics.addElement(JavaSourceFilledGenerics.Element.of(namespace.fill()));
  223. call.addParameter(JavaSourceParameter.of(namespace,
  224. name.toLowerCase()));
  225. accept.addParameter(JavaSourceParameter.of(namespace,
  226. name.toLowerCase()));
  227. acceptCall.addParameter(JavaSourceVariableReference.of(name.toLowerCase()));
  228. arrayCall.addParameter(JavaSourceCast.of(namespace, JavaSourceArrayGet.of(JavaSourceVariableReference.of("params"), JavaSourceLiteral.of(j))));
  229. }
  230.  
  231. JavaSourceMethod array = JavaSourceMethod.of(JavaSourceGenerics.empty(), ret.fill(), "applyArray");
  232. array.addParameter(JavaSourceParameter.of(JavaSourceNamespace.of(Object[].class), "params", true));
  233.  
  234. array.addStatement(JavaSourceIfBlock.ifBlock(JavaSourceBinaryOperator.of(
  235. JavaSourceFieldReference.of(JavaSourceVariableReference.of("params"), "length"),
  236. JavaSourceOperator.NOT_EQUAL,
  237. JavaSourceLiteral.of(i)
  238. )).addStatement(JavaSourceThrowStatement.of(JavaSourceConstructorCall.of(JavaSourceNamespace.of(IllegalArgumentException.class).fill())
  239. .addParameter(JavaSourceLiteral.of("Expected exactly " + i + " parameters")))));
  240. array.addStatement(JavaSourceReturnStatement.of(arrayCall));
  241. array.addModifier(JavaSourceModifier.DEFAULT).addAnnotation(new JavaSourceAnnotation(Override.class));
  242. array.addThrowable(throwable);
  243.  
  244. accept.addStatement(acceptCall);
  245. accept.addModifier(JavaSourceModifier.DEFAULT).addAnnotation(new JavaSourceAnnotation(Override.class)).addThrowable(throwable);
  246.  
  247. JavaSourceMethod parameterCount = JavaSourceMethod.of(JavaSourceGenerics.empty(), JavaSourceNamespace.of(int.class).fill(), "parameterCount");
  248. parameterCount.addStatement(JavaSourceReturnStatement.of(JavaSourceLiteral.of(i)));
  249. parameterCount.addModifier(JavaSourceModifier.DEFAULT).addAnnotation(new JavaSourceAnnotation(Override.class));
  250.  
  251. JavaSourceInterfaceDefinition definition = new JavaSourceInterfaceDefinition(PACKAGE + ".DangerousFunction" + i, generics);
  252. definition.addInterface(JavaSourceNamespace.of(DangerousFunctionX.class).fill(JavaSourceFilledGenerics.empty().addElement(JavaSourceFilledGenerics.Element.of(ret.fill())).addElement(JavaSourceFilledGenerics.Element.of(throwable))))
  253. .addInterface(JavaSourceNamespace.of(PACKAGE + ".DangerousConsumer" + i, JavaSourceGenerics.empty(), false).fill(consumerGenerics))
  254. .addModifier(JavaSourceModifier.PUBLIC)
  255. .addMethod(call).addMethod(array).addMethod(accept).addMethod(parameterCount);
  256. set.add(new JavaSourceFile(definition));
  257. }
  258.  
  259. return set;
  260. }
  261.  
  262. public static void main(String[] args) throws IOException {
  263. File target = new File("src/main/java");
  264. generateConsumers().write(target);
  265. generateDangerousConsumers().write(target);
  266. generateFunctions().write(target);
  267. generateDangerousFunctions().write(target);
  268. }
  269.  
  270. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement