@@ -54,16 +54,17 @@ private static void resolveRecursive(Expression exp, Map<String, Expression> map
5454 map .put (var .getName (), left .clone ());
5555 } else if (left instanceof Var leftVar && right instanceof Var rightVar ) {
5656 // to substitute internal variable with user-facing variable
57- if (leftVar . isInternal () && !rightVar . isInternal ()) {
57+ if (isInternal (leftVar ) && !isInternal (rightVar ) && ! isReturnVar ( leftVar )) {
5858 map .put (leftVar .getName (), right .clone ());
59- } else if (rightVar . isInternal () && !leftVar . isInternal ()) {
59+ } else if (isInternal (rightVar ) && !isInternal (leftVar ) && ! isReturnVar ( rightVar )) {
6060 map .put (rightVar .getName (), left .clone ());
61- } else if (leftVar . isInternal () && rightVar . isInternal ()) {
61+ } else if (isInternal (leftVar ) && isInternal (rightVar )) {
6262 // to substitute the lower-counter variable with the higher-counter one
63- boolean isLeftCounterLower = leftVar . getCounter () <= rightVar . getCounter ();
63+ boolean isLeftCounterLower = getCounter (leftVar ) <= getCounter (rightVar );
6464 Var lowerVar = isLeftCounterLower ? leftVar : rightVar ;
6565 Var higherVar = isLeftCounterLower ? rightVar : leftVar ;
66- map .putIfAbsent (lowerVar .getName (), higherVar .clone ());
66+ if (!isReturnVar (lowerVar ) && !isFreshVar (higherVar ))
67+ map .putIfAbsent (lowerVar .getName (), higherVar .clone ());
6768 }
6869 }
6970 }
@@ -144,4 +145,23 @@ private static boolean hasUsage(Expression exp, String name) {
144145 // usage not found
145146 return false ;
146147 }
148+
149+ private static int getCounter (Var var ) {
150+ if (!isInternal (var ))
151+ throw new IllegalStateException ("Cannot get counter of non-internal variable" );
152+ int lastUnderscore = var .getName ().lastIndexOf ('_' );
153+ return Integer .parseInt (var .getName ().substring (lastUnderscore + 1 ));
154+ }
155+
156+ private static boolean isInternal (Var var ) {
157+ return var .getName ().startsWith ("#" );
158+ }
159+
160+ private static boolean isReturnVar (Var var ) {
161+ return var .getName ().startsWith ("#ret_" );
162+ }
163+
164+ private static boolean isFreshVar (Var var ) {
165+ return var .getName ().startsWith ("#fresh_" );
166+ }
147167}
0 commit comments