Skip to content

Commit 2f620af

Browse files
committed
Split args into a separate file
Arguments are now accessed via an object in the CommandLineLauncher class, so that it's easier in the future to implement new flags.
1 parent d9c0b9a commit 2f620af

6 files changed

Lines changed: 47 additions & 58 deletions

File tree

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package liquidjava.api;
2+
3+
import java.util.List;
4+
import java.util.concurrent.Callable;
5+
6+
import picocli.CommandLine.Command;
7+
import picocli.CommandLine.Option;
8+
import picocli.CommandLine.Parameters;
9+
10+
@Command(name = "liquidjava", mixinStandardHelpOptions = false, customSynopsis = "./liquidjava <...paths> <options>")
11+
public class CommandLineArgs {
12+
@Option(names = {"-h", "--help"}, usageHelp = true, description = "Display this help message")
13+
public boolean help;
14+
15+
@Option(names = { "-d", "--debug" }, description = "Enable debug mode for more detailed output")
16+
public boolean debugMode;
17+
18+
@Parameters(arity = "1..*", paramLabel = "<...paths>", description = "Paths to be verified by LiquidJava")
19+
public List<String> paths;
20+
}

liquidjava-verifier/src/main/java/liquidjava/api/CommandLineLauncher.java

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,13 @@
22

33
import java.io.File;
44
import java.util.Arrays;
5-
import java.util.List;
6-
import java.util.concurrent.Callable;
75

