package org.overture.codegen.traces;
import org.overture.ast.analysis.AnalysisException;
import org.overture.ast.definitions.traces.AInstanceTraceDefinition;
import org.overture.ast.definitions.traces.ALetBeStBindingTraceDefinition;
import org.overture.ast.definitions.traces.ALetDefBindingTraceDefinition;
import org.overture.ast.definitions.traces.ARepeatTraceDefinition;
import org.overture.ast.definitions.traces.PTraceCoreDefinition;
import org.overture.ast.definitions.traces.PTraceDefinition;
import org.overture.ast.expressions.PExp;
import org.overture.ast.patterns.ASetMultipleBind;
import org.overture.ast.patterns.PMultipleBind;
import org.overture.codegen.ir.IRInfo;
import org.overture.codegen.ir.SExpIR;
import org.overture.codegen.ir.SMultipleBindIR;
import org.overture.codegen.ir.STraceCoreDeclIR;
import org.overture.codegen.ir.STraceDeclIR;
import org.overture.codegen.ir.patterns.ASetMultipleBindIR;
import org.overture.codegen.ir.traces.ALetBeStBindingTraceDeclIR;
import org.overture.codegen.ir.traces.ALetDefBindingTraceDeclIR;
import org.overture.codegen.ir.traces.ARepeatTraceDeclIR;
import org.overture.codegen.visitor.AbstractVisitorIR;
public class TraceDeclVisitorIR extends AbstractVisitorIR<IRInfo, STraceDeclIR>
{
@Override
public STraceDeclIR caseAInstanceTraceDefinition(
AInstanceTraceDefinition node, IRInfo question)
throws AnalysisException
{
assert false : "This node does not exist in the VDM AST";
return null;
}
@Override
public STraceDeclIR caseALetBeStBindingTraceDefinition(
ALetBeStBindingTraceDefinition node, IRInfo question)
throws AnalysisException
{
PMultipleBind multipleBind = node.getBind();
if (!(multipleBind instanceof ASetMultipleBind))
{
question.addUnsupportedNode(node, "Generation of the let be st trace definition"
+ " is only supported for a multiple set bind. Got: "
+ multipleBind);
return null;
}
PTraceDefinition body = node.getBody();
PExp stExp = node.getStexp();
SMultipleBindIR multipleBindCg = multipleBind.apply(question.getMultipleBindVisitor(), question);
if (!(multipleBindCg instanceof ASetMultipleBindIR))
{
return null;
}
STraceDeclIR bodyCg = body.apply(question.getTraceDeclVisitor(), question);
SExpIR stExpCg = stExp != null
? stExp.apply(question.getExpVisitor(), question) : null;
ALetBeStBindingTraceDeclIR letBeSt = new ALetBeStBindingTraceDeclIR();
letBeSt.setBind((ASetMultipleBindIR) multipleBindCg);
letBeSt.setBody(bodyCg);
letBeSt.setStExp(stExpCg);
;
return letBeSt;
}
@Override
public STraceDeclIR caseALetDefBindingTraceDefinition(
ALetDefBindingTraceDefinition node, IRInfo question)
throws AnalysisException
{
PTraceDefinition body = node.getBody();
ALetDefBindingTraceDeclIR letDef = new ALetDefBindingTraceDeclIR();
question.getDeclAssistant().setFinalLocalDefs(node.getLocalDefs(), letDef.getLocalDefs(), question);
STraceDeclIR bodyCg = body.apply(question.getTraceDeclVisitor(), question);
letDef.setBody(bodyCg);
return letDef;
}
@Override
public STraceDeclIR caseARepeatTraceDefinition(ARepeatTraceDefinition node,
IRInfo question) throws AnalysisException
{
PTraceCoreDefinition core = node.getCore();
Long from = node.getFrom();
Long to = node.getTo();
STraceCoreDeclIR coreCg = core.apply(question.getTraceCoreDeclVisitor(), question);
ARepeatTraceDeclIR repeatTraceDecl = new ARepeatTraceDeclIR();
repeatTraceDecl.setCore(coreCg);
repeatTraceDecl.setFrom(from);
repeatTraceDecl.setTo(to);
return repeatTraceDecl;
}
}