/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.parser.expressions; import gw.internal.gosu.parser.Expression; import gw.internal.gosu.parser.TypeLord; import gw.internal.gosu.parser.CannotExecuteGosuException; import gw.lang.parser.GosuParserTypes; import gw.lang.parser.expressions.IMapAccessExpression; import gw.lang.reflect.java.JavaTypes; import gw.lang.reflect.IType; public final class MapAccess extends Expression implements IMapAccessExpression { /** The map expression */ private Expression _rootExpression; private boolean _bNullSafe; /** * An expression for accessing the map */ private Expression _keyExpression; private IType _keyType; public MapAccess() { } public Expression getRootExpression() { return _rootExpression; } public void setRootExpression( Expression rootExpression ) { _rootExpression = rootExpression; setTypeInternal( _rootExpression.getType() ); } public Expression getKeyExpression() { return _keyExpression; } public void setKeyExpression( Expression keyExpression ) { _keyExpression = keyExpression; } public boolean isNullSafe() { return _bNullSafe; } public void setNullSafe( boolean bNullSafe ) { _bNullSafe = bNullSafe; } /** * Evaluates the expression. */ public Object evaluate() { if( !isCompileTimeConstant() ) { return super.evaluate(); } throw new CannotExecuteGosuException(); } @Override public String toString() { return getRootExpression().toString() + "[" + getKeyExpression().toString() + "]"; } public static boolean supportsMapAccess( IType type ) { return JavaTypes.MAP().isAssignableFrom(type); } private void setTypeInternal( IType type ) { IType paramedType = TypeLord.findParameterizedTypeInHierarchy(type, JavaTypes.MAP()); if( paramedType != null ) { IType[] parameters = paramedType.getTypeParameters(); _keyType = parameters[0]; setType( parameters[1] ); } else { _keyType = GosuParserTypes.GENERIC_BEAN_TYPE(); setType( GosuParserTypes.GENERIC_BEAN_TYPE() ); } } public static IType getKeyType( IType type ) { IType paramedType = TypeLord.findParameterizedTypeInHierarchy( type, JavaTypes.MAP() ); if( paramedType != null ) { IType[] parameters = paramedType.getTypeParameters(); return parameters[0]; } else { return GosuParserTypes.GENERIC_BEAN_TYPE(); } } public IType getComponentType() { return getType(); } public IType getKeyType() { return _keyType; } }