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