package org.overture.codegen.traces; import org.apache.commons.lang.BooleanUtils; import org.apache.log4j.Logger; import org.overture.codegen.ir.INode; import org.overture.codegen.ir.SExpIR; import org.overture.codegen.ir.analysis.AnalysisException; import org.overture.codegen.ir.analysis.AnswerAdaptor; import org.overture.codegen.ir.expressions.AApplyExpIR; import org.overture.codegen.ir.expressions.ACastUnaryExpIR; import org.overture.codegen.ir.expressions.AFieldExpIR; import org.overture.codegen.ir.expressions.AIdentifierVarExpIR; import org.overture.codegen.ir.expressions.ANewExpIR; import org.overture.codegen.ir.expressions.ASelfExpIR; import org.overture.codegen.ir.expressions.SVarExpIR; import org.overture.codegen.ir.types.AObjectTypeIR; import org.overture.codegen.trans.assistants.TransAssistantIR; public class CallObjTraceLocalizer extends AnswerAdaptor<SExpIR> { private TransAssistantIR assist; private TraceNames tracePrefixes; private String traceEnclosingClass; private Logger log = Logger.getLogger(this.getClass().getName()); public CallObjTraceLocalizer(TransAssistantIR transAssistant, TraceNames tracePrefixes, String traceEnclosingClass) { this.assist = transAssistant; this.tracePrefixes = tracePrefixes; this.traceEnclosingClass = traceEnclosingClass; } @Override public SExpIR caseAApplyExpIR(AApplyExpIR node) throws AnalysisException { return node.getRoot().apply(this); } @Override public SExpIR caseAFieldExpIR(AFieldExpIR node) throws AnalysisException { return node.getObject().apply(this); } @Override public SExpIR caseAIdentifierVarExpIR(AIdentifierVarExpIR node) throws AnalysisException { if (node instanceof SVarExpIR) { SVarExpIR varExp = (SVarExpIR) node; if (BooleanUtils.isFalse(varExp.getIsLocal())) { ACastUnaryExpIR objId = consObjId(); AFieldExpIR fieldObj = new AFieldExpIR(); fieldObj.setType(node.getType().clone()); fieldObj.setMemberName(varExp.getName()); fieldObj.setObject(objId); assist.replaceNodeWith(node, fieldObj); return objId; } return node; } log.error("Expected variable expression at this point. Got: " + node); return null; } @Override public SExpIR caseASelfExpIR(ASelfExpIR node) throws AnalysisException { ACastUnaryExpIR objId = consObjId(); assist.replaceNodeWith(node, objId); return objId; } @Override public SExpIR caseANewExpIR(ANewExpIR node) throws AnalysisException { return node; } private ACastUnaryExpIR consObjId() { String paramName = tracePrefixes.callStmMethodParamName(); AIdentifierVarExpIR idVar = assist.getInfo().getExpAssistant().consIdVar(paramName, new AObjectTypeIR()); ACastUnaryExpIR castVar = new ACastUnaryExpIR(); castVar.setType(assist.consClassType(traceEnclosingClass)); castVar.setExp(idVar); return castVar; } @Override public SExpIR createNewReturnValue(INode node) throws AnalysisException { assert false : "Should not happen"; return null; } @Override public SExpIR createNewReturnValue(Object node) throws AnalysisException { assert false : "Should not happen"; return null; } }