/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.ir.nodes;
import gw.lang.reflect.IMethodInfo;
import gw.lang.reflect.IType;
import gw.lang.reflect.IRelativeTypeInfo;
import gw.lang.reflect.IFunctionType;
import gw.lang.reflect.IConstructorInfo;
import gw.lang.ir.IRType;
import gw.lang.ir.IRTypeConstants;
import gw.internal.gosu.parser.DynamicFunctionSymbol;
import gw.internal.gosu.ir.transform.AbstractElementTransformer;
import gw.internal.gosu.ir.transform.util.IRTypeResolver;
import gw.lang.reflect.java.IJavaClassInfo;
import gw.lang.reflect.java.IJavaClassMethod;
import java.lang.reflect.Method;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
public class IRMethodFactory {
public static IRMethodFromMethodInfo createIRMethod(IMethodInfo originalMethodInfo, IFunctionType functionType) {
if (originalMethodInfo == null) {
return null;
}
// IMethodInfo resolvedMethodInfo = originalMethodInfo;
//
// while( resolvedMethodInfo instanceof IMethodInfoDelegate) {
// resolvedMethodInfo = ((IMethodInfoDelegate)resolvedMethodInfo).getSource();
// }
//
// // If the owning type is a Gosu proxy, we actually want the IMethodInfo off of the underlying Java type
// IType owner = getTrueOwningType(resolvedMethodInfo);
// if (IGosuClass.ProxyUtil.isProxy(owner)) {
// owner = IGosuClass.ProxyUtil.getProxiedType(owner);
// IType[] parameterTypes = getParameterTypes( resolvedMethodInfo );
// resolvedMethodInfo = owner.getTypeInfo().getMethod(resolvedMethodInfo.getDisplayName(), parameterTypes);
//
// if (resolvedMethodInfo == null) {
// System.out.println("Huh?");
// }
//
// assert(resolvedMethodInfo != null);
// }
return new IRMethodFromMethodInfo(originalMethodInfo, functionType);
}
public static IRMethod createIRMethod( IConstructorInfo constructor ) {
return new IRMethodFromConstructorInfo( constructor );
}
public static IRMethod createIRMethod(Class cls, String name, Class... paramTypes) {
return createIRMethod(AbstractElementTransformer.getDeclaredMethod(cls, name, paramTypes));
}
public static IRMethod createIRMethod(IJavaClassInfo cls, String name, Class... paramTypes) {
return createIRMethod(AbstractElementTransformer.getDeclaredMethod(cls, name, paramTypes));
}
public static IRMethod createIRMethod(Method method) {
return new IRMethodFromMethod(method);
}
public static IRMethod createIRMethod(IJavaClassMethod method) {
return new IRMethodFromJavaMethodInfo(method);
}
public static IRMethod createConstructorIRMethod(IType gosuClass, DynamicFunctionSymbol dfs, int numberOfTypeParameters) {
return new IRMethodForConstructorSymbol(gosuClass, dfs, numberOfTypeParameters);
}
public static IRMethod createIRMethod(IType owner, String name, IType returnType, IType[] parameterTypes, IRelativeTypeInfo.Accessibility accessibility, boolean bStatic) {
return new SyntheticIRMethod( owner, name, IRTypeResolver.getDescriptor(returnType), convertToIRTypes(parameterTypes), accessibility, bStatic );
}
public static IRMethod createIRMethod(IType owner, String name, IRType returnType, List<IRType> parameterTypes, IRelativeTypeInfo.Accessibility accessibility, boolean bStatic) {
return new SyntheticIRMethod( owner, name, returnType, parameterTypes, accessibility, bStatic );
}
public static IRMethod createConstructorIRMethod(IType owner, IRType[] parameterTypes ) {
return new SyntheticIRMethod( owner, "<init>", IRTypeConstants.pVOID(), Arrays.asList(parameterTypes), IRelativeTypeInfo.Accessibility.PUBLIC, false );
}
private static List<IRType> convertToIRTypes(IType[] types) {
List<IRType> result = new ArrayList<IRType>();
for (IType type : types) {
result.add(IRTypeResolver.getDescriptor(type));
}
return result;
}
// private static IType getTrueOwningType( IMethodInfo mi ) {
// if( mi instanceof IJavaMethodInfo)
// {
// // We have to get the owner type from the method because it may be different from the owning type e.g., entity aspects see ContactGosuAspect.AllAdresses
// Method m = ((IJavaMethodInfo)mi).getMethod();
// if( m != null )
// {
// return TypeSystem.get( m.getDeclaringClass() );
// }
// }
// return mi.getOwnersType();
// }
//
// private static IType[] getParameterTypes( IMethodInfo mi ) {
// if ( mi instanceof IGosuMethodInfo ) {
// IDynamicFunctionSymbol dfs = ((IGosuMethodInfo)mi).getDfs();
// while( dfs instanceof ParameterizedDynamicFunctionSymbol)
// {
// ParameterizedDynamicFunctionSymbol pdfs = (ParameterizedDynamicFunctionSymbol)dfs;
// dfs = pdfs.getBackingDfs();
// }
// IType[] boundedTypes = new IType[dfs.getArgTypes().length];
// for( int i = 0; i < dfs.getArgTypes().length; i++ )
// {
// boundedTypes[i] = TypeLord.getDefaultParameterizedTypeWithTypeVars( dfs.getArgTypes()[i] );
// }
// return boundedTypes;
// } else {
// IParameterInfo[] parameterInfos = mi.getParameters();
// IType[] parameterTypes = new IType[parameterInfos.length];
// for (int i = 0; i < parameterInfos.length; i++) {
// parameterTypes[i] = parameterInfos[i].getFeatureType();
// }
// return parameterTypes;
// }
// }
}