/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.parser.expressions;
import gw.lang.reflect.IPropertyInfo;
import gw.lang.reflect.IType;
import gw.lang.parser.exceptions.ParseException;
import gw.lang.parser.expressions.IMemberExpansionExpression;
import gw.internal.gosu.parser.TypeLord;
import gw.internal.gosu.parser.ArrayExpansionPropertyInfo;
import gw.internal.gosu.parser.BeanAccess;
/**
* Represents a member expansion access expression in the Gosu grammar:
* <pre>
* <i>member-expansion-access</i>
* <iterable-expression>*.<component-member>
* @see gw.lang.parser.IGosuParser
*/
public class MemberExpansionAccess extends MemberAccess implements IMemberExpansionExpression
{
public IPropertyInfo getPropertyInfo()
{
IType componentType = TypeLord.getExpandableComponentType( getRootType() );
try
{
IPropertyInfo pi = BeanAccess.getPropertyInfoDirectly( componentType, getMemberName() );
return new ArrayExpansionPropertyInfo( pi );
}
catch( ParseException e )
{
throw new RuntimeException( e );
}
}
@Override
public boolean isNullSafe()
{
return true;
}
public String toString()
{
return getRootExpression().toString() + "*." + getMemberName();
}
public static MemberExpansionAccess wrap( MemberAccess ma )
{
if( !(ma.getPropertyInfo() instanceof ArrayExpansionPropertyInfo) )
{
throw new IllegalArgumentException( "Only MemberAccess expressions whose property is an ArrayExpansionPropertyInfo can be wrapped" );
}
MemberExpansionAccess mea = new MemberExpansionAccess();
mea.setGosuProgram( ma.getGosuProgram() );
mea.setRootExpression( ma.getRootExpression() );
mea.setMemberExpression( ma.getMemberExpression() );
mea.setMemberName( ma.getMemberName() );
mea.setType( ma.getType() );
mea.setMemberAccessKind( ma.getMemberAccessKind() );
return mea;
}
}