Skip to content

Commit d020cac

Browse files
committed
Keep negative literal values self-contained across methods
1 parent 3cb5b40 commit d020cac

1 file changed

Lines changed: 8 additions & 0 deletions

File tree

  • liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/general_checkers

‎liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/general_checkers/OperationsChecker.java‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import liquidjava.rj_language.Predicate;
1919
import liquidjava.rj_language.ast.BinaryExpression;
2020
import liquidjava.rj_language.ast.Expression;
21+
import liquidjava.rj_language.ast.UnaryExpression;
2122
import org.apache.commons.lang3.NotImplementedException;
2223
import spoon.reflect.code.BinaryOperatorKind;
2324
import spoon.reflect.code.CtAssignment;
@@ -122,6 +123,13 @@ public Predicate getOperatorAssignmentRefinement(String assignedName, CtOperator
122123
@SuppressWarnings({ "unchecked" })
123124
public <T> void getUnaryOpRefinements(CtUnaryOperator<T> operator) throws LJError {
124125
CtExpression<T> ex = (CtExpression<T>) operator.getOperand();
126+
if (operator.getKind() == UnaryOperatorKind.NEG && ex instanceof CtLiteral<?> literal
127+
&& literal.getValue() instanceof Number) {
128+
Predicate operand = Predicate.createLit(literal.getValue().toString(), ex.getType().getQualifiedName());
129+
Predicate value = new Predicate(new UnaryExpression("-", operand.getExpression()));
130+
operator.putMetadata(Keys.REFINEMENT, Predicate.createEquals(Predicate.createVar(Keys.WILDCARD), value));
131+
return;
132+
}
125133
String name = Formats.FRESH;
126134
Predicate all;
127135
if (ex instanceof CtVariableWrite<T> w) {

0 commit comments

Comments
 (0)