--- /dev/null
+package org.simantics.scl.compiler.internal.codegen.utils;\r
+\r
+import java.lang.reflect.Method;\r
+\r
+import org.simantics.scl.runtime.function.FunctionImpl1;\r
+import org.simantics.scl.runtime.function.FunctionImpl2;\r
+import org.simantics.scl.runtime.function.FunctionImpl3;\r
+import org.simantics.scl.runtime.function.FunctionImpl4;\r
+import org.simantics.scl.runtime.function.FunctionImplN;\r
+import org.simantics.scl.runtime.tuple.Tuple0;\r
+\r
+public class ValueFromMethod {\r
+\r
+ public static Object getValueFromStaticMethod(final Method method) throws ReflectiveOperationException {\r
+ int arity = method.getParameterTypes().length;\r
+ final boolean returnsVoid = method.getReturnType().equals(void.class);\r
+ switch(arity) {\r
+ case 0: {\r
+ Object ret = method.invoke(null);\r
+ return returnsVoid ? Tuple0.INSTANCE : ret;\r
+ }\r
+ case 1:\r
+ return new FunctionImpl1<Object,Object>() {\r
+ @Override\r
+ public Object apply(Object p0) {\r
+ try {\r
+ Object ret = method.invoke(null, p0);\r
+ return returnsVoid ? Tuple0.INSTANCE : ret;\r
+ } catch (ReflectiveOperationException e) {\r
+ throw new RuntimeException(e);\r
+ }\r
+ }\r
+ };\r
+ case 2:\r
+ return new FunctionImpl2<Object,Object,Object>() {\r
+ @Override\r
+ public Object apply(Object p0, Object p1) {\r
+ try {\r
+ Object ret = method.invoke(null, p0, p1);\r
+ return returnsVoid ? Tuple0.INSTANCE : ret;\r
+ } catch (ReflectiveOperationException e) {\r
+ throw new RuntimeException(e);\r
+ }\r
+ }\r
+ };\r
+ case 3:\r
+ return new FunctionImpl3<Object,Object,Object,Object>() {\r
+ @Override\r
+ public Object apply(Object p0, Object p1, Object p2) {\r
+ try {\r
+ Object ret = method.invoke(null, p0, p1, p2);\r
+ return returnsVoid ? Tuple0.INSTANCE : ret;\r
+ } catch (ReflectiveOperationException e) {\r
+ throw new RuntimeException(e);\r
+ }\r
+ }\r
+ };\r
+ case 4:\r
+ return new FunctionImpl4<Object,Object,Object,Object,Object>() {\r
+ @Override\r
+ public Object apply(Object p0, Object p1, Object p2, Object p3) {\r
+ try {\r
+ Object ret = method.invoke(null, p0, p1, p2, p3);\r
+ return returnsVoid ? Tuple0.INSTANCE : ret;\r
+ } catch (ReflectiveOperationException e) {\r
+ throw new RuntimeException(e);\r
+ }\r
+ }\r
+ };\r
+ default:\r
+ return new FunctionImplN(arity) {\r
+ @Override\r
+ public Object doApply(Object... ps) {\r
+ try {\r
+ Object ret = method.invoke(null, ps);\r
+ return returnsVoid ? Tuple0.INSTANCE : ret;\r
+ } catch (ReflectiveOperationException e) {\r
+ throw new RuntimeException(e);\r
+ }\r
+ }\r
+ };\r
+ }\r
+ }\r
+ \r
+}\r