/**
  * Returns type converted to index type if needed. A index type variable in java splitter file has
  * type "int" or "int[]" instead of "long" or "long[]". This is needed if the variable or the an
  * element of the variable is used as an index to an array. This method converts the type of the
  * variable to "int_index" or "index[]" if it is used as an index to an array or an element of it
  * is used as an index to an array.
  *
  * @param type the original type of the variable.
  * @param name the name of the variable.
  * @param varInfo the VarInfo of the variable.
  * @param condition the condition in which the variable occurs.
  * @return the type converted to index type if needed.
  */
 private static String makeIndexIfNeeded(
     String type, String name, VarInfo varInfo, String condition) throws ParseException {
   if ((type.equals("int") || varInfo.type.isArray())
       && varInfo.file_rep_type != ProglangType.HASHCODE) {
     int LPAREN = 74;
     int RPAREN = 75;
     int LBRACKET = 78;
     int RBRACKET = 79;
     Stack<Boolean> inArrayIndex = new Stack<Boolean>();
     inArrayIndex.push(Boolean.FALSE);
     NodeToken[] tokens = TokenExtractor.extractTokens(condition);
     for (int i = 0; i < tokens.length; i++) {
       if (tokens[i].kind == LBRACKET) {
         inArrayIndex.push(Boolean.TRUE);
       } else if (tokens[i].kind == RBRACKET) {
         inArrayIndex.pop();
       } else if (tokens[i].kind == LPAREN) {
         inArrayIndex.push(Boolean.FALSE);
       } else if (tokens[i].kind == RPAREN) {
         inArrayIndex.pop();
       } else if (inArrayIndex.peek().booleanValue() && tokens[i].tokenImage.equals(name)) {
         if (type.equals("int") || type.equals("int_index")) {
           // Note the type can only equal "int_index" if the variable
           // was already visited by this if statement since it appears
           // more than once in the condition.
           type = "int_index";
         } else {
           type = "index[]";
         }
       }
     }
     return type;
   }
   return type;
 }
 /**
  * requires: condition is a string representation of a conditional
  *
  * @return a list of all possible variable variable names in condition. arrays appear with "[]" at
  *     the end if their elements or accessed in the condition.
  */
 private static List<String> findPossibleClassVariables(String condition) throws ParseException {
   NodeToken[] tokens = TokenExtractor.extractTokens(condition);
   // System.out.println("TokenExtractor.extractTokens(" + condition + ") ==> " +
   // ArraysMDE.toString(tokens));
   List<String> variables = new ArrayList<String>();
   if (tokens.length >= 1) {
     if (tokens[0].kind == IDENTIFIER && (tokens.length <= 1 || tokens[1].kind != LPAREN)) {
       variables.add(tokens[0].tokenImage);
     }
   }
   if (tokens.length >= 2) {
     if (tokens[1].kind == IDENTIFIER
         && (tokens.length <= 2 || tokens[2].kind != LPAREN)
         && (!variables.contains(tokens[1].tokenImage))) {
       variables.add(tokens[1].tokenImage);
     }
   }
   for (int i = 2; i < tokens.length - 1; i++) {
     NodeToken token = tokens[i];
     if (token.kind == IDENTIFIER
         && tokens[i - 1].kind != DOT
         && tokens[i + 1].kind != LPAREN
         && (!variables.contains(token.tokenImage))) {
       variables.add(token.tokenImage);
     }
   }
   if (tokens.length >= 3) {
     int lastIndex = tokens.length - 1;
     if (tokens[lastIndex].kind == IDENTIFIER
         && tokens[lastIndex - 1].kind != DOT
         && (!variables.contains(tokens[lastIndex].tokenImage))) {
       variables.add(tokens[lastIndex].tokenImage);
     }
   }
   // System.out.println("findPossibleClassVariables(" + condition + ") ==> " +
   // variables.toString());
   return variables;
 }