public static Cons walkADeclaration(Symbol variable, Stella_Object typetree, Stella_Object value, boolean inputparameterP) {
    { StandardObject sourcetype = null;
      StandardObject targettype = Stella_Object.safeYieldTypeSpecifier(typetree);
      Surrogate methodownertype = ((((MethodSlot)(Stella.$METHODBEINGWALKED$.get())) != null) ? ((MethodSlot)(Stella.$METHODBEINGWALKED$.get())).slotOwner : ((Surrogate)(null)));
      Stella_Object ovalue = null;

      if ((targettype != null) &&
          ((methodownertype != null) &&
           (!StandardObject.voidP(methodownertype)))) {
        targettype = StandardObject.computeRelativeTypeSpec(targettype, methodownertype);
      }
      if (!(inputparameterP)) {
        Symbol.pushVariableBinding(variable, Stella.SGT_STELLA_UNINITIALIZED);
        { Object [] caller_MV_returnarray = new Object[1];

          ovalue = Stella_Object.walkExpressionTree(value, targettype, Stella.SYM_STELLA_VARIABLE_DECLARATION, true, caller_MV_returnarray);
          sourcetype = ((StandardObject)(caller_MV_returnarray[0]));
        }
        if (targettype == null) {
          targettype = sourcetype;
        }
        Stella.popVariableBinding();
      }
      Symbol.pushVariableBinding(variable, targettype);
      if (inputparameterP) {
        return (Cons.cons(variable, Cons.cons(targettype, Stella.NIL)));
      }
      else {
        return (Cons.cons(Symbol.trueVariableName(variable), Cons.cons(targettype, Cons.cons(ovalue, Stella.NIL))));
      }
    }
  }