001    /* Copyright (c) 2014-2015, Jesper Öqvist <jesper.oqvist@cs.lth.se>
002     * All rights reserved.
003     *
004     * Redistribution and use in source and binary forms, with or without
005     * modification, are permitted provided that the following conditions are met:
006     *
007     * 1. Redistributions of source code must retain the above copyright notice,
008     * this list of conditions and the following disclaimer.
009     *
010     * 2. Redistributions in binary form must reproduce the above copyright notice,
011     * this list of conditions and the following disclaimer in the documentation
012     * and/or other materials provided with the distribution.
013     *
014     * 3. Neither the name of the copyright holder nor the names of its
015     * contributors may be used to endorse or promote products derived from this
016     * software without specific prior written permission.
017     *
018     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021     * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
022     * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
023     * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
024     * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
025     * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
026     * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
027     * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
028     * POSSIBILITY OF SUCH DAMAGE.
029     */
030    
031    import java.util.ArrayList;
032    import java.io.ByteArrayOutputStream;
033    import java.io.PrintStream;
034    import java.lang.reflect.InvocationTargetException;
035    import java.lang.reflect.Method;
036    
037    aspect DumpTree {
038      private String ASTNode.DUMP_TREE_INDENT = "  ";
039    
040      public String ASTNode.dumpTree() {
041        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
042        dumpTree(new PrintStream(bytes));
043        return bytes.toString();
044      }
045    
046      public void ASTNode.dumpTree(PrintStream out) {
047        dumpTree(out, "");
048        out.flush();
049      }
050    
051      public void ASTNode.dumpTree(PrintStream out, String indent) {
052        out.print(indent + getClass().getSimpleName());
053        out.println(getTokens());
054        String childIndent = indent + DUMP_TREE_INDENT;
055        for (int i = 0; i < getNumChild(); ++i) {
056          ASTNode child = getChild(i);
057          if (child == null)  {
058            out.println(childIndent + "null");
059          } else {
060            child.dumpTree(out, childIndent);
061          }
062        }
063      }
064    
065      public String ASTNode.getTokens() {
066        StringBuilder sb = new StringBuilder();
067        Method[] methods = getClass().getMethods();
068        for (Method method : getClass().getMethods()) {
069          ASTNodeAnnotation.Token token = method.getAnnotation(ASTNodeAnnotation.Token.class);
070          if (token != null) {
071            try {
072              sb.append(" " + token.name() + "=\"" + method.invoke(this) + "\"");
073            } catch (IllegalAccessException e) {
074            } catch (InvocationTargetException e) {
075            }
076          }
077        }
078        return sb.toString();
079      }
080    
081      public String ASTNode.dumpTreeNoRewrite() {
082        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
083        dumpTreeNoRewrite(new PrintStream(bytes));
084        return bytes.toString();
085      }
086    
087      public void ASTNode.dumpTreeNoRewrite(PrintStream out) {
088        dumpTreeNoRewrite(out, "");
089        out.flush();
090      }
091    
092      public void ASTNode.dumpTreeNoRewrite(PrintStream out, String indent) {
093        out.print(indent + getClass().getSimpleName());
094        out.println(getTokens());
095        String childIndent = indent + DUMP_TREE_INDENT;
096        for (int i = 0; i < getNumChildNoTransform(); ++i) {
097          ASTNode child = getChildNoTransform(i);
098          if (child == null)  {
099            out.println(childIndent + "null");
100          } else {
101            child.dumpTreeNoRewrite(out, childIndent);
102          }
103        }
104      }
105    }