Skip to content

Commit 88be104

Browse files
committed
Fix Origins
1 parent 8932b49 commit 88be104

4 files changed

Lines changed: 19 additions & 5 deletions

File tree

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,14 @@ private VCImplication apply(VCImplication implication, C context) {
3232
Expression expression = implication.getRefinement().getExpression();
3333
Expression simplified = simplify(expression, context);
3434
if (!expression.equals(simplified)) {
35-
VCImplication result = new SimplifiedVCImplication(implication, new Predicate(simplified), implication);
35+
VCImplication origin = implication.copyWithRefinement(implication.getRefinement().clone());
36+
VCImplication previousOrigin = implication.getOrigin();
37+
if (previousOrigin != null) {
38+
VCImplication displayed = new VCImplication(implication, implication.getRefinement().clone());
39+
if (displayed.toString().equals(previousOrigin.toString()))
40+
origin = previousOrigin;
41+
}
42+
VCImplication result = new SimplifiedVCImplication(implication, new Predicate(simplified), origin);
3643
result.setNext(implication.getNext() == null ? null : implication.getNext().clone());
3744
return result;
3845
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ private VCImplication substituteNode(VCImplication implication, VCImplication no
6464
return implication.copyWithRefinement(new Predicate(exp));
6565

6666
Expression substituted = exp.substitute(new Var(node.getName()), replacement.clone());
67-
VCImplication origin = new VCImplication(node.getName(), node.getType(), implication.getOriginRefinement());
67+
VCImplication origin = new VCImplication(node, implication.getRefinement().clone());
68+
if (implication.getOrigin() != null)
69+
origin = new SimplifiedVCImplication(origin, origin.getRefinement(), implication.getOrigin());
6870
return new SimplifiedVCImplication(implication, new Predicate(substituted), origin);
6971
}
7072

liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/VCSimplificationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ void simplifyAppliesMultipleSubstitutionsBeforeReachingFixedPoint() {
129129

130130
assertSimplificationSteps(VCSimplification::simplifyOnce, implication,
131131
chain(expect("y == 3 + 1", "∀x:int. y == x + 1"), expect("y > 3", "∀x:int. y > x")),
132-
chain(expect("3 + 1 > 3", "∀y:int. y > x")), chain(expect("4 > 3", "3 + 1 > 3")),
132+
chain(expect("3 + 1 > 3", "∀y:int. y > 3")), chain(expect("4 > 3", "3 + 1 > 3")),
133133
chain(expect("true", "4 > 3")));
134134
}
135135

liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/VCSubstitutionTest.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package liquidjava.rj_language.opt;
22

33
import static liquidjava.utils.VCTestUtils.*;
4+
import static org.junit.jupiter.api.Assertions.assertEquals;
45

56
import liquidjava.processor.VCImplication;
67
import org.junit.jupiter.api.Test;
@@ -86,9 +87,13 @@ void substitutesInnerKnownValueAcrossNestedImplications() {
8687
void substitutesOuterKnownValueIntoNestedBinderRefinements() {
8788
VCImplication implication = vc("∀x:int. x == 3", "∀y:int. y == x + 1", "y > x");
8889

89-
assertSimplificationSteps(substitution::apply, implication,
90+
VCImplication result = assertSimplificationSteps(substitution::apply, implication,
9091
chain(expect("y == 3 + 1", "∀x:int. y == x + 1"), expect("y > 3", "∀x:int. y > x")),
91-
chain(expect("3 + 1 > 3", "∀y:int. y > x")));
92+
chain(expect("3 + 1 > 3", "∀y:int. y > 3")));
93+
94+
VCImplication previousOrigin = result.getOrigin().getOrigin();
95+
assertEquals("x", previousOrigin.getName());
96+
assertEquals("y > x", previousOrigin.getRefinement().getExpression().toDisplayString());
9297
}
9398

9499
@Test

0 commit comments

Comments
 (0)