/* Generated By:JJTree: Do not edit this line. ASTAtEvalEx.java Version 4.3 */
/* JavaCCOptions:MULTI=true,NODE_USES_PARSER=true,VISITOR=false,TRACK_TOKENS=false,NODE_PREFIX=AST,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
package org.openntf.formula.ast;
import java.util.Set;
import org.openntf.formula.EvaluateException;
import org.openntf.formula.FormulaContext;
import org.openntf.formula.FormulaParseException;
import org.openntf.formula.FormulaReturnException;
import org.openntf.formula.ValueHolder;
import org.openntf.formula.ValueHolder.DataType;
import org.openntf.formula.parse.AtFormulaParserImpl;
/**
* @author steinsiek
*
* Extension of @Eval to handle parameters. Example of use:
* <p/>
* F_FAK := "@if(n=0; 1; n*@EvalEx(F_FAK; n-1))" : "n"; @EvalEx(F_FAK; 80)
*/
public class ASTAtEvalEx extends SimpleNode {
public ASTAtEvalEx(final AtFormulaParserImpl p, final int id) {
super(p, id);
}
@Override
public ValueHolder evaluate(final FormulaContext ctx) throws FormulaReturnException {
ValueHolder[] oldVHs = null;
ValueHolder vhEval = children[0].evaluate(ctx);
if (vhEval.dataType == DataType.ERROR)
return vhEval;
if (vhEval.size != children.length) {
IllegalArgumentException ia = new IllegalArgumentException("Wrong number of parameters: Expected " + (vhEval.size - 1)
+ ", got " + (children.length - 1));
return ValueHolder.valueOf(new EvaluateException(codeLine, codeColumn, ia));
}
oldVHs = new ValueHolder[vhEval.size - 1];
for (int i = 1; i < vhEval.size; i++)
oldVHs[i - 1] = ctx.setVarLC(vhEval.getString(i).toLowerCase(), children[i].evaluate(ctx));
try {
Node n = (Node) ctx.getParser().parse(vhEval.getString(0));
return n.evaluate(ctx);
} catch (FormulaParseException e) {
return ValueHolder.valueOf(new EvaluateException(codeLine, codeColumn, e));
} finally {
if (oldVHs != null)
for (int i = 1; i < vhEval.size; i++)
ctx.setVarLC(vhEval.getString(i).toLowerCase(), oldVHs[i - 1]);
}
}
@Override
protected void analyzeThis(final Set<String> readFields, final Set<String> modifiedFields, final Set<String> variables,
final Set<String> functions) {
functions.add("@evalex");
}
}
/* JavaCC - OriginalChecksum=4422466a21b7e75ad1c114b91cc29745 (do not edit this line) */