Skip to content

Commit 835497a

Browse files
committed
repairing some weird self variable treatment in SpecStatement
1 parent 382f4ce commit 835497a

2 files changed

Lines changed: 32 additions & 5 deletions

File tree

key.core/src/main/java/de/uka/ilkd/key/macros/ApplyScriptsMacro.java

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
import de.uka.ilkd.key.java.Services;
1414
import de.uka.ilkd.key.java.SourceElement;
1515
import de.uka.ilkd.key.java.statement.JmlAssert;
16+
import de.uka.ilkd.key.java.statement.MethodFrame;
1617
import de.uka.ilkd.key.logic.DefaultVisitor;
1718
import de.uka.ilkd.key.logic.JTerm;
19+
import de.uka.ilkd.key.logic.JavaBlock;
1820
import de.uka.ilkd.key.logic.op.JFunction;
1921
import de.uka.ilkd.key.logic.op.LocationVariable;
2022
import de.uka.ilkd.key.logic.op.UpdateApplication;
@@ -33,8 +35,9 @@
3335
import de.uka.ilkd.key.speclang.njml.JmlParser.ProofCmdCaseContext;
3436
import de.uka.ilkd.key.speclang.njml.JmlParser.ProofCmdContext;
3537

38+
import de.uka.ilkd.key.util.MiscTools;
3639
import org.key_project.logic.Term;
37-
import org.key_project.logic.op.SortedOperator;
40+
import org.key_project.logic.op.Modality;
3841
import org.key_project.prover.engine.ProverTaskListener;
3942
import org.key_project.prover.engine.TaskStartedInfo;
4043
import org.key_project.prover.rules.RuleApp;
@@ -126,6 +129,16 @@ private static JmlAssert getJmlAssert(Node node) {
126129
return null;
127130
}
128131

132+
private static JavaBlock getJavaBlock(Goal goal) {
133+
RuleApp ruleApp = goal.node().parent().getAppliedRuleApp();
134+
JTerm appliedOn = (JTerm) ruleApp.posInOccurrence().subTerm();
135+
if (appliedOn.op() instanceof UpdateApplication) {
136+
appliedOn = UpdateApplication.getTarget(appliedOn);
137+
}
138+
assert appliedOn.op() instanceof Modality;
139+
return appliedOn.javaBlock();
140+
}
141+
129142
@Override
130143
public ProofMacroFinishedInfo applyTo(UserInterfaceControl uic, Proof proof,
131144
ImmutableList<Goal> goals, PosInOccurrence posInOcc, ProverTaskListener listener)
@@ -146,7 +159,7 @@ public ProofMacroFinishedInfo applyTo(UserInterfaceControl uic, Proof proof,
146159
"Running attached script from goal " + goal.node().serialNr(), 0));
147160

148161
KeyAst.JMLProofScript proofScript = jmlAssert.getAssertionProof();
149-
Map<ParserRuleContext, JTerm> termMap = getTermMap(jmlAssert, proof.getServices());
162+
Map<ParserRuleContext, JTerm> termMap = getTermMap(jmlAssert, getJavaBlock(goal), proof.getServices());
150163
// We heavily rely on that variables have been computed before, otherwise this will raise an NPE.
151164
Map<LocationVariable, JFunction> obtainMap = makeObtainVarMap(jmlAssert.collectVariablesInProof(null));
152165
JTerm update = getUpdate(goal);
@@ -180,14 +193,17 @@ public ProofMacroFinishedInfo applyTo(UserInterfaceControl uic, Proof proof,
180193
}
181194

182195

183-
private Map<ParserRuleContext, JTerm> getTermMap(JmlAssert jmlAssert, Services services) {
196+
private Map<ParserRuleContext, JTerm> getTermMap(JmlAssert jmlAssert, JavaBlock javaBlock, Services services) {
184197
SpecificationRepository.@Nullable JmlStatementSpec jmlspec =
185198
services.getSpecificationRepository().getStatementSpec(jmlAssert);
186199
if (jmlspec == null) {
187200
throw new IllegalStateException(
188201
"No specification found for JML assert statement at " + jmlAssert);
189202
}
190-
ImmutableList<JTerm> terms = jmlspec.terms().tail();
203+
ImmutableList<JTerm> terms = ImmutableList.of();
204+
for (int i = jmlspec.terms().size() - 1; i >= 1; i--) {
205+
terms = terms.prepend(correctSelfVar(i, javaBlock, jmlspec, services));
206+
}
191207
ImmutableList<JmlParser.ExpressionContext> jmlExprs = jmlAssert.collectTerms().tail();
192208
Map<ParserRuleContext, JTerm> result = new IdentityHashMap<>();
193209
assert terms.size() == jmlExprs.size();
@@ -197,6 +213,17 @@ private Map<ParserRuleContext, JTerm> getTermMap(JmlAssert jmlAssert, Services s
197213
return result;
198214
}
199215

216+
/**
217+
* For some reason, the self variable in the spec is not the same as the self variable and needs to
218+
* be corrected.
219+
*/
220+
private JTerm correctSelfVar(int index, JavaBlock javaBlock, SpecificationRepository.JmlStatementSpec spec, Services services) {
221+
final MethodFrame frame = JavaTools.getInnermostMethodFrame(javaBlock, services);
222+
final JTerm self = MiscTools.getSelfTerm(frame, services);
223+
return spec.getTerm(services, self, index);
224+
225+
}
226+
200227
private Map<LocationVariable, JFunction> makeObtainVarMap(ImmutableList<LocationVariable> locationVariables) {
201228
HashMap<LocationVariable, JFunction> result = new HashMap<>();
202229
for (LocationVariable lv : locationVariables) {

key.core/src/test/resources/de/uka/ilkd/key/scripts/jml/ObtainFromGoal.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
class Test {
44

5-
//@ static model int f(int arg);
5+
//@ model int f(int arg);
66

77
//@ ensures true;
88
void test() {

0 commit comments

Comments
 (0)