Skip to content
Snippets Groups Projects
DumpTree.jrag 1.68 KiB
aspect DumpTree {
  private static final String ASTNode.DUMP_TREE_INDENT = "  ";

  public String ASTNode.dumpTree() {
    java.io.ByteArrayOutputStream bytes = new java.io.ByteArrayOutputStream();
    dumpTree(new java.io.PrintStream(bytes));
    return bytes.toString();
  }

  public void ASTNode.dumpTree(java.io.PrintStream out) {
    dumpTree(out, "");
    out.flush();
  }

  public void ASTNode.dumpTree(java.io.PrintStream out, String indent) {
    out.print(indent + getClass().getSimpleName());
    out.print(getTokens());
    String extra = extraDumpInfo();
    if (!extra.isEmpty()) {
      out.print(" " + extra);
    }
    out.println();
    String childIndent = indent + DUMP_TREE_INDENT;
    for (ASTNode<?> child : astChildren()) {
      if (child == null) {
        out.println(childIndent + "null");
      } else {
        child.dumpTree(out, childIndent);
      }
    }
  }

  public String ASTNode.extraDumpInfo() { return ""; }

  public String ASTNode.getTokens() {
    java.util.TreeSet<java.lang.reflect.Method> methods = new java.util.TreeSet<>(java.util.Comparator.comparing(java.lang.reflect.Method::getName));

    methods.addAll(java.util.Arrays.asList(getClass().getMethods()));

    StringBuilder result = new StringBuilder();
    for (java.lang.reflect.Method method : methods) {
      ASTNodeAnnotation.Token token = method.getAnnotation(ASTNodeAnnotation.Token.class);
      if (token != null) {
        try {
          result.append(String.format(" %s=\"%s\"", token.name(), method.invoke(this)));
        } catch (IllegalAccessException  ignored) {
        } catch (java.lang.reflect.InvocationTargetException ignored) {
        }
      }
    }
    return result.toString();
  }
}