Skip to content

Commit 92f3d12

Browse files
committed
Requested Changes
1 parent 39e54c4 commit 92f3d12

7 files changed

Lines changed: 49 additions & 51 deletions

File tree

liquidjava-verifier/src/main/java/liquidjava/processor/VCImplication.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package liquidjava.processor;
22

3+
import java.util.Objects;
4+
35
import liquidjava.rj_language.Predicate;
46
import liquidjava.utils.Utils;
57
import spoon.reflect.reference.CtTypeReference;
@@ -23,6 +25,12 @@ public VCImplication(Predicate ref) {
2325
this.refinement = ref;
2426
}
2527

28+
public VCImplication(VCImplication implication, Predicate ref) {
29+
this.name = implication.name;
30+
this.type = implication.type;
31+
this.refinement = ref;
32+
}
33+
2634
public void setNext(VCImplication c) {
2735
next = c;
2836
}
@@ -87,4 +95,26 @@ public VCImplication clone() {
8795
vc.next = this.next.clone();
8896
return vc;
8997
}
98+
99+
@Override
100+
public int hashCode() {
101+
return Objects.hash(name, typeName(), refinement, next);
102+
}
103+
104+
@Override
105+
public boolean equals(Object obj) {
106+
if (this == obj)
107+
return true;
108+
if (obj == null)
109+
return false;
110+
if (getClass() != obj.getClass())
111+
return false;
112+
VCImplication other = (VCImplication) obj;
113+
return Objects.equals(name, other.name) && Objects.equals(typeName(), other.typeName())
114+
&& Objects.equals(refinement, other.refinement) && Objects.equals(next, other.next);
115+
}
116+
117+
private String typeName() {
118+
return type == null ? null : type.getQualifiedName();
119+
}
90120
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,11 @@ public Predicate clone() {
235235
return new Predicate(exp.clone());
236236
}
237237

238+
@Override
239+
public int hashCode() {
240+
return exp.hashCode();
241+
}
242+
238243
@Override
239244
public boolean equals(Object obj) {
240245
if (this == obj)
@@ -251,6 +256,10 @@ public Expression getExpression() {
251256
return exp;
252257
}
253258

259+
public Predicate getOrigin() {
260+
return this;
261+
}
262+
254263
public ValDerivationNode simplify(Context context) {
255264
// collect aliases from context
256265
Map<String, AliasDTO> aliases = new HashMap<>();

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public Predicate getSimplifiedPredicate() {
3333
return new Predicate(getExpression());
3434
}
3535

36+
@Override
3637
public Predicate getOrigin() {
3738
return origin;
3839
}

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import liquidjava.processor.VCImplication;
44

5-
import static liquidjava.rj_language.opt.VCSimplificationUtils.*;
6-
75
/**
86
* Simplifies VCImplication chains by applying various simplification steps
97
*/
@@ -20,7 +18,7 @@ public static VCImplication simplify(VCImplication implication) {
2018
VCImplication current = implication.clone();
2119
while (true) {
2220
VCImplication simplified = simplifyOnce(current);
23-
if (sameVc(current, simplified)) // fixed point reached
21+
if (current.equals(simplified)) // fixed point reached
2422
return simplified;
2523
current = simplified;
2624
}
@@ -35,7 +33,7 @@ public static VCImplication simplifyOnce(VCImplication implication) {
3533

3634
// first try to apply substitution, then folding
3735
VCImplication substituted = VCSubstitution.applyOnce(implication);
38-
if (!sameVc(implication, substituted))
36+
if (!implication.equals(substituted))
3937
return substituted;
4038

4139
// TODO: add more simplification steps here (e.g., folding)

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

Lines changed: 0 additions & 37 deletions
This file was deleted.

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
import liquidjava.rj_language.ast.Expression;
1313
import liquidjava.rj_language.ast.Var;
1414

15-
import static liquidjava.rj_language.opt.VCSimplificationUtils.*;
16-
1715
/**
1816
* Simplifies VCImplication chains by replacing binder equalities with their known values
1917
*/
@@ -55,7 +53,7 @@ private static VCImplication substitute(VCImplication implication, VCImplication
5553
return substitute(implication.getNext(), source, value);
5654

5755
Predicate refinement = substituteRefinement(implication.getRefinement(), source, value);
58-
VCImplication result = VCSimplificationUtils.copyWithRefinement(implication, refinement);
56+
VCImplication result = new VCImplication(implication, refinement);
5957
result.setNext(substitute(implication.getNext(), source, value));
6058
return result;
6159
}
@@ -64,11 +62,11 @@ private static VCImplication substitute(VCImplication implication, VCImplication
6462
* Substitutes a source binder inside one predicate while preserving simplification metadata
6563
*/
6664
private static Predicate substituteRefinement(Predicate refinement, VCImplication source, Expression value) {
67-
Expression active = activeExpression(refinement);
65+
Expression active = refinement.getExpression().clone();
6866
Binder binder = new Binder(source.getName(), source.getType());
6967
Expression substituted = active.substitute(new Var(binder.getName()), value.clone());
7068

71-
return new SimplifiedPredicate(new Predicate(substituted), VCSimplificationUtils.originPredicate(refinement),
69+
return new SimplifiedPredicate(new Predicate(substituted), refinement.getOrigin().clone(),
7270
bindersAfterSubstitution(refinement, active, binder));
7371
}
7472

@@ -105,7 +103,7 @@ private static Optional<Substitution> getSubstitution(VCImplication implication)
105103
if (!implication.hasBinder())
106104
return Optional.empty();
107105

108-
Expression refinement = activeExpression(implication.getRefinement());
106+
Expression refinement = implication.getRefinement().getExpression().clone();
109107
if (!(refinement instanceof BinaryExpression binary) || !"==".equals(binary.getOperator()))
110108
return Optional.empty();
111109

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

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

3-
import static liquidjava.rj_language.opt.VCSimplificationUtils.*;
43
import static liquidjava.rj_language.opt.VCSubstitution.containsVariable;
54
import static liquidjava.rj_language.opt.VCSubstitution.isVar;
65
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -30,7 +29,7 @@ public void eachSimplificationStepPreservesVcSemantics(@From(VCImplicationGenera
3029

3130
for (int step = 0; step < VCImplicationGenerator.BINDERS.length; step++) {
3231
VCImplication simplified = VCSimplification.simplify(current);
33-
if (sameVc(current, simplified))
32+
if (current.equals(simplified))
3433
break;
3534

3635
assertEquivalent(current, simplified, step);
@@ -61,7 +60,7 @@ private static void assertEquivalent(VCImplication unsimplified, VCImplication s
6160
}
6261

6362
private static Expression vcFormula(VCImplication implication) {
64-
Expression refinement = activeExpression(implication.getRefinement()).clone();
63+
Expression refinement = implication.getRefinement().getExpression().clone();
6564
if (!implication.hasNext())
6665
return refinement;
6766
return new BinaryExpression(refinement, "-->", vcFormula(implication.getNext()));
@@ -80,7 +79,7 @@ private static boolean isSubstitution(VCImplication implication) {
8079
if (!implication.hasBinder())
8180
return false;
8281

83-
Expression refinement = activeExpression(implication.getRefinement());
82+
Expression refinement = implication.getRefinement().getExpression().clone();
8483
if (!(refinement instanceof BinaryExpression binary) || !"==".equals(binary.getOperator()))
8584
return false;
8685

0 commit comments

Comments
 (0)