package org.overture.interpreter.assistant.expression; import org.overture.ast.analysis.AnalysisException; import org.overture.ast.assistant.IAstAssistant; import org.overture.ast.expressions.AFieldExp; import org.overture.ast.types.PType; import org.overture.interpreter.assistant.IInterpreterAssistantFactory; import org.overture.interpreter.runtime.Context; import org.overture.interpreter.runtime.VdmRuntime; import org.overture.interpreter.runtime.VdmRuntimeError; import org.overture.interpreter.values.FieldMap; import org.overture.interpreter.values.ObjectValue; import org.overture.interpreter.values.RecordValue; import org.overture.interpreter.values.Value; public class AFieldExpAssistantInterpreter implements IAstAssistant { protected static IInterpreterAssistantFactory af; @SuppressWarnings("static-access") public AFieldExpAssistantInterpreter(IInterpreterAssistantFactory af) { this.af = af; } public Value evaluate(AFieldExp node, Context ctxt) throws AnalysisException { Value v = node.getObject().apply(VdmRuntime.getExpressionEvaluator(), ctxt); PType objtype = null; Value r = null; if (v.isType(ObjectValue.class)) { ObjectValue ov = v.objectValue(ctxt); objtype = ov.type; r = ov.get(node.getMemberName(), node.getMemberName().getExplicit()); } else { RecordValue rv = v.recordValue(ctxt); objtype = rv.type; FieldMap fields = rv.fieldmap; r = fields.get(node.getField().getName()); } if (r == null) { VdmRuntimeError.abort(node.getLocation(), 4006, "Type " + objtype + " has no field " + node.getField().getName(), ctxt); } return r; } }