/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.parser.expressions; import gw.internal.gosu.parser.DynamicFunctionSymbol; import gw.internal.gosu.parser.Expression; import gw.internal.gosu.parser.IGosuClassInternal; import gw.internal.gosu.parser.GosuObjectFunctionSymbol; import gw.internal.gosu.parser.CannotExecuteGosuException; import gw.lang.parser.IFunctionSymbol; import gw.lang.parser.expressions.IMethodCallExpression; import gw.lang.reflect.IFunctionType; import gw.lang.reflect.IBlockType; import gw.lang.reflect.java.JavaTypes; /** */ public final class MethodCallExpression extends Expression implements IMethodCallExpression { private IFunctionSymbol _symbol; private Expression[] _args; private int _iArgPos; private IFunctionType _funcType; private int[] _namedArgOrder; public MethodCallExpression() { } public IFunctionSymbol getFunctionSymbol() { return _symbol; } public void setFunctionSymbol( IFunctionSymbol symbol ) { _symbol = symbol; specialHandlingFor_IGosuObject_BasedMethods( symbol ); } private void specialHandlingFor_IGosuObject_BasedMethods( IFunctionSymbol symbol ) { if( symbol.getType() instanceof IFunctionType ) { IFunctionType ft = (IFunctionType)symbol.getType(); if( ft.getScriptPart() != null && ft.getScriptPart().getContainingType() == IGosuClassInternal.Util.getGosuClassFrom( JavaTypes.IGOSU_OBJECT() ) ) { _symbol = new GosuObjectFunctionSymbol( (IGosuClassInternal)ft.getScriptPart().getContainingType(), (DynamicFunctionSymbol)_symbol ); } } } public Expression[] getArgs() { return _args; } public void setArgs( Expression[] args ) { if( args != null && args.length == 0 ) { args = null; } _args = args; } public int getArgPosition() { return _iArgPos; } public void setArgPosition( int iArgPos ) { _iArgPos = iArgPos; } public void setFunctionType( IFunctionType funcType ) { _funcType = funcType; } public IFunctionType getFunctionType() { return _funcType; } public Object evaluate() { if( !isCompileTimeConstant() ) { return super.evaluate(); } throw new CannotExecuteGosuException(); } @Override public String toString() { String strOut = (_symbol == null ? "#err" : _symbol.getDisplayName()) + "("; if( _args != null && _args.length > 0 ) { strOut += " "; for( int i = 0; i < _args.length; i++ ) { if( i != 0 ) { strOut += ", "; } strOut += _args[i].toString(); } strOut += " "; } return strOut += ")"; } public boolean isBlockInvocation() { return _symbol.getType() instanceof IBlockType; } public boolean isFromJava() { return _symbol.isFromJava(); } public void setNamedArgOrder( int[] namedArgOrder ) { _namedArgOrder = namedArgOrder; } public int[] getNamedArgOrder() { return _namedArgOrder; } }