package org.overture.codegen.vdm2jml.trans; import java.util.List; import org.apache.log4j.Logger; import org.overture.codegen.ir.INode; import org.overture.codegen.ir.STypeIR; import org.overture.codegen.ir.analysis.AnalysisException; import org.overture.codegen.ir.declarations.AVarDeclIR; import org.overture.codegen.ir.expressions.AFieldExpIR; import org.overture.codegen.ir.expressions.AIdentifierVarExpIR; import org.overture.codegen.ir.statements.AAssignToExpStmIR; import org.overture.codegen.ir.types.AUnionTypeIR; import org.overture.codegen.runtime.traces.Pair; import org.overture.codegen.trans.assistants.TransAssistantIR; import org.overture.codegen.trans.uniontypes.UnionTypeTrans; import org.overture.codegen.trans.uniontypes.UnionTypeVarPrefixes; import org.overture.codegen.vdm2jml.data.StateDesInfo; public class JmlUnionTypeTrans extends UnionTypeTrans { private StateDesInfo stateDesInfo; private Logger log = Logger.getLogger(this.getClass().getName()); public JmlUnionTypeTrans(TransAssistantIR transAssistant, UnionTypeVarPrefixes unionTypePrefixes, List<INode> cloneFreeNodes, StateDesInfo stateDesInfo) { super(transAssistant, unionTypePrefixes, cloneFreeNodes); this.stateDesInfo = stateDesInfo; } @Override public void caseAAssignToExpStmIR(AAssignToExpStmIR node) throws AnalysisException { if (node.getTarget() instanceof AFieldExpIR) { AFieldExpIR field = (AFieldExpIR) node.getTarget(); if (field.getObject().getType() instanceof AUnionTypeIR) { if (p != null) { log.error("Expected no state designator data by now"); } p = this.stateDesInfo.remove(node); handAssignRighHandSide(node); handleAssignTarget(node); } } else { handAssignRighHandSide(node); } p = null; } Pair<List<AIdentifierVarExpIR>, List<AVarDeclIR>> p = null; @Override public AAssignToExpStmIR castFieldObj(AAssignToExpStmIR assign, AFieldExpIR target, STypeIR possibleType) { AAssignToExpStmIR ret = super.castFieldObj(assign, target, possibleType); if (p != null) { stateDesInfo.register(ret, p.getFirst(), p.getSecond()); } else { log.error("Expected to have state designator data at this point"); } return ret; } }