@@ -465,14 +465,13 @@ private static void changeState(TypeChecker tc, VariableInstance vi, List<Object
465465 .substituteVariable (name , instanceName );
466466
467467 boolean found = false ;
468- String newInstanceName = String . format ( Formats . INSTANCE , name , tc . getContext (). getCounter ());
468+
469469 for (ObjectState stateChange : stateChanges ) { // TODO: only working for 1 state annotation
470- if (found ) {
470+ if (found )
471471 break ;
472- }
473- if (!stateChange .hasFrom ()) {
472+ if (!stateChange .hasFrom ())
474473 continue ;
475- }
474+
476475 // replace "state(this)" to "state(whatever method is called from) and so on"
477476 Predicate expectState = stateChange .getFrom ().substituteVariable (Keys .THIS , instanceName );
478477 Predicate prevCheck = prevState ;
@@ -483,7 +482,8 @@ private static void changeState(TypeChecker tc, VariableInstance vi, List<Object
483482 expectState = expectState .changeOldMentions (vi .getName (), instanceName );
484483
485484 found = tc .checkStateSMT (prevCheck , expectState , invocation .getPosition ());
486- if (stateChange .hasTo ()) {
485+ if (found && stateChange .hasTo ()) {
486+ String newInstanceName = String .format (Formats .INSTANCE , name , tc .getContext ().getCounter ());
487487 Predicate transitionedState = stateChange .getTo ().substituteVariable (Keys .WILDCARD , newInstanceName )
488488 .substituteVariable (Keys .THIS , newInstanceName );
489489 for (String s : map .keySet ()) {
@@ -498,17 +498,16 @@ private static void changeState(TypeChecker tc, VariableInstance vi, List<Object
498498 Predicate expectedStatesDisjunction = stateChanges .stream ().filter (ObjectState ::hasFrom )
499499 .map (ObjectState ::getFrom )
500500 .reduce (Predicate .createLit ("false" , Types .BOOLEAN ), Predicate ::createDisjunction );
501- expectedStatesDisjunction = expectedStatesDisjunction .substituteVariable (Keys .THIS , newInstanceName );
501+ expectedStatesDisjunction = expectedStatesDisjunction .substituteVariable (Keys .THIS , instanceName );
502502 for (String s : map .keySet ()) {
503503 expectedStatesDisjunction = expectedStatesDisjunction .substituteVariable (s , map .get (s ));
504504 }
505- expectedStatesDisjunction = expectedStatesDisjunction .changeOldMentions (vi .getName (), newInstanceName );
505+ expectedStatesDisjunction = expectedStatesDisjunction .changeOldMentions (vi .getName (), instanceName );
506506
507507 // combine messages of all state changes
508508 String message = stateChanges .stream ().map (ObjectState ::getMessage )
509509 .filter (msg -> msg != null && !msg .isBlank ()).distinct ().collect (Collectors .joining ("\n " ));
510- Predicate foundState = prevState .substituteVariable (instanceName , newInstanceName );
511- tc .throwStateRefinementError (invocation .getPosition (), foundState , expectedStatesDisjunction , message );
510+ tc .throwStateRefinementError (invocation .getPosition (), prevState , expectedStatesDisjunction , message );
512511 }
513512 }
514513
0 commit comments