/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.parser.expressions;
import gw.lang.parser.IExpression;
import gw.lang.reflect.IType;
import gw.lang.parser.expressions.IBlockLiteralExpression;
import gw.internal.gosu.parser.MetaType;
import gw.lang.reflect.java.JavaTypes;
import gw.util.concurrent.LockingLazyVar;
import java.util.ArrayList;
import java.util.List;
/**
* Represents a Block literal expression as defined in the Gosu grammar.
*
* @see gw.lang.parser.IGosuParser
*/
public class BlockLiteral extends TypeLiteral implements IBlockLiteralExpression
{
private ArrayList<IType> _argTypes;
private ArrayList<String> _argNames;
private ArrayList<IExpression> _defValues;
private IType _returnType;
private final LockingLazyVar<MetaType> _blockType =
new LockingLazyVar<MetaType>()
{
@Override
protected MetaType init()
{
IType type = new BlockType( _returnType, _argTypes.toArray( new IType[_argTypes.size()] ), _argNames, _defValues );
return MetaType.get( type );
}
};
public BlockLiteral()
{
super(JavaTypes.FUNCTION_TYPE());
}
/**
* @param paramTypes If this is a parameterized type, these are the parameter types.
*/
public void setArgTypes( List<IType> paramTypes )
{
_argTypes = new ArrayList<IType>();
for( IType paramType : paramTypes )
{
_argTypes.add( paramType );
}
}
private IType getTypeFromLiteral( TypeLiteral typeLiteral )
{
MetaType metaType = typeLiteral.getType();
IType type = metaType.getType();
return type;
}
@Override
public Object clone()
{
BlockLiteral clone = new BlockLiteral();
clone._argTypes = (ArrayList<IType>)_argTypes.clone();
clone._returnType = _returnType;
clone.setLocation( getLocation() );
return clone;
}
public void setReturnType( TypeLiteral returnType )
{
_returnType = getTypeFromLiteral( returnType );
}
@Override
public MetaType getTypeImpl()
{
return _blockType == null ? null : _blockType.get();
}
@Override
public String toString()
{
String returnStr = "block (";
for( int i = 0; i < _argTypes.size(); i++ )
{
IType iIntrinsicType = _argTypes.get( i );
String name = _argNames.get( i );
if( name.length() > 0 )
{
returnStr += name + ":";
}
returnStr += iIntrinsicType.getName();
if( i < _argTypes.size() - 1 )
{
returnStr += ",";
}
}
returnStr += "):";
returnStr += _returnType.getName();
return returnStr;
}
public void setArgNames( ArrayList<String> argNames )
{
_argNames = argNames;
}
public void setDefValueExpressions( ArrayList<IExpression> defValues )
{
_defValues = defValues;
}
}