package org.overture.codegen.vdm2jml.predgen;
import org.overture.codegen.ir.IRInfo;
import org.overture.codegen.ir.SExpIR;
import org.overture.codegen.ir.declarations.ARecordDeclIR;
import org.overture.codegen.ir.expressions.ACastUnaryExpIR;
import org.overture.codegen.ir.expressions.SVarExpIR;
import org.overture.codegen.ir.statements.ACallObjectExpStmIR;
import org.overture.codegen.ir.statements.AMetaStmIR;
import org.overture.codegen.ir.types.ARecordTypeIR;
import org.overture.codegen.vdm2jml.JmlGenerator;
public class RecModUtil
{
private RecModHandler handler;
public RecModUtil(RecModHandler handler)
{
this.handler = handler;
}
public boolean simpleRecSetCallOutsideAtomic(ACallObjectExpStmIR node)
{
if (handler.getInvTrans().getJmlGen().getJavaGen().getInfo().getStmAssistant().inAtomic(node))
{
return false;
}
SExpIR obj = node.getObj();
if (!(obj.getType() instanceof ARecordTypeIR))
{
return false;
}
if (obj instanceof SVarExpIR)
{
return true;
}
if (obj instanceof ACastUnaryExpIR
&& ((ACastUnaryExpIR) obj).getExp() instanceof SVarExpIR)
{
return true;
}
return false;
}
public AMetaStmIR handleRecAssert(SExpIR var, String varName,
ARecordTypeIR recType)
{
return handler.getInvTrans().consMetaStm(consValidRecCheck(var, varName, recType));
}
public String consValidRecCheck(SExpIR subject, String varName,
ARecordTypeIR recType)
{
StringBuilder as = new StringBuilder();
as.append("//@ assert ");
String subjectStr;
if (subject instanceof ACastUnaryExpIR)
{
String fullRecType = handler.getInvTrans().getTypePredUtil().fullyQualifiedRecType(recType);
as.append(varName);
as.append(JmlGenerator.JAVA_INSTANCEOF);
as.append(fullRecType);
as.append(JmlGenerator.JML_IMPLIES);
subjectStr = "((" + fullRecType + ") " + varName + ")";
} else
{
subjectStr = varName;
}
if (handler.getInvTrans().getJmlGen().getJmlSettings().genInvariantFor())
{
as.append(JmlGenerator.JML_INVARIANT_FOR);
as.append('(');
as.append(subjectStr);
as.append(')');
} else
{
as.append(subjectStr);
as.append('.');
as.append(JmlGenerator.REC_VALID_METHOD_CALL);
}
as.append(';');
return as.toString();
}
public boolean assertRec(SExpIR exp)
{
if (exp.getType().getNamedInvType() != null
|| !(exp.getType() instanceof ARecordTypeIR))
{
return false;
}
IRInfo info = handler.getInvTrans().getJmlGen().getJavaGen().getInfo();
ARecordDeclIR rec = info.getDeclAssistant().findRecord(info.getClasses(), (ARecordTypeIR) exp.getType());
return rec.getInvariant() != null;
}
}