package com.sap.finex.interpreter.expressions; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import structure.Association; import structure.Field; import structure.FinexClass; import structure.Type; import behavior.actions.Statement; import behavior.expressions.Expression; import behavior.expressions.literals.MultiObjectLiteral; import behavior.functions.NativeImpl; import behavior.functions.SignatureImplementation; import com.sap.finex.interpreter.FinexInterpreter; import com.sap.finex.interpreter.FinexStackFrame; import com.sap.runlet.abstractinterpreter.Interpreter; import com.sap.runlet.abstractinterpreter.objects.MultiValuedObject; import com.sap.runlet.abstractinterpreter.objects.RunletObject; public class MultiObjectLiteralInterpreter implements Interpreter<MultiObjectLiteral, FinexClass, Type, FinexClass, Association, Field, Statement, Expression, SignatureImplementation, FinexStackFrame, NativeImpl, FinexInterpreter> { private MultiObjectLiteral literal; public MultiObjectLiteralInterpreter(MultiObjectLiteral literal) { this.literal = literal; } @Override public RunletObject<Field, Type, FinexClass> evaluate(FinexInterpreter interpreter) throws SecurityException, IllegalArgumentException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { FinexStackFrame frame = interpreter.getCallstack().peek(); List<RunletObject<Field, Type, FinexClass>> values = new ArrayList<RunletObject<Field, Type, FinexClass>>(literal .getElements().size()); Map<Expression, RunletObject<Field, Type, FinexClass>> elementsToValues = new HashMap<Expression, RunletObject<Field, Type, FinexClass>>(); for (Expression element : literal.getElements()) { RunletObject<Field, Type, FinexClass> value = interpreter.evaluate(element); values.add(value); elementsToValues.put(element, value); } MultiValuedObject<Field, Type, FinexClass> result = new MultiValuedObject<Field, Type, FinexClass>(literal.getType(), values, /* ordered */true, /* unique */false); for (Expression e : elementsToValues.keySet()) { for (RunletObject<Field, Type, FinexClass> singleResultObject : result) { frame.getAliasValues().used(elementsToValues.get(e), e, singleResultObject, literal); } } return result; } }