86
import liquidjava.diagnostics.Diagnostics;
97
import liquidjava.diagnostics.errors.CustomError;
108
import liquidjava.diagnostics.warnings.CustomWarning;
119
import liquidjava.processor.RefinementProcessor;
1210
import liquidjava.processor.context.ContextHistory;
1311
import picocli.CommandLine;
14-
import picocli.CommandLine.Command;
15-
import picocli.CommandLine.Option;
16-
import picocli.CommandLine.Parameters;
1712
import spoon.Launcher;
1813
import spoon.compiler.Environment;
1914
import spoon.processing.ProcessingManager;
@@ -25,46 +20,29 @@ public class CommandLineLauncher {
2520

2621
private static final Diagnostics diagnostics = Diagnostics.getInstance();
2722
private static final ContextHistory contextHistory = ContextHistory.getInstance();
23+
public static final CommandLineArgs cmdArgs = new CommandLineArgs();
2824

2925
public static void main(String[] args) {
30-
CommandLine commandLine = new CommandLine(new CliArguments());
31-
int exitCode = commandLine.execute(args);
32-
if (exitCode != 0) {
33-
System.exit(exitCode);
34-
}
35-
}
36-
37-
@Command(name = "liquidjava", mixinStandardHelpOptions = true, customSynopsis = "./liquidjava <...paths> <options>")
38-
private static class CliArguments implements Callable<Integer> {
39-
40-
@Option(names = { "-d", "--debug" }, description = "Enable debug mode for more detailed output")
41-
private boolean debugMode;
42-
43-
@Parameters(arity = "1..*", paramLabel = "<...paths>", description = "Paths to be verified by LiquidJava")
44-
private List<String> paths;
45-
46-
@Override
47-
public Integer call() {
48-
if (debugMode) {
49-
System.out.println("Debug mode enabled");
50-
System.out.println("Input paths: " + paths);
51-
diagnostics.setDebugMode();
52-
}
26+
CommandLine cmd = new CommandLine(cmdArgs);
27+
cmd.parseArgs(args);
5328

54-
launch(paths.stream().toArray(String[]::new));
29+
if (cmd.isUsageHelpRequested()) {
30+
cmd.usage(System.out);
31+
return;
32+
}
5533

56-
// print diagnostics
57-
if (diagnostics.foundWarning()) {
58-
System.out.println(diagnostics.getWarningOutput());
59-
}
60-
if (diagnostics.foundError()) {
61-
System.out.println(diagnostics.getErrorOutput());
62-
return 1;
63-
}
34+
launch(cmdArgs.paths.stream().toArray(String[]::new));
6435

65-
System.out.println("Correct! Passed Verification.");
66-
return 0;
36+
// print diagnostics
37+
if (diagnostics.foundWarning()) {
38+
System.out.println(diagnostics.getWarningOutput());
39+
}
40+
if (diagnostics.foundError()) {
41+
System.out.println(diagnostics.getErrorOutput());
42+
return;
6743
}
44+
45+
System.out.println("Correct! Passed Verification.");
6846
}
6947

7048
public static void launch(String... paths) {

liquidjava-verifier/src/main/java/liquidjava/diagnostics/errors/RefinementError.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.List;
55
import java.util.stream.Collectors;
66

7+
import liquidjava.api.CommandLineLauncher;
78
import liquidjava.diagnostics.TranslationTable;
89
import liquidjava.rj_language.opt.derivation_node.ValDerivationNode;
910
import liquidjava.smt.Counterexample;
@@ -45,7 +46,7 @@ public String getCounterExampleString() {
4546
found.getValue().getVariableNames(foundVarNames);
4647
String counterexampleString = counterexample.assignments().stream()
4748
// only include variables that appear in the found value
48-
.filter(a -> foundVarNames.contains(a.first()))
49+
.filter(a -> CommandLineLauncher.cmdArgs.debugMode || foundVarNames.contains(a.first()))
4950
// format as "var == value"
5051
.map(a -> a.first() + " == " + a.second())
5152
// join with "&&"

liquidjava-verifier/src/main/java/liquidjava/rj_language/Predicate.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.util.Map;
77
import java.util.stream.Collectors;
88

9+
import liquidjava.api.CommandLineLauncher;
910
import liquidjava.diagnostics.errors.LJError;
1011
import liquidjava.processor.context.AliasWrapper;
1112
import liquidjava.processor.context.Context;
@@ -188,6 +189,9 @@ public Expression getExpression() {
188189
}
189190

190191
public ValDerivationNode simplify() {
192+
if (CommandLineLauncher.cmdArgs.debugMode) {
193+
return new ValDerivationNode(exp.clone(), null);
194+
}
191195
return ExpressionSimplifier.simplify(exp.clone());
192196
}
193197

liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/ExpressionSimplifier.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,13 @@
1010

1111
public class ExpressionSimplifier {
1212

13-
private static final Diagnostics diagnostics = Diagnostics.getInstance();
14-
1513
/**
1614
* Simplifies an expression by applying constant propagation, constant folding and removing redundant conjuncts
1715
* Returns a derivation node representing the tree of simplifications applied
1816
*/
1917
public static ValDerivationNode simplify(Expression exp) {
2018
ValDerivationNode fixedPoint = simplifyToFixedPoint(null, exp);
21-
ValDerivationNode simplified = simplifyValDerivationNode(fixedPoint);
22-
if (diagnostics.isDebugMode()) {
23-
System.out.println("Simplified expression: original: " + exp + " | simplified: " + simplified.getValue());
24-
}
25-
return simplified;
19+
return simplifyValDerivationNode(fixedPoint);
2620
}
2721

2822
/**

liquidjava-verifier/src/main/java/liquidjava/smt/SMTEvaluator.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,19 @@
11
package liquidjava.smt;
22

3-
import java.util.Set;
4-
53
import com.martiansoftware.jsap.SyntaxException;
64
import com.microsoft.z3.Expr;
75
import com.microsoft.z3.Model;
86
import com.microsoft.z3.Solver;
97
import com.microsoft.z3.Status;
108
import com.microsoft.z3.Z3Exception;
119

12-
import liquidjava.diagnostics.Diagnostics;
10+
import liquidjava.api.CommandLineLauncher;
1311
import liquidjava.processor.context.Context;
1412
import liquidjava.rj_language.Predicate;
1513
import liquidjava.rj_language.ast.Expression;
1614

1715
public class SMTEvaluator {
1816

19-
private static final Diagnostics diagnostics = Diagnostics.getInstance();
20-
2117
/**
2218
* Verifies that subRef is a subtype of supRef by checking the satisfiability of subRef && !supRef. Creates a parser
2319
* for our SMT-ready refinement language and discharges the verification to Z3
@@ -30,8 +26,8 @@ public class SMTEvaluator {
3026
*/
3127
public SMTResult verifySubtype(Predicate subRef, Predicate supRef, Context context) throws Exception {
3228
Predicate toVerify = Predicate.createConjunction(subRef, supRef.negate());
33-
if (diagnostics.isDebugMode()) {
34-
System.out.println("Verifying: " + toVerify);
29+
if (CommandLineLauncher.cmdArgs.debugMode) {
30+
System.out.println("Verifying: " + subRef + " <: " + supRef);
3531
}
3632
try {
3733
Expression exp = toVerify.getExpression();
@@ -45,10 +41,6 @@ public SMTResult verifySubtype(Predicate subRef, Predicate supRef, Context conte
4541
if (result.equals(Status.SATISFIABLE)) {
4642
Model model = solver.getModel();
4743
Counterexample counterexample = tz3.getCounterexample(model);
48-
if (diagnostics.isDebugMode()) {
49-
System.out.println("Verification failed. Counterexample:");
50-
System.out.println(counterexample);
51-
}
5244
return SMTResult.error(counterexample);
5345
}
5446
}

0 commit comments

Comments
 (0)