diff --git a/liquidjava-example/src/main/java/testSuite/CorrectCombinedNestedFields.java b/liquidjava-example/src/main/java/testSuite/CorrectCombinedNestedFields.java new file mode 100644 index 00000000..82c1fa7a --- /dev/null +++ b/liquidjava-example/src/main/java/testSuite/CorrectCombinedNestedFields.java @@ -0,0 +1,33 @@ +package testSuite; + +import liquidjava.specification.Refinement; + +public class CorrectCombinedNestedFields { + @Refinement("_ < 0") + int port = -1; + + private final Job job = new Job(); + + static class Marker { + int value; + } + + @Refinement("_ < 0") + public int getOuterPort() { + return port; + } + + @Refinement("_ >= 0") + public int getJobPort() { + return job.port; + } + + public void send() { + job.port = 5; + } + + static class Job { + @Refinement("_ >= 0") + int port; + } +} diff --git a/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/general_checkers/OperationsChecker.java b/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/general_checkers/OperationsChecker.java index c8641c6f..e547cdd0 100644 --- a/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/general_checkers/OperationsChecker.java +++ b/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/general_checkers/OperationsChecker.java @@ -18,6 +18,7 @@ import liquidjava.rj_language.Predicate; import liquidjava.rj_language.ast.BinaryExpression; import liquidjava.rj_language.ast.Expression; +import liquidjava.rj_language.ast.UnaryExpression; import org.apache.commons.lang3.NotImplementedException; import spoon.reflect.code.BinaryOperatorKind; import spoon.reflect.code.CtAssignment; @@ -122,6 +123,13 @@ public Predicate getOperatorAssignmentRefinement(String assignedName, CtOperator @SuppressWarnings({ "unchecked" }) public void getUnaryOpRefinements(CtUnaryOperator operator) throws LJError { CtExpression ex = (CtExpression) operator.getOperand(); + if (operator.getKind() == UnaryOperatorKind.NEG && ex instanceof CtLiteral literal + && literal.getValue() instanceof Number) { + Predicate operand = Predicate.createLit(literal.getValue().toString(), ex.getType().getQualifiedName()); + Predicate value = new Predicate(new UnaryExpression("-", operand.getExpression())); + operator.putMetadata(Keys.REFINEMENT, Predicate.createEquals(Predicate.createVar(Keys.WILDCARD), value)); + return; + } String name = Formats.FRESH; Predicate all; if (ex instanceof CtVariableWrite w) {