@Override
  public void visit(EnumDeclaration n, Object arg) {
    printJavadoc(n.getJavaDoc(), arg);
    printMemberAnnotations(n.getAnnotations(), arg);
    printModifiers(n.getModifiers());

    printer.print("enum ");
    printer.print(n.getName());

    if (n.getImplements() != null) {
      printer.print(" implements ");
      for (Iterator<ClassOrInterfaceType> i = n.getImplements().iterator(); i.hasNext(); ) {
        ClassOrInterfaceType c = i.next();
        c.accept(this, arg);
        if (i.hasNext()) {
          printer.print(", ");
        }
      }
    }

    printer.printLn(" {");
    printer.indent();
    if (n.getEntries() != null) {
      printer.printLn();
      for (Iterator<EnumConstantDeclaration> i = n.getEntries().iterator(); i.hasNext(); ) {
        EnumConstantDeclaration e = i.next();
        e.accept(this, arg);
        if (i.hasNext()) {
          printer.print(", ");
        }
      }
    }
    if (n.getMembers() != null) {
      printer.printLn(";");
      printMembers(n.getMembers(), arg);
    } else {
      if (n.getEntries() != null) {
        printer.printLn();
      }
    }
    printer.unindent();
    printer.print("}");
  }
  @Override
  public void visit(EnumConstantDeclaration n, Object arg) {
    printJavadoc(n.getJavaDoc(), arg);
    printMemberAnnotations(n.getAnnotations(), arg);
    printer.print(n.getName());

    if (n.getArgs() != null) {
      printArguments(n.getArgs(), arg);
    }

    if (n.getClassBody() != null) {
      printer.printLn(" {");
      printer.indent();
      printMembers(n.getClassBody(), arg);
      printer.unindent();
      printer.printLn("}");
    }
  }
 @Override
 public Void visit(EnumConstantDeclaration decl, AElement elem) {
   AField field = ((AClass) elem).fields.vivify(decl.getName());
   visitDecl(decl, field);
   return super.visit(decl, field);
 }