package org.overture.codegen.trans; import org.apache.log4j.Logger; import org.overture.codegen.ir.SExpIR; import org.overture.codegen.ir.SStmIR; import org.overture.codegen.ir.analysis.AnalysisException; import org.overture.codegen.ir.analysis.DepthFirstAnalysisAdaptor; import org.overture.codegen.ir.statements.AAssignToExpStmIR; import org.overture.codegen.ir.statements.AAssignmentStmIR; import org.overture.codegen.ir.statements.AMapSeqStateDesignatorIR; import org.overture.codegen.ir.statements.AMapSeqUpdateStmIR; import org.overture.codegen.trans.assistants.TransAssistantIR; import org.overture.codegen.trans.conv.StateDesignatorToExpIR; public class AssignStmTrans extends DepthFirstAnalysisAdaptor { private StateDesignatorToExpIR converter; private Logger log = Logger.getLogger(this.getClass().getName()); public AssignStmTrans(TransAssistantIR transAssistant) { this.converter = new StateDesignatorToExpIR(transAssistant); } @Override public void caseAAssignmentStmIR(AAssignmentStmIR node) throws AnalysisException { SStmIR newNode = null; if (node.getTarget() instanceof AMapSeqStateDesignatorIR) { AMapSeqStateDesignatorIR target = (AMapSeqStateDesignatorIR) node.getTarget(); SExpIR col = target.getMapseq().apply(converter); SExpIR index = target.getExp(); SExpIR value = node.getExp(); AMapSeqUpdateStmIR mapSeqUpd = new AMapSeqUpdateStmIR(); mapSeqUpd.setCol(col); mapSeqUpd.setIndex(index.clone()); mapSeqUpd.setValue(value.clone()); mapSeqUpd.setSourceNode(node.getSourceNode()); mapSeqUpd.setTag(node.getTag()); newNode = mapSeqUpd; } else { AAssignToExpStmIR assign = new AAssignToExpStmIR(); assign.setTarget(node.getTarget().apply(converter)); assign.setExp(node.getExp().clone()); assign.setSourceNode(node.getSourceNode()); assign.setTag(node.getTag()); newNode = assign; } if (node.parent() != null) { node.parent().replaceChild(node, newNode); } else { log.error("Could not find parent of " + node); } } }