public static Cons clTranslateArefTree(Cons tree) {
    { Symbol operator = null;
      Surrogate owner = null;
      Cons arguments = null;

      { Object [] caller_MV_returnarray = new Object[2];

        operator = Cons.destructureCallTree(tree, caller_MV_returnarray);
        owner = ((Surrogate)(caller_MV_returnarray[0]));
        arguments = ((Cons)(caller_MV_returnarray[1]));
      }
      if (owner == Stella.SGT_STELLA_ARRAY) {
        { boolean setterP = operator == Stella.SYM_STELLA_AREF_SETTER;
          Stella_Object array = arguments.value;
          StandardObject arraytype = Stella_Object.walkedExpressionType(array);
          Cons indices = (setterP ? arguments.rest.rest : arguments.rest);
          Stella_Object value = (setterP ? arguments.rest.value : ((Stella_Object)(null)));

          operator = Stella.internCommonLispSymbol("AREF");
          array = Stella_Object.clTranslateATree(array);
          indices = Cons.clTranslateListOfTrees(indices);
          if (Stella.generateClTypeDeclarationsP()) {
            if (Stella_Object.consP(array)) {
              array = Stella_Object.clYieldTypedExpressionTree(array, arraytype);
            }
            { ConsIterator it = indices.allocateIterator();

              while (it.nextP()) {
                if (Stella_Object.consP(it.value)) {
                  it.valueSetter(Stella_Object.clYieldTypedExpressionTree(it.value, Stella.SGT_STELLA_INTEGER));
                }
              }
            }
          }
          tree = Cons.cons(operator, Cons.cons(array, indices.concatenate(Stella.NIL, Stella.NIL)));
          if (setterP) {
            tree = Cons.list$(Cons.cons(Stella.internCommonLispSymbol("SETF"), Cons.cons(tree, Cons.cons(Cons.cons(Stella_Object.clTranslateATree(value), Stella.NIL), Stella.NIL))));
          }
          return (tree);
        }
      }
      else {
        return (Symbol.clTranslateNormalCallMethodTree(operator, owner, arguments));
      }
    }
  }