/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.ir.transform.expression;
import gw.internal.gosu.parser.ArrayExpansionMethodInfo;
import gw.lang.parser.MemberAccessKind;
import gw.internal.gosu.parser.Symbol;
import gw.internal.gosu.parser.expressions.BeanMethodCallExpression;
import gw.internal.gosu.parser.expressions.Identifier;
import gw.internal.gosu.ir.transform.TopLevelTransformationContext;
import gw.lang.ir.IRExpression;
import gw.lang.reflect.IType;
import gw.lang.reflect.IMethodInfo;
import gw.lang.parser.StandardSymbolTable;
/**
*/
public class BeanMethodCallExpansionTransformer extends AbstractMemberExpansionTransformer<BeanMethodCallExpression>
{
public static IRExpression compile( TopLevelTransformationContext cc, BeanMethodCallExpression expr )
{
BeanMethodCallExpansionTransformer compiler = new BeanMethodCallExpansionTransformer( cc, expr );
return compiler.compile();
}
private BeanMethodCallExpansionTransformer( TopLevelTransformationContext cc, BeanMethodCallExpression expr )
{
super( cc, expr );
}
@Override
protected IRExpression createIterationExpr(IType rootComponentType, String identifierName, IType identifierType, IType compType)
{
// Make BeanMethodCallExpressionExpr for identifierSym.<call()>
BeanMethodCallExpression mc = new BeanMethodCallExpression();
Identifier id = new Identifier();
id.setType( rootComponentType );
StandardSymbolTable symTable = new StandardSymbolTable();
id.setSymbol( new Symbol(identifierName, identifierType, symTable ), symTable);
mc.setRootExpression( id );
mc.setMethodDescriptor( ((ArrayExpansionMethodInfo)_expr().getMethodDescriptor()).getDelegate() );
mc.setAccessPath( _expr().getAccessPath() );
mc.setArgs( _expr().getArgs() );
mc.setArgTypes( _expr().getArgTypes() );
mc.setFunctionType( _expr().getFunctionType() );
mc.setType( getMethodReturnType() );
mc.setMemberAccessKind( MemberAccessKind.NULL_SAFE );
return BeanMethodCallExpressionTransformer.compile( _cc(), mc );
}
@Override
protected IType getPropertyOrMethodType(IType rootComponentType, IType compType) {
return getMethodReturnType();
}
private IType getMethodReturnType() {
IMethodInfo methodInfo = _expr().getMethodDescriptor();
if (methodInfo instanceof ArrayExpansionMethodInfo) {
methodInfo = ((ArrayExpansionMethodInfo) methodInfo).getDelegate();
}
return methodInfo.getReturnType();
}
}