package gw.lang.parser.coercers;
import gw.lang.reflect.IType;
import gw.lang.reflect.IMethodInfo;
import gw.lang.reflect.java.IJavaType;
import gw.lang.reflect.java.IJavaMethodInfo;
import gw.lang.reflect.IFunctionType;
import gw.lang.GosuShop;
import java.util.List;
/**
* Copyright 2010 Guidewire Software, Inc.
*/
public class FunctionFromInterfaceCoercer extends BaseCoercer
{
private static FunctionFromInterfaceCoercer _instance = new FunctionFromInterfaceCoercer();
public static FunctionFromInterfaceCoercer instance()
{
return _instance;
}
private FunctionFromInterfaceCoercer() {}
public boolean handlesNull()
{
return false;
}
public Object coerceValue( IType typeToCoerceTo, final Object value )
{
return GosuShop.createFunctionFromInterface( typeToCoerceTo, value );
}
public boolean isExplicitCoercion()
{
return false;
}
public static boolean areTypesCompatible( IFunctionType functionType, IType interfaceType )
{
if( interfaceType.isInterface() && interfaceType instanceof IJavaType)
{
IJavaType javaIntrinsicType = (IJavaType)interfaceType;
List<? extends IMethodInfo> list = javaIntrinsicType.getTypeInfo().getMethods();
int nonObjectMethods = 0;
for( IMethodInfo iMethodInfo : list )
{
if( !iMethodInfo.getOwnersType().equals( IJavaType.OBJECT ) && iMethodInfo instanceof IJavaMethodInfo )
{
nonObjectMethods++;
}
}
if( nonObjectMethods == 1 )
{
IFunctionType tempFunctionType = GosuShop.createFunctionType( list.get( 0 ) );
return functionType.isAssignableFrom( tempFunctionType );
}
}
return false;
}
public int getPriority( IType to, IType from )
{
return 0;
}
}