package org.overture.codegen.vdm2jml.predgen; import java.util.LinkedList; import java.util.List; import org.overture.ast.util.ClonableString; 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.declarations.ADefaultClassDeclIR; import org.overture.codegen.ir.statements.AAtomicStmIR; import org.overture.codegen.ir.statements.AMetaStmIR; import org.overture.codegen.vdm2jml.JmlGenerator; public abstract class AtomicAssertTrans extends DepthFirstAnalysisAdaptor { protected JmlGenerator jmlGen; private List<AMetaStmIR> recVarChecks = null; public AtomicAssertTrans(JmlGenerator jmlGen) { this.jmlGen = jmlGen; } @Override public void caseAAtomicStmIR(AAtomicStmIR node) throws AnalysisException { recVarChecks = new LinkedList<AMetaStmIR>(); for (SStmIR stm : node.getStatements()) { stm.apply(this); } ADefaultClassDeclIR encClass = node.getAncestor(ADefaultClassDeclIR.class); node.getStatements().addFirst(consInvChecksStm(false, encClass)); node.getStatements().add(consInvChecksStm(true, encClass)); for (AMetaStmIR as : recVarChecks) { node.getStatements().add(as); } recVarChecks = null; } public AMetaStmIR consMetaStm(String str) { AMetaStmIR assertion = new AMetaStmIR(); jmlGen.getAnnotator().appendMetaData(assertion, jmlGen.getAnnotator().consMetaData(str)); return assertion; } protected AMetaStmIR consInvChecksStm(boolean val, ADefaultClassDeclIR encClass) { AMetaStmIR setStm = new AMetaStmIR(); String setStmStr = String.format(JmlGenerator.JML_SET_INV_CHECKS, this.jmlGen.getAnnotator().consInvChecksOnNameEncClass(encClass), val); List<ClonableString> setMetaData = jmlGen.getAnnotator().consMetaData(setStmStr); jmlGen.getAnnotator().appendMetaData(setStm, setMetaData); return setStm; } public JmlGenerator getJmlGen() { return jmlGen; } public void addPostAtomicCheck(AMetaStmIR check) { if (!contains(check)) { recVarChecks.add(check); } } private boolean contains(AMetaStmIR check) { for (AMetaStmIR as : recVarChecks) { if (jmlGen.getJavaGen().getInfo().getStmAssistant().equal(as, check)) { return true; } } return false; } public boolean inAtomic() { return recVarChecks != null; } }