Skip to content

Commit 261fc57

Browse files
committed
Save Failing Refinements
1 parent dd62da8 commit 261fc57

File tree

4 files changed

+26
-11
lines changed

4 files changed

+26
-11
lines changed

liquidjava-verifier/src/main/java/liquidjava/processor/context/RefinedVariable.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public abstract class RefinedVariable extends Refined {
1414
private PlacementInCode placementInCode;
1515
private boolean isParameter;
1616
private SourcePosition annPosition;
17+
private Predicate failingRefinement;
1718

1819
public RefinedVariable(String name, CtTypeReference<?> type, Predicate c) {
1920
super(name, type, c);
@@ -88,4 +89,12 @@ public void setIsParameter(boolean b) {
8889
public boolean isParameter() {
8990
return isParameter;
9091
}
92+
93+
public void setFailingRefinement(Predicate failingRefinement) {
94+
this.failingRefinement = failingRefinement;
95+
}
96+
97+
public Predicate getFailingRefinement() {
98+
return failingRefinement;
99+
}
91100
}

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -305,17 +305,23 @@ public void checkVariableRefinements(Predicate refinementFound, String simpleNam
305305
rv.addSuperType(t);
306306
context.addRefinementInstanceToVariable(simpleName, newName);
307307
String customMessage = getMessageFromAnnotation(variable).orElse(mainRV != null ? mainRV.getMessage() : null);
308-
checkSMT(cEt, usage, customMessage); // TODO CHANGE
308+
checkSMT(cEt, usage, customMessage, mainRV); // TODO CHANGE
309309
context.addRefinementToVariableInContext(simpleName, type, cet, usage);
310310
}
311311

312-
public void checkSMT(Predicate expectedType, CtElement element) throws LJError {
313-
checkSMT(expectedType, element, null);
312+
public void checkSMT(Predicate expectedType, CtElement element, RefinedVariable rv) throws LJError {
313+
checkSMT(expectedType, element, null, rv);
314314
}
315315

316-
public void checkSMT(Predicate expectedType, CtElement element, String customMessage) throws LJError {
317-
vcChecker.processSubtyping(expectedType, context.getGhostStates(), element, factory, customMessage);
318-
element.putMetadata(Keys.REFINEMENT, expectedType);
316+
public void checkSMT(Predicate expectedType, CtElement element, String customMessage, RefinedVariable rv)
317+
throws LJError {
318+
try {
319+
vcChecker.processSubtyping(expectedType, context.getGhostStates(), element, factory, customMessage);
320+
element.putMetadata(Keys.REFINEMENT, expectedType);
321+
} catch (RefinementError e) {
322+
rv.setFailingRefinement(expectedType);
323+
throw e;
324+
}
319325
}
320326

321327
public void checkStateSMT(Predicate prevState, Predicate expectedState, CtElement target, String moreInfo)

liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/general_checkers/MethodsFunctionsChecker.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,8 @@ public <R> void getReturnRefinements(CtReturn<R> ret) throws LJError {
200200
Predicate cexpectedType = fi.getRefReturn().substituteVariable(Keys.WILDCARD, returnVarName)
201201
.substituteVariable(Keys.THIS, returnVarName);
202202

203-
rtc.getContext().addVarToContext(returnVarName, method.getType(), cretRef, ret);
204-
rtc.checkSMT(cexpectedType, ret, fi.getMessage());
203+
RefinedVariable rv = rtc.getContext().addVarToContext(returnVarName, method.getType(), cretRef, ret);
204+
rtc.checkSMT(cexpectedType, ret, fi.getMessage(), rv);
205205
rtc.getContext().newRefinementToVariableInContext(returnVarName, cexpectedType);
206206
}
207207
}
@@ -372,7 +372,7 @@ private void checkParameters(CtElement invocation, List<CtExpression<?>> argumen
372372
VariableInstance vi = (VariableInstance) invocation.getMetadata(Keys.TARGET);
373373
c = c.substituteVariable(Keys.THIS, vi.getName());
374374
}
375-
rtc.checkSMT(c, invocation, fArg.getMessage());
375+
rtc.checkSMT(c, invocation, fArg.getMessage(), fArg);
376376
}
377377
}
378378

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ public static void updateGhostField(CtFieldWrite<?> fw, TypeChecker tc) throws L
440440
// is a subtype of the variable's main refinement
441441
if (rv instanceof Variable) {
442442
Predicate superC = rv.getMainRefinement().substituteVariable(rv.getName(), vi2.getName());
443-
tc.checkSMT(superC, fw);
443+
tc.checkSMT(superC, fw, rv);
444444
tc.getContext().addRefinementInstanceToVariable(parentTargetName, newInstanceName);
445445
}
446446
}
@@ -558,7 +558,7 @@ private static void addInstanceWithState(TypeChecker tc, String superName, Strin
558558
// is a subtype of the variable's main refinement
559559
if (rv instanceof Variable) {
560560
Predicate superC = rv.getMainRefinement().substituteVariable(rv.getName(), vi2.getName());
561-
tc.checkSMT(superC, invocation);
561+
tc.checkSMT(superC, invocation, rv);
562562
tc.getContext().addRefinementInstanceToVariable(superName, name2);
563563
}
564564
}

0 commit comments

Comments
 (0)