]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/ValueFromMethod.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / utils / ValueFromMethod.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/ValueFromMethod.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/ValueFromMethod.java
new file mode 100644 (file)
index 0000000..5a736a3
--- /dev/null
@@ -0,0 +1,85 @@
+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