Skip to content

Commit 3fefa2f

Browse files
authored
Add Boxed Types Support (#149)
1 parent 3562af1 commit 3fefa2f

File tree

6 files changed

+64
-11
lines changed

6 files changed

+64
-11
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Refinement Error
2+
package testSuite;
3+
4+
import liquidjava.specification.Refinement;
5+
6+
@SuppressWarnings("unused")
7+
public class CorrectBoxedTypes {
8+
public static void main(String[] args) {
9+
@Refinement("_ == true")
10+
Boolean b = true;
11+
12+
@Refinement("_ > 0")
13+
Integer i = 1;
14+
15+
@Refinement("_ > 0")
16+
Double d = 1.0;
17+
}
18+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Refinement Error
2+
package testSuite;
3+
4+
import liquidjava.specification.Refinement;
5+
6+
@SuppressWarnings("unused")
7+
public class ErrorBoxedBoolean {
8+
public static void main(String[] args) {
9+
@Refinement("_ == true")
10+
Boolean b = false;
11+
}
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Refinement Error
2+
package testSuite;
3+
4+
import liquidjava.specification.Refinement;
5+
6+
@SuppressWarnings("unused")
7+
public class ErrorBoxedDouble {
8+
public static void main(String[] args) {
9+
@Refinement("_ > 0")
10+
Double d = -1.0;
11+
}
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Refinement Error
2+
package testSuite;
3+
4+
import liquidjava.specification.Refinement;
5+
6+
@SuppressWarnings("unused")
7+
public class ErrorBoxedInteger {
8+
public static void main(String[] args) {
9+
@Refinement("_ > 0")
10+
Integer j = -1;
11+
}
12+
}

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ public static void storeVariablesSubtypes(Context z3, List<RefinedVariable> vari
4242
private static Expr<?> getExpr(Context z3, String name, CtTypeReference<?> type) {
4343
String typeName = type.getQualifiedName();
4444
return switch (typeName) {
45-
case "int", "short" -> z3.mkIntConst(name);
46-
case "boolean" -> z3.mkBoolConst(name);
47-
case "long" -> z3.mkRealConst(name);
48-
case "float", "double" -> (FPExpr) z3.mkConst(name, z3.mkFPSort64());
45+
case "int", "short", "java.lang.Integer", "java.lang.Short" -> z3.mkIntConst(name);
46+
case "boolean", "java.lang.Boolean" -> z3.mkBoolConst(name);
47+
case "long", "java.lang.Long" -> z3.mkRealConst(name);
48+
case "float", "double", "java.lang.Float", "java.lang.Double" -> (FPExpr) z3.mkConst(name, z3.mkFPSort64());
4949
case "int[]" -> z3.mkArrayConst(name, z3.mkIntSort(), z3.mkIntSort());
5050
default -> z3.mkConst(name, z3.mkUninterpretedSort(typeName));
5151
};
@@ -81,11 +81,11 @@ private static void addBuiltinFunctions(Context z3, Map<String, FuncDecl<?>> fun
8181

8282
static Sort getSort(Context z3, String sort) {
8383
return switch (sort) {
84-
case "int" -> z3.getIntSort();
85-
case "boolean" -> z3.getBoolSort();
86-
case "long" -> z3.getRealSort();
87-
case "float" -> z3.mkFPSort32();
88-
case "double" -> z3.mkFPSortDouble();
84+
case "int", "short", "java.lang.Integer", "java.lang.Short" -> z3.getIntSort();
85+
case "boolean", "java.lang.Boolean" -> z3.getBoolSort();
86+
case "long", "java.lang.Long" -> z3.getRealSort();
87+
case "float", "java.lang.Float" -> z3.mkFPSort32();
88+
case "double", "java.lang.Double" -> z3.mkFPSortDouble();
8989
case "int[]" -> z3.mkArraySort(z3.mkIntSort(), z3.mkIntSort());
9090
case "String" -> z3.getStringSort();
9191
case "void" -> z3.mkUninterpretedSort("void");

liquidjava-verifier/src/main/java/liquidjava/utils/Utils.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ private static boolean isLiquidJavaAnnotation(CtAnnotation<?> annotation) {
5050

5151
private static boolean hasRefinementValue(CtAnnotation<?> annotation, String refinement) {
5252
Map<String, ?> values = annotation.getValues();
53-
return Stream.of("value", "to", "from")
54-
.anyMatch(key -> refinement.equals(String.valueOf(values.get(key))));
53+
return Stream.of("value", "to", "from").anyMatch(key -> refinement.equals(String.valueOf(values.get(key))));
5554
}
5655
}

0 commit comments

Comments
 (0)