package org.overture.isapog;
import org.apache.commons.cli.*;
import org.overture.ast.analysis.AnalysisException;
import org.overture.ast.expressions.PExp;
import org.overture.ast.lex.Dialect;
import org.overture.ast.modules.AModuleModules;
import org.overture.ast.node.INode;
import org.overture.codegen.ir.CodeGenBase;
import org.overture.codegen.utils.GeneralCodeGenUtils;
import org.overture.config.Release;
import org.overture.config.Settings;
import org.overture.typechecker.util.TypeCheckerUtil;
import org.overturetool.cgisa.IsaGen;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* Created by ldc on 09/02/16.
*/
public class IsaPogCLI {
private static final String GENERATE_BOTH_OPT = "b";
private static final String GENERATE_BOTH_LONG_OPT = "model-pos";
private static final String GENERATE_BOTH_DESC = "Generate Isabelle theories for model and pos search to same country only.";
private static final String PRINT_OPT = "p";
private static final String PRINT_LONG_OPT = "print";
private static final String PRINT_DESC = "Print output to console instead of generating files.";
private static final String EXP_OPT = "e";
private static final String EXP_DESC = "blah";
private static final String USAGE = "java -jar isapog.jar source1 source2...";
public static final String GEN_FOLDER_NAME = "generated";
public static void main(final String[] args) {
CommandLineParser clp = new DefaultParser();
CommandLine cmd = null;
Options opts = new Options();
opts.addOption(GENERATE_BOTH_OPT, GENERATE_BOTH_LONG_OPT, false, GENERATE_BOTH_DESC);
opts.addOption(PRINT_OPT, PRINT_LONG_OPT, false, PRINT_DESC);
opts.addOption(EXP_OPT, EXP_DESC);
cmd = parseAndCheck(args, clp, cmd, opts);
process(cmd, opts);
}
private static void process(CommandLine cmd, Options opts) {
try {
// Settings.release= Release.DEFAULT;
Settings.dialect = Dialect.VDM_SL;
if (cmd.hasOption(EXP_OPT)) {
TypeCheckerUtil.TypeCheckResult<PExp> expResult = TypeCheckerUtil.typeCheckExpression(cmd.getArgList().get(0));
validateInput(expResult);
System.out.println(IsaGen.vdmExp2IsaString(expResult.result));
System.exit(0);
}
List<String> sources = cmd.getArgList();
List<File> files = new ArrayList<>(sources.size());
for (String s : sources) {
File f = new File(s);
if (f.exists()) {
files.add(new File(s));
} else {
printUsage(opts);
}
}
TypeCheckerUtil.TypeCheckResult<List<AModuleModules>> result = TypeCheckerUtil.typeCheckSl(files);
validateInput(result);
List<INode> ast = CodeGenBase.getNodes(result.result);
IsaPog ip = new IsaPog(ast);
File folder = new File(GEN_FOLDER_NAME);
CodeGenBase.emitCode(folder, ip.getModelThyName(), ip.getModelThyString());
if (cmd.hasOption(GENERATE_BOTH_OPT)) {
CodeGenBase.emitCode(folder, ip.getPosThyName(), ip.getPosThyString());
}
} catch (AnalysisException e) {
System.err.println("Error processing the model:");
System.err.println(e.getMessage());
System.exit(1);
} catch (org.overture.codegen.ir.analysis.AnalysisException e) {
System.err.println("Error generating Isabelle sources:");
System.err.println(e.getMessage());
System.exit(1);
}
}
private static void validateInput(TypeCheckerUtil.TypeCheckResult<?> result) {
if (GeneralCodeGenUtils.hasErrors(result)) {
System.err.println("Found errors in VDM model:");
System.err.println(GeneralCodeGenUtils.errorStr(result));
System.exit(1);
}
}
private static CommandLine parseAndCheck(String[] args, CommandLineParser clp, CommandLine cmd, Options opts) {
try {
cmd = clp.parse(opts, args);
} catch (ParseException e) {
printUsage(opts);
}
if (cmd.getArgList().size() < 1) {
printUsage(opts);
}
return cmd;
}
private static void printUsage(Options opts) {
HelpFormatter help = new HelpFormatter();
help.printHelp(USAGE, opts);
System.exit(1);
}
}