33import java .lang .annotation .Annotation ;
44import java .util .*;
55import java .util .stream .Collectors ;
6+
7+ import liquidjava .errors .ErrorEmitter ;
68import liquidjava .errors .ErrorHandler ;
79import liquidjava .processor .context .*;
810import liquidjava .processor .refinement_checker .TypeChecker ;
@@ -40,19 +42,45 @@ public static void handleConstructorState(CtConstructor<?> c, RefinedFunction f,
4042 return ;
4143 }
4244 }
43- setFunctionStates (f , an , tc , c ); // f.setState(an, context.getGhosts(), c);
45+ setConstructorStates (f , an , tc , c ); // f.setState(an, context.getGhosts(), c);
4446 } else {
4547 setDefaultState (f , tc );
4648 }
4749 }
4850
51+
52+ /**
53+ * Creates the list of states and adds them to the function
54+ *
55+ * @param f
56+ * @param anns
57+ * @param tc
58+ * @param element
59+ *
60+ * @throws ParsingException
61+ */
62+ @ SuppressWarnings ({ "rawtypes" })
63+ private static void setConstructorStates (RefinedFunction f , List <CtAnnotation <? extends Annotation >> anns ,
64+ TypeChecker tc , CtElement element ) throws ParsingException {
65+ List <ObjectState > l = new ArrayList <>();
66+ for (CtAnnotation <? extends Annotation > an : anns ) {
67+ Map <String , CtExpression > m = an .getAllValues ();
68+ String to = TypeCheckingUtils .getStringFromAnnotation (m .get ("to" ));
69+ ObjectState state = new ObjectState ();
70+ if (to != null )
71+ state .setTo (new Predicate (to , element , tc .getErrorEmitter ()));
72+ l .add (state );
73+ }
74+ f .setAllStates (l );
75+ }
76+
4977 public static void setDefaultState (RefinedFunction f , TypeChecker tc ) {
5078 String [] path = f .getTargetClass ().split ("\\ ." );
5179 String klass = path [path .length - 1 ];
5280
5381 Predicate [] s = { Predicate .createVar (tc .THIS ) };
5482 Predicate c = new Predicate ();
55- List <GhostFunction > sets = getDifferentSets (tc , klass );
83+ List <GhostFunction > sets = getDifferentSets (tc , klass );//??
5684 for (GhostFunction sg : sets ) {
5785 if (sg .getReturnType ().toString ().equals ("int" )) {
5886 Predicate p = Predicate .createEquals (Predicate .createInvocation (sg .getName (), s ),
@@ -151,6 +179,10 @@ private static ObjectState getStates(CtAnnotation<? extends Annotation> ctAnnota
151179 return state ;
152180 }
153181
182+
183+
184+
185+
154186 private static Predicate createStatePredicate (String value , /* RefinedFunction f */
155187 String targetClass , TypeChecker tc , CtElement e , boolean isTo ) throws ParsingException {
156188 Predicate p = new Predicate (value , e , tc .getErrorEmitter ());
@@ -416,7 +448,7 @@ private static Predicate changeState(TypeChecker tc, VariableInstance vi,
416448 for (String s : map .keySet ()) {
417449 transitionedState = transitionedState .substituteVariable (s , map .get (s ));
418450 }
419- transitionedState = checkOldMentions (transitionedState , instanceName , newInstanceName , tc );
451+ transitionedState = checkOldMentions (transitionedState , instanceName , newInstanceName , tc );
420452 // update of stata of new instance of this#n#(whatever it was + 1)
421453 addInstanceWithState (tc , name , newInstanceName , vi , transitionedState , invocation );
422454 return transitionedState ;
@@ -434,6 +466,24 @@ private static Predicate changeState(TypeChecker tc, VariableInstance vi,
434466 return new Predicate ();
435467 }
436468
469+
470+ /**
471+ * Method prepared to change all old vars in a predicate, however it has not been needed yet
472+ * @param pred
473+ * @param tc
474+ * @return
475+ */
476+ private static Predicate changeVarsFields (Predicate pred , TypeChecker tc ) {
477+ Predicate noOld = pred ;
478+ List <String > listVarsInOld = pred .getOldVariableNames ();
479+ for (String varInOld : listVarsInOld ){
480+ Optional <VariableInstance > ovi = tc .getContext ().getLastVariableInstance (varInOld );
481+ if (ovi .isPresent ())
482+ noOld = noOld .changeOldMentions (varInOld , ovi .get ().getName (), tc .getErrorEmitter ());
483+ }
484+ return noOld ;
485+ }
486+
437487 private static Predicate checkOldMentions (Predicate transitionedState , String instanceName , String newInstanceName ,
438488 TypeChecker tc ) {
439489 return transitionedState .changeOldMentions (instanceName , newInstanceName , tc .getErrorEmitter ());
0 commit comments