protected void outputDelegatingForCase(
      NodeType t,
      TabPrintWriter writer,
      NodeType root,
      String retType,
      String suff,
      String defaultMethod) {
    outputForCaseHeader(t, writer, retType, suff);
    writer.indent();

    if (!retType.equals("void")) {
      writer.startLine("return ");
    } else {
      writer.startLine();
    }

    Option<NodeType> sup = ast.parent(t);
    if (sup.isSome() && !t.equals(root)) {
      writer.print(visitorMethodName(sup.unwrap()) + suff + "(that);");
    } else {
      writer.print(defaultMethod + "(that);");
    }
    writer.unindent();
    writer.startLine("}");
    writer.println();
  }
 protected void outputAbstractVisitorCases(NodeType root, TabPrintWriter writer, String retType) {
   // Write out case methods for each concrete class
   for (NodeType t : ast.descendents(root)) {
     if (!t.isAbstract()) {
       writer.println();
       writer.startLine("/** Process an instance of " + t.name() + ". */");
       writer.startLine(
           "public abstract " + retType + " " + visitorMethodName(t) + "(" + t.name() + " that);");
     }
   }
 }