package org.overture.codegen.vdm2java;
import java.util.LinkedList;
import java.util.List;
import org.overture.codegen.ir.INode;
import org.overture.codegen.ir.IRInfo;
import org.overture.codegen.ir.analysis.DepthFirstAnalysisAdaptor;
import org.overture.codegen.ir.expressions.AIntLiteralExpIR;
import org.overture.codegen.ir.types.AExternalTypeIR;
import org.overture.codegen.traces.TraceNames;
import org.overture.codegen.traces.TracesTrans;
import org.overture.codegen.trans.AssignStmTrans;
import org.overture.codegen.trans.AtomicStmTrans;
import org.overture.codegen.trans.CallObjStmTrans;
import org.overture.codegen.trans.ConstructorTrans;
import org.overture.codegen.trans.DivideTrans;
import org.overture.codegen.trans.Exp2StmTrans;
import org.overture.codegen.trans.Exp2StmVarPrefixes;
import org.overture.codegen.trans.IPostCheckCreator;
import org.overture.codegen.trans.IsExpTrans;
import org.overture.codegen.trans.IterationVarPrefixes;
import org.overture.codegen.trans.LetBeStTrans;
import org.overture.codegen.trans.PostCheckTrans;
import org.overture.codegen.trans.PreCheckTrans;
import org.overture.codegen.trans.PrePostTrans;
import org.overture.codegen.trans.SeqConvTrans;
import org.overture.codegen.trans.WhileStmTrans;
import org.overture.codegen.trans.assistants.TransAssistantIR;
import org.overture.codegen.trans.conc.EvalPermPredTrans;
import org.overture.codegen.trans.conc.MainClassConcTrans;
import org.overture.codegen.trans.conc.MutexDeclTrans;
import org.overture.codegen.trans.conc.SentinelTrans;
import org.overture.codegen.trans.funcvalues.FuncValAssistant;
import org.overture.codegen.trans.funcvalues.FuncValPrefixes;
import org.overture.codegen.trans.funcvalues.FuncValTrans;
import org.overture.codegen.trans.iterator.ILanguageIterator;
import org.overture.codegen.trans.iterator.JavaLanguageIterator;
import org.overture.codegen.trans.letexps.FuncTrans;
import org.overture.codegen.trans.letexps.IfExpTrans;
import org.overture.codegen.trans.patterns.PatternTrans;
import org.overture.codegen.trans.patterns.PatternVarPrefixes;
import org.overture.codegen.trans.quantifier.Exists1CounterData;
import org.overture.codegen.trans.uniontypes.UnionTypeTrans;
import org.overture.codegen.trans.uniontypes.UnionTypeVarPrefixes;
public class JavaTransSeries
{
private static final String OBJ_INIT_CALL_NAME_PREFIX = "cg_init_";
private JavaCodeGen codeGen;
private List<DepthFirstAnalysisAdaptor> series;
private FuncValAssistant funcValAssist;
public JavaTransSeries(JavaCodeGen codeGen)
{
this.codeGen = codeGen;
this.series = new LinkedList<>();
this.funcValAssist = new FuncValAssistant();
setupAnalysis();
}
public FuncValAssistant getFuncValAssist()
{
return funcValAssist;
}
public List<DepthFirstAnalysisAdaptor> getSeries()
{
return series;
}
private List<DepthFirstAnalysisAdaptor> setupAnalysis()
{
// Data and functionality to support the transformations
IRInfo info = codeGen.getIRGenerator().getIRInfo();
JavaVarPrefixManager varMan = codeGen.getVarPrefixManager();
IterationVarPrefixes iteVarPrefixes = varMan.getIteVarPrefixes();
Exp2StmVarPrefixes exp2stmPrefixes = varMan.getExp2stmPrefixes();
TraceNames tracePrefixes = varMan.getTracePrefixes();
FuncValPrefixes funcValPrefixes = varMan.getFuncValPrefixes();
PatternVarPrefixes patternPrefixes = varMan.getPatternPrefixes();
UnionTypeVarPrefixes unionTypePrefixes = varMan.getUnionTypePrefixes();
List<INode> cloneFreeNodes = codeGen.getJavaFormat().getValueSemantics().getCloneFreeNodes();
TransAssistantIR transAssist = codeGen.getTransAssistant();
IPostCheckCreator postCheckCreator = new JavaPostCheckCreator(varMan.postCheckMethodName());
// Construct the transformations
AtomicStmTrans atomicTr = new AtomicStmTrans(transAssist, varMan.atomicTmpVar());
FuncTrans funcTr = new FuncTrans(transAssist);
DivideTrans divideTr = new DivideTrans(info);
CallObjStmTrans callObjTr = new CallObjStmTrans(info);
AssignStmTrans assignTr = new AssignStmTrans(transAssist);
PrePostTrans prePostTr = new PrePostTrans(info);
IfExpTrans ifExpTr = new IfExpTrans(transAssist);
FuncValTrans funcValTr = new FuncValTrans(transAssist, funcValAssist, funcValPrefixes);
ILanguageIterator langIte = new JavaLanguageIterator(transAssist, iteVarPrefixes);
LetBeStTrans letBeStTr = new LetBeStTrans(transAssist, langIte, iteVarPrefixes);
WhileStmTrans whileTr = new WhileStmTrans(transAssist, varMan.whileCond());
Exp2StmTrans exp2stmTr = new Exp2StmTrans(iteVarPrefixes, transAssist, consExists1CounterData(), langIte, exp2stmPrefixes);
PatternTrans patternTr = new PatternTrans(iteVarPrefixes, transAssist, patternPrefixes, varMan.casesExp());
PreCheckTrans preCheckTr = new PreCheckTrans(transAssist, new JavaValueSemanticsTag(false));
PostCheckTrans postCheckTr = new PostCheckTrans(postCheckCreator, transAssist, varMan.funcRes(), new JavaValueSemanticsTag(false));
IsExpTrans isExpTr = new IsExpTrans(transAssist, varMan.isExpSubject());
SeqConvTrans seqConvTr = new SeqConvTrans(transAssist);
TracesTrans tracesTr = new TracesTrans(transAssist, iteVarPrefixes, tracePrefixes, langIte, new JavaCallStmToStringBuilder(), cloneFreeNodes);
UnionTypeTrans unionTypeTr = new UnionTypeTrans(transAssist, unionTypePrefixes, cloneFreeNodes);
JavaToStringTrans javaToStringTr = new JavaToStringTrans(info);
RecMethodsTrans recTr = new RecMethodsTrans(codeGen.getJavaFormat().getRecCreator());
ConstructorTrans ctorTr = new ConstructorTrans(transAssist, OBJ_INIT_CALL_NAME_PREFIX);
ImportsTrans impTr = new ImportsTrans(info);
JUnit4Trans junitTr = new JUnit4Trans(transAssist, codeGen);
// Start concurrency transformations
SentinelTrans sentinelTr = new SentinelTrans(info, varMan.getConcPrefixes());
MainClassConcTrans mainClassTr = new MainClassConcTrans(info, varMan.getConcPrefixes());
MutexDeclTrans mutexTr = new MutexDeclTrans(info, varMan.getConcPrefixes());
EvalPermPredTrans evalPermPredTr = new EvalPermPredTrans(transAssist, varMan.getConcPrefixes());
// End concurrency transformations
// Set up order of transformations
series.add(atomicTr);
series.add(divideTr);
series.add(assignTr);
series.add(callObjTr);
series.add(funcTr);
series.add(prePostTr);
series.add(ifExpTr);
series.add(funcValTr);
series.add(letBeStTr);
series.add(whileTr);
series.add(exp2stmTr);
series.add(tracesTr);
series.add(patternTr);
series.add(preCheckTr);
series.add(postCheckTr);
series.add(isExpTr);
series.add(unionTypeTr);
series.add(javaToStringTr);
series.add(sentinelTr);
series.add(mutexTr);
series.add(mainClassTr);
series.add(seqConvTr);
series.add(evalPermPredTr);
series.add(recTr);
series.add(ctorTr);
series.add(impTr);
series.add(junitTr);
return series;
}
private Exists1CounterData consExists1CounterData()
{
AExternalTypeIR type = new AExternalTypeIR();
type.setName("Long");
IRInfo irInfo = codeGen.getIRGenerator().getIRInfo();
AIntLiteralExpIR initExp = irInfo.getExpAssistant().consIntLiteral(0);
return new Exists1CounterData(type, initExp);
}
public void clear()
{
funcValAssist.getFuncValInterfaces().clear();
}
}