Skip to content

Commit 2a5e4b0

Browse files
changes to enable debugging and fixing of constructor issue
1 parent 076d0a7 commit 2a5e4b0

File tree

3 files changed

+81
-5
lines changed

3 files changed

+81
-5
lines changed

liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/VCChecker.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public boolean canProcessSubtyping(Predicate type, Predicate expectedType, List<
100100
return smtChecks(premises, et, p);
101101
}
102102

103-
private /* Predicate */ VCImplication joinPredicates(Predicate expectedType, List<RefinedVariable> mainVars,
103+
private VCImplication joinPredicates(Predicate expectedType, List<RefinedVariable> mainVars,
104104
List<RefinedVariable> vars, HashMap<String, PlacementInCode> map) {
105105

106106
VCImplication firstSi = null;
@@ -135,7 +135,7 @@ public boolean canProcessSubtyping(Predicate type, Predicate expectedType, List<
135135
if (firstSi != null && lastSi != null) {
136136
cSMT = firstSi.clone();
137137
lastSi.setNext(new VCImplication(expectedType));
138-
// printVCs(firstSi.toString(), cSMT.toConjunctions().toString(), expectedType);
138+
printVCs(firstSi.toString(), cSMT.toConjunctions().toString(), expectedType);
139139
}
140140

141141
return cSMT; // firstSi != null ? firstSi : new VCImplication(new Predicate());

liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/object_checkers/AuxStateHandler.java

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import java.lang.annotation.Annotation;
44
import java.util.*;
55
import java.util.stream.Collectors;
6+
7+
import liquidjava.errors.ErrorEmitter;
68
import liquidjava.errors.ErrorHandler;
79
import liquidjava.processor.context.*;
810
import liquidjava.processor.refinement_checker.TypeChecker;
@@ -40,19 +42,45 @@ public static void handleConstructorState(CtConstructor<?> c, RefinedFunction f,
4042
return;
4143
}
4244
}
43-
setFunctionStates(f, an, tc, c); // f.setState(an, context.getGhosts(), c);
45+
setConstructorStates(f, an, tc, c); // f.setState(an, context.getGhosts(), c);
4446
} else {
4547
setDefaultState(f, tc);
4648
}
4749
}
4850

51+
52+
/**
53+
* Creates the list of states and adds them to the function
54+
*
55+
* @param f
56+
* @param anns
57+
* @param tc
58+
* @param element
59+
*
60+
* @throws ParsingException
61+
*/
62+
@SuppressWarnings({ "rawtypes" })
63+
private static void setConstructorStates(RefinedFunction f, List<CtAnnotation<? extends Annotation>> anns,
64+
TypeChecker tc, CtElement element) throws ParsingException {
65+
List<ObjectState> l = new ArrayList<>();
66+
for (CtAnnotation<? extends Annotation> an : anns) {
67+
Map<String, CtExpression> m = an.getAllValues();
68+
String to = TypeCheckingUtils.getStringFromAnnotation(m.get("to"));
69+
ObjectState state = new ObjectState();
70+
if (to != null)
71+
state.setTo(new Predicate(to, element, tc.getErrorEmitter()));
72+
l.add(state);
73+
}
74+
f.setAllStates(l);
75+
}
76+
4977
public static void setDefaultState(RefinedFunction f, TypeChecker tc) {
5078
String[] path = f.getTargetClass().split("\\.");
5179
String klass = path[path.length - 1];
5280

5381
Predicate[] s = { Predicate.createVar(tc.THIS) };
5482
Predicate c = new Predicate();
55-
List<GhostFunction> sets = getDifferentSets(tc, klass);
83+
List<GhostFunction> sets = getDifferentSets(tc, klass);//??
5684
for (GhostFunction sg : sets) {
5785
if (sg.getReturnType().toString().equals("int")) {
5886
Predicate p = Predicate.createEquals(Predicate.createInvocation(sg.getName(), s),
@@ -151,6 +179,10 @@ private static ObjectState getStates(CtAnnotation<? extends Annotation> ctAnnota
151179
return state;
152180
}
153181

182+
183+
184+
185+
154186
private static Predicate createStatePredicate(String value, /* RefinedFunction f */
155187
String targetClass, TypeChecker tc, CtElement e, boolean isTo) throws ParsingException {
156188
Predicate p = new Predicate(value, e, tc.getErrorEmitter());
@@ -416,7 +448,7 @@ private static Predicate changeState(TypeChecker tc, VariableInstance vi,
416448
for (String s : map.keySet()) {
417449
transitionedState = transitionedState.substituteVariable(s, map.get(s));
418450
}
419-
transitionedState = checkOldMentions(transitionedState, instanceName, newInstanceName, tc);
451+
transitionedState = checkOldMentions(transitionedState, instanceName, newInstanceName, tc);
420452
// update of stata of new instance of this#n#(whatever it was + 1)
421453
addInstanceWithState(tc, name, newInstanceName, vi, transitionedState, invocation);
422454
return transitionedState;
@@ -434,6 +466,24 @@ private static Predicate changeState(TypeChecker tc, VariableInstance vi,
434466
return new Predicate();
435467
}
436468

469+
470+
/**
471+
* Method prepared to change all old vars in a predicate, however it has not been needed yet
472+
* @param pred
473+
* @param tc
474+
* @return
475+
*/
476+
private static Predicate changeVarsFields(Predicate pred, TypeChecker tc) {
477+
Predicate noOld = pred;
478+
List<String> listVarsInOld = pred.getOldVariableNames();
479+
for (String varInOld : listVarsInOld){
480+
Optional<VariableInstance> ovi = tc.getContext().getLastVariableInstance(varInOld);
481+
if(ovi.isPresent())
482+
noOld = noOld.changeOldMentions(varInOld, ovi.get().getName(), tc.getErrorEmitter());
483+
}
484+
return noOld;
485+
}
486+
437487
private static Predicate checkOldMentions(Predicate transitionedState, String instanceName, String newInstanceName,
438488
TypeChecker tc) {
439489
return transitionedState.changeOldMentions(instanceName, newInstanceName, tc.getErrorEmitter());

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,32 @@ public Predicate changeOldMentions(String previousName, String newName, ErrorEmi
137137
return new Predicate(e);
138138
}
139139

140+
141+
public List<String> getOldVariableNames(){
142+
List<String> ls = new ArrayList<>();
143+
expressionGetOldVariableNames(this.exp, ls);
144+
return ls;
145+
}
146+
147+
private void expressionGetOldVariableNames(Expression exp, List<String> ls){
148+
if(exp instanceof FunctionInvocation){
149+
FunctionInvocation fi = (FunctionInvocation) exp;
150+
if (fi.getName().equals(Utils.OLD)){
151+
List<Expression> le = fi.getArgs();
152+
for(Expression e: le){
153+
if (e instanceof Var)
154+
ls.add(((Var) e).getName());
155+
}
156+
}
157+
}
158+
if(exp.hasChildren()){
159+
for (var ch : exp.getChildren())
160+
expressionGetOldVariableNames(ch, ls);
161+
162+
}
163+
}
164+
165+
140166
public Predicate changeStatesToRefinements(List<GhostState> ghostState, String[] toChange, ErrorEmitter ee) {
141167
Map<String, Expression> nameRefinementMap = new HashMap<>();
142168
for (GhostState gs : ghostState)

0 commit comments

Comments
 (0)