04c6eb408f6c9ad530f226db583f0e9e6cc942da
[idea/community.git] / platform / lang-impl / src / com / intellij / formatting / BlockDebugUtil.java
1 /*
2  * Copyright 2000-2010 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.formatting;
17
18 import com.intellij.lang.ASTNode;
19
20 import java.io.PrintStream;
21 import java.util.List;
22
23 /**
24  * Convenience utilities to print out various formatting blocks information.
25  *
26  * @author rvishnyakov
27  */
28 public class BlockDebugUtil {
29
30   /**
31    * Prints out a dump of nested formatting blocks. 
32    * @param out   The output stream.
33    * @param block The root block to start with.
34    */
35   public static void dumpBlockTree(PrintStream out, Block block) {
36     out.println("--- BLOCK TREE DUMP ---");
37     dumpBlockTree(out, block, "", true);
38     out.println("--- END OF DUMP ---\n\n");
39   }
40
41
42   /**
43    * Print out a single block info without child blocks.
44    * @param out   The output stream.
45    * @param block The block to print the info for.
46    */
47   public static void dumpBlock(PrintStream out, Block block) {
48     dumpBlockTree(out, block, "", false);
49   }
50
51   private static void dumpBlockTree(PrintStream out, Block block, String indent, boolean withChildren) {
52     if (block == null) return;
53     out.print(indent + block.getClass().getSimpleName());
54     if (block.getIndent() != null) {
55       out.print(" " + block.getIndent());
56     }
57     else {
58       out.print(" <Indent: -- null -->");
59     }
60     out.print(" " + block.getTextRange() + " ");
61     if (block instanceof ASTBlock) {
62       ASTNode node = ((ASTBlock)block).getNode();
63       if (node != null) {
64         out.print(" " + node.getElementType());
65         String text = node.getText();
66         int eolPos = text.indexOf('\n');
67         if (eolPos > 0) {
68           text = text.substring(0, eolPos) + "...";
69         }
70         out.print(" \"" + text + "\"");
71       }
72     }
73     out.println();
74     if (withChildren) {
75       List<Block> subBlocks = getSubBlocks(block);
76       if (subBlocks != null && subBlocks.size() > 0) {
77         out.println(indent + "{");
78         for (Block child : subBlocks) {
79           dumpBlockTree(out, child, indent + "    ", true);
80         }
81         out.println(indent + "}");
82       }
83     }
84   }
85
86   private static List<Block> getSubBlocks(Block root) {
87     return root.getSubBlocks();
88   }
89 }