import edu.neu.ccs.demeter.*;
class PrintVisitor extends UniversalVisitor {
  protected int indent;
  public int get_indent() { return indent; }
  public void set_indent(int new_indent) { indent = new_indent; }
  protected boolean needSpace;
  public boolean get_needSpace() { return needSpace; }
  public void set_needSpace(boolean new_needSpace) { needSpace = new_needSpace; }
  public PrintVisitor() { super(); }
  public PrintVisitor(int indent, boolean needSpace) {
    super();
    set_indent(indent);
    set_needSpace(needSpace);
  }

    protected java.io.PrintWriter out = new java.io.PrintWriter(System.out, true);
    java.io.PrintWriter get_out()             { return out; }
    void set_out(java.io.PrintWriter new_out) { out = new_out; }
    PrintVisitor(java.io.PrintWriter out)     { set_out(out); }
    PrintVisitor(java.io.PrintStream out)
      { set_out(new java.io.PrintWriter(out, true)); }
  
  public void finish() { out.flush(); }
  protected void space() {
    if (needSpace) out.print(" ");
    needSpace = false;
  }
  public void before_aspectname(TraversalAspect source, AspectName dest) {
    space();
    out.print("aspect");
    needSpace = true;
  }
  public void before_definitionbody(Definition source, DefinitionBody dest) {
    space();
    out.print("declare");
    needSpace = true;
  }
  public void after_definitionbody(Definition source, DefinitionBody dest) {
    out.print(";");
    needSpace = false;
  }
  public void before_classgraphname(CG source, ClassGraphName dest) {
    space();
    out.print("ClassGraph");
    needSpace = true;
  }
  public void before_strategyname(Strategy source, StrategyName dest) {
    space();
    out.print("Strategy");
    needSpace = true;
  }
  public void before_strategyexpression(Strategy source, StrategyExpression dest) {
    out.print("=");
    needSpace = false;
  }
  public void before_string(StrategyString source, String dest) {
    space();
    out.print("\"" + source.get_string() + "\"");
    needSpace = true;
  }
  public void before_op(Compound source, Op dest) {
    out.print("(");
    needSpace = false;
  }
  public void after_strategyexpression_list(Compound source, StrategyExpression_List dest) {
    out.print(")");
    needSpace = false;
  }
  public void before(And host) {
    out.print("&&");
    needSpace = false;
  }
  public void before_methodsignature(AdaptiveMethod source, MethodSignature dest) {
    space();
    out.print("Method");
    needSpace = true;
  }
  public void after_name(MethodSignature source, MethodName dest) {
    out.print("(");
    needSpace = false;
  }
  public void before_throwsclause(MethodSignature source, Throws dest) {
    out.print(")");
    needSpace = false;
  }
  public void before(PublicMethod host) {
    space();
    out.print("public");
    needSpace = true;
  }
  public void before(ProtectedMethod host) {
    space();
    out.print("protected");
    needSpace = true;
  }
  public void before(PrivateMethod host) {
    space();
    out.print("private");
    needSpace = true;
  }
  public void before(StaticMethod host) {
    space();
    out.print("static");
    needSpace = true;
  }
  public void before(FinalMethod host) {
    space();
    out.print("final");
    needSpace = true;
  }
  public void before_exceptions(Throws source, ClassName_Commalist dest) {
    out.print(" ");
    needSpace = false;
    space();
    out.print("throws");
    needSpace = true;
  }
  public void before_visitorClasses(VisitorRef source, ClassName_Commalist dest) {
    out.print("(");
    needSpace = false;
  }
  public void after_visitorClasses(VisitorRef source, ClassName_Commalist dest) {
    out.print(")");
    needSpace = false;
  }
  public void before(ArraySpec host) {
    out.print("[");
    needSpace = false;
    out.print("]");
    needSpace = false;
  }
  public void before_ident(ClassGraphName source, Ident dest) {
    space();
    out.print(source.get_ident());
    needSpace = true;
  }
  public void before_ident(StrategyName source, Ident dest) {
    space();
    out.print(source.get_ident());
    needSpace = true;
  }
  public void before_ident(MethodName source, Ident dest) {
    space();
    out.print(source.get_ident());
    needSpace = true;
  }
  public void before_name(ParmName source, Ident dest) {
    space();
    out.print(source.get_name());
    needSpace = true;
  }
  public void before_s(Main source, String dest) {
    space();
    out.print("\"" + source.get_s() + "\"");
    needSpace = true;
  }
  public void before_indent(PrintVisitor source, int dest) {
    space();
    out.print(source.get_indent());
    needSpace = true;
  }
  public void before_needSpace(PrintVisitor source, boolean dest) {
    space();
    out.print(source.get_needSpace());
    needSpace = true;
  }
  public void before_copy(CopyVisitor source, Object dest) {
    space();
    out.print(source.get_copy());
    needSpace = true;
  }
  public void before_is_equal(SubgraphVisitor source, boolean dest) {
    space();
    out.print(source.get_is_equal());
    needSpace = true;
  }
  public void before_is_equal(EqualVisitor source, boolean dest) {
    space();
    out.print(source.get_is_equal());
    needSpace = true;
  }
  public void before_indent(DisplayVisitor source, int dest) {
    space();
    out.print(source.get_indent());
    needSpace = true;
  }
  public void before_indent(TraceVisitor source, int dest) {
    space();
    out.print(source.get_indent());
    needSpace = true;
  }
  public void before_first(Definition_CurlyList source, Nonempty_Definition_CurlyList dest) {
    out.print("{");
    needSpace = false;
  }
  public void after_first(Definition_CurlyList source, Nonempty_Definition_CurlyList dest) {
    out.print("}");
    needSpace = false;
  }
  public void before_it(Nonempty_Name source, Ident dest) {
    space();
    out.print(source.get_it());
    needSpace = true;
  }
  public void before_next(Nonempty_Name source, Nonempty_Name dest) {
    out.print(".");
    needSpace = false;
  }
  public void before_next(Nonempty_TraversalAspect_List source, Nonempty_TraversalAspect_List dest) {
    out.print(" ");
    needSpace = false;
  }
  public void before_next(Nonempty_Definition_CurlyList source, Nonempty_Definition_CurlyList dest) {
    out.print(" ");
    needSpace = false;
  }
  public void before_next(Nonempty_StrategyExpression_List source, Nonempty_StrategyExpression_List dest) {
    out.print(" ");
    needSpace = false;
  }
  public void before_next(Nonempty_MethodKeyword_List source, Nonempty_MethodKeyword_List dest) {
    out.print(" ");
    needSpace = false;
  }
  public void before_next(Nonempty_MethodParm_Commalist source, Nonempty_MethodParm_Commalist dest) {
    out.print(",");
    needSpace = false;
    out.print(" ");
    needSpace = false;
  }
  public void before_next(Nonempty_ArraySpec_List source, Nonempty_ArraySpec_List dest) {
    out.print(" ");
    needSpace = false;
  }
  public void before_next(Nonempty_ClassName_Commalist source, Nonempty_ClassName_Commalist dest) {
    out.print(",");
    needSpace = false;
    out.print(" ");
    needSpace = false;
  }
  void universal_trv0_bef(UniversalVisitor _v_) {
    super.universal_trv0_bef(_v_);
  }

  void universal_trv0_aft(UniversalVisitor _v_) {
    super.universal_trv0_aft(_v_);
  }

  void universal_trv0(UniversalVisitor _v_) {
    universal_trv0_bef(_v_);
    super.universal_trv0(_v_);
    universal_trv0_aft(_v_);
  }

}

