1313import de .uka .ilkd .key .java .Services ;
1414import de .uka .ilkd .key .java .SourceElement ;
1515import de .uka .ilkd .key .java .statement .JmlAssert ;
16+ import de .uka .ilkd .key .java .statement .MethodFrame ;
1617import de .uka .ilkd .key .logic .DefaultVisitor ;
1718import de .uka .ilkd .key .logic .JTerm ;
19+ import de .uka .ilkd .key .logic .JavaBlock ;
1820import de .uka .ilkd .key .logic .op .JFunction ;
1921import de .uka .ilkd .key .logic .op .LocationVariable ;
2022import de .uka .ilkd .key .logic .op .UpdateApplication ;
3335import de .uka .ilkd .key .speclang .njml .JmlParser .ProofCmdCaseContext ;
3436import de .uka .ilkd .key .speclang .njml .JmlParser .ProofCmdContext ;
3537
38+ import de .uka .ilkd .key .util .MiscTools ;
3639import org .key_project .logic .Term ;
37- import org .key_project .logic .op .SortedOperator ;
40+ import org .key_project .logic .op .Modality ;
3841import org .key_project .prover .engine .ProverTaskListener ;
3942import org .key_project .prover .engine .TaskStartedInfo ;
4043import 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 ) {
0 commit comments