/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.compiler; import gw.lang.reflect.TypeSystem; import gw.lang.reflect.java.IJavaType; import gw.util.GosuExceptionUtil; import gw.lang.function.IBlock; public class FunctionClassUtil extends ClassLoader { public static final String FUNCTION_PACKAGE = "gw.lang.function"; public static final String FUNCTION_CLASS_PREFIX = FUNCTION_PACKAGE + ".Function"; public static final String FUNCTION_INTERFACE_PREFIX = FUNCTION_PACKAGE + ".IFunction"; private static final Class[][] ARGS = new Class[IBlock.MAX_ARGS + 1][]; static { for( int i = 0; i <= IBlock.MAX_ARGS; i++ ) { Class[] classes1 = new Class[i]; for( int j = 0; j < i; j++ ) { classes1[j] = Object.class; } ARGS[i] = classes1; } } private FunctionClassUtil() {} public static IJavaType getFunctionClassForArity(int functionArity) { return getFunctionType( functionArity, FUNCTION_CLASS_PREFIX ); } public static IJavaType getFunctionInterfaceForArity(int functionArity) { return getFunctionType( functionArity, FUNCTION_INTERFACE_PREFIX ); } private static IJavaType getFunctionType(int functionArity, String s) { if( functionArity >= 0 && functionArity <= IBlock.MAX_ARGS ) { String functionTypeName = s + functionArity; return (IJavaType) TypeSystem.getByFullNameIfValid(functionTypeName, TypeSystem.getGlobalModule()); } return null; } public static String getFunctionInterfaceSlashNameForArity( int arity ) { return "gw/lang/function/IFunction" + arity; } private Class getFunctionClassForArityImpl( int functionArity ) { String functionTypeName = FUNCTION_CLASS_PREFIX + functionArity; if( functionArity >= 0 && functionArity <= IBlock.MAX_ARGS ) { try { return Class.forName( functionTypeName, false, getClass().getClassLoader() ); } catch (ClassNotFoundException e) { throw GosuExceptionUtil.forceThrow(e); } } return null; } public static Class[] getArgArrayForArity( int i ) { return ARGS[i]; } }