@@ -180,13 +180,13 @@ private static ObjectState getStates(CtAnnotation<? extends Annotation> ctAnnota
180180
181181 // has from
182182 if (from != null ) {
183- state .setFrom (createStatePredicate (from , f .getTargetClass (), tc , e , false , prefix ));
183+ state .setFrom (createStatePredicate (new Predicate ( from , e , prefix ), from , f .getTargetClass (), tc , e , false ));
184184 state .setFromPosition (Utils .getLJAnnotationPosition (e , from ));
185185 }
186186
187187 // has to
188188 if (to != null ) {
189- state .setTo (createStatePredicate (to , f .getTargetClass (), tc , e , true , prefix ));
189+ state .setTo (createStatePredicate (new Predicate ( to , e , prefix ), to , f .getTargetClass (), tc , e , true ));
190190 state .setToPosition (Utils .getLJAnnotationPosition (e , to ));
191191 }
192192
@@ -209,10 +209,9 @@ private static ObjectState getStates(CtAnnotation<? extends Annotation> ctAnnota
209209 *
210210 * @return the created predicate
211211 */
212- private static Predicate createStatePredicate (String value , String targetClass , TypeChecker tc , CtElement e ,
213- boolean isTo , String prefix ) throws LJError {
212+ private static Predicate createStatePredicate (Predicate p , String value , String targetClass , TypeChecker tc ,
213+ CtElement e , boolean isTo ) throws LJError {
214214 SourcePosition position = Utils .getLJAnnotationPosition (e , value );
215- Predicate p = new Predicate (value , e , prefix );
216215 if (!p .getExpression ().isBooleanExpression ()) {
217216 throw new InvalidRefinementError (position , "State refinement transition must be a boolean expression" ,
218217 value );
@@ -392,7 +391,7 @@ public static void checkTargetChanges(TypeChecker tc, RefinedFunction f, CtExpre
392391 */
393392 public static void updateGhostField (CtFieldWrite <?> fw , TypeChecker tc ) throws LJError {
394393 CtField <?> field = fw .getVariable ().getDeclaration ();
395- String updatedVarName = String . format ( Formats . THIS , fw .getVariable (). getSimpleName ());
394+ String updatedVarName = Utils . qualifyFieldName ( fw .getVariable ());
396395 String targetClass = field .getDeclaringType ().getQualifiedName ();
397396
398397 // state transition annotation construction
@@ -421,8 +420,12 @@ public static void updateGhostField(CtFieldWrite<?> fw, TypeChecker tc) throws L
421420
422421 ObjectState stateChange = new ObjectState ();
423422 String prefix = field .getDeclaringType ().getQualifiedName ();
424- Predicate fromPredicate = createStatePredicate (stateChangeRefinementFrom , targetClass , tc , fw , false , prefix );
425- Predicate toPredicate = createStatePredicate (stateChangeRefinementTo , targetClass , tc , fw , true , prefix );
423+ Predicate fromPredicate = createStatePredicate (new Predicate (), stateChangeRefinementFrom , targetClass , tc , fw ,
424+ false );
425+ Predicate toPredicate = Predicate .createEquals (Predicate
426+ .createInvocation (Utils .qualifyName (prefix , field .getSimpleName ()), Predicate .createVar (Keys .THIS )),
427+ Predicate .createVar (updatedVarName ));
428+ toPredicate = createStatePredicate (toPredicate , stateChangeRefinementTo , targetClass , tc , fw , true );
426429 stateChange .setFrom (fromPredicate );
427430 stateChange .setTo (toPredicate );
428431
@@ -604,7 +607,7 @@ public static String prepareInvocationTarget(TypeChecker tc, CtElement target2,
604607 // means invocation is in a form of `t.method(args)`
605608 String name = v .getVariable ().getSimpleName ();
606609 if (target2 instanceof CtFieldRead <?> fieldRead && fieldRead .getTarget () instanceof CtThisAccess <?>) {
607- String fieldName = String . format ( Formats . THIS , name );
610+ String fieldName = Utils . qualifyFieldName ( fieldRead . getVariable () );
608611 if (tc .getContext ().hasVariable (fieldName ))
609612 name = fieldName ;
610613 }
0 commit comments