package org.overture.codegen.vdm2cpp;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
import org.overture.ast.analysis.AnalysisException;
import org.overture.ast.lex.Dialect;
import org.overture.codegen.analysis.violations.InvalidNamesResult;
import org.overture.codegen.analysis.violations.UnsupportedModelingException;
import org.overture.codegen.ir.IRSettings;
import org.overture.codegen.logging.Logger;
import org.overture.codegen.utils.GeneralUtils;
import org.overture.codegen.utils.Generated;
import org.overture.codegen.utils.GeneratedData;
import org.overture.codegen.utils.GeneratedModule;
import org.overture.config.Release;
import org.overture.config.Settings;
public class CppCodeGenMain
{
public static void main(String[] args)
{
Settings.release = Release.VDM_10;
Dialect dialect = Dialect.VDM_RT;
boolean gen_timing = false;
if (args.length <= 1)
{
Logger.getLog().println("Wrong input!");
}
IRSettings irSettings = new IRSettings();
irSettings.setCharSeqAsString(true);
irSettings.setGeneratePreConds(false);
irSettings.setGeneratePreCondChecks(false);
irSettings.setGeneratePostConds(false);
irSettings.setGeneratePostCondChecks(false);
CppSettings cppSettings = new CppSettings();
List<File> nfiles = new LinkedList<File>();
List<String> cg_ignore = new LinkedList<String>();
//cg_ignore.add("FileReader.vdmrt");
String setting = args[0];
String cpp_gen_type = args[1];
if(args.length > 2)
{
if(Boolean.parseBoolean(args[2]))
{
gen_timing = true;
}
}
File inputRoot = new File(args[3]);
if (setting.toLowerCase().equals("oo"))
{
try
{
List<File> files = GeneralUtils.getFilesRecursively(inputRoot);
for( File f : files)
{
if(f.getName().endsWith(".vdmpp") || f.getName().endsWith(".vdmrt"))
{
nfiles.add(f);
}
}
for(File f2 : nfiles)
{
System.out.println(f2.getName());
}
List<File> libFiles = GeneralUtils.getFiles(new File("src/test/resources/lib".replace('/', File.separatorChar)));
nfiles.addAll(libFiles);
GeneratedData data = CppCodeGenUtil.generateCppFromFiles(nfiles, irSettings, cppSettings, dialect,cpp_gen_type,gen_timing);
List<GeneratedModule> generatedClasses = data.getClasses();
for (GeneratedModule generatedClass : generatedClasses)
{
//Logger.getLog().println("**********");
if (generatedClass.hasMergeErrors())
{
Logger.getLog().println(String.format("Class %s could not be merged. Following merge errors were found:", generatedClass.getName()));
CppCodeGenUtil.printMergeErrors(generatedClass.getMergeErrors());
} else if (!generatedClass.canBeGenerated())
{
Logger.getLog().println("Could not generate class: "
+ generatedClass.getName() + "\n");
CppCodeGenUtil.printUnsupportedNodes(generatedClass.getUnsupportedInIr());
} else
{
//Logger.getLog().println(generatedClass.getContent());
File output = new File("target/test-results/"+inputRoot.getName());
if(args.length>3)
output = new File(args[4]);
CppCodeGenUtil.saveCppClass(output, generatedClass.getName()+".hpp", generatedClass.getContent());
}
Logger.getLog().println("\n");
}
List<GeneratedModule> quotes = data.getQuoteValues();
if (quotes != null && !quotes.isEmpty())
{
for(GeneratedModule q : quotes)
{
//Logger.getLog().println("**********");
Logger.getLog().println(q.getContent());
}
}
InvalidNamesResult invalidName = data.getInvalidNamesResult();
if (!invalidName.isEmpty())
{
Logger.getLog().println(CppCodeGenUtil.constructNameViolationsString(invalidName));
}
} catch (AnalysisException e)
{
Logger.getLog().println(e.getMessage());
} catch (UnsupportedModelingException e)
{
Logger.getLog().println("Could not generate model: "
+ e.getMessage());
Logger.getLog().println(CppCodeGenUtil.constructUnsupportedModelingString(e));
}
} else if (setting.toLowerCase().equals("exp"))
{
try
{
Generated generated = CppCodeGenUtil.generateCppFromExp(args[1], irSettings, cppSettings);
if (generated.hasMergeErrors())
{
Logger.getLog().println(String.format("VDM expression '%s' could not be merged. Following merge errors were found:", args[1]));
CppCodeGenUtil.printMergeErrors(generated.getMergeErrors());
} else if (!generated.canBeGenerated())
{
Logger.getLog().println("Could not generate VDM expression: "
+ args[1]);
CppCodeGenUtil.printUnsupportedNodes(generated.getUnsupportedInIr());
} else
{
Logger.getLog().println(generated.getContent().trim());
}
} catch (AnalysisException e)
{
Logger.getLog().println(e.getMessage());
}
}
}
}