xref: /aosp_15_r20/external/clang/lib/AST/StmtViz.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- StmtViz.cpp - Graphviz visualization for Stmt ASTs -----*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li //  This file implements Stmt::viewAST, which generates a Graphviz DOT file
11*67e74705SXin Li //  that depicts the AST and then calls Graphviz/dot+gv on it.
12*67e74705SXin Li //
13*67e74705SXin Li //===----------------------------------------------------------------------===//
14*67e74705SXin Li 
15*67e74705SXin Li #include "clang/AST/StmtGraphTraits.h"
16*67e74705SXin Li #include "clang/AST/Decl.h"
17*67e74705SXin Li #include "llvm/Support/GraphWriter.h"
18*67e74705SXin Li 
19*67e74705SXin Li using namespace clang;
20*67e74705SXin Li 
viewAST() const21*67e74705SXin Li void Stmt::viewAST() const {
22*67e74705SXin Li #ifndef NDEBUG
23*67e74705SXin Li   llvm::ViewGraph(this,"AST");
24*67e74705SXin Li #else
25*67e74705SXin Li   llvm::errs() << "Stmt::viewAST is only available in debug builds on "
26*67e74705SXin Li                << "systems with Graphviz or gv!\n";
27*67e74705SXin Li #endif
28*67e74705SXin Li }
29*67e74705SXin Li 
30*67e74705SXin Li namespace llvm {
31*67e74705SXin Li template<>
32*67e74705SXin Li struct DOTGraphTraits<const Stmt*> : public DefaultDOTGraphTraits {
DOTGraphTraitsllvm::DOTGraphTraits33*67e74705SXin Li   DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {}
34*67e74705SXin Li 
getNodeLabelllvm::DOTGraphTraits35*67e74705SXin Li   static std::string getNodeLabel(const Stmt* Node, const Stmt* Graph) {
36*67e74705SXin Li 
37*67e74705SXin Li #ifndef NDEBUG
38*67e74705SXin Li     std::string OutSStr;
39*67e74705SXin Li     llvm::raw_string_ostream Out(OutSStr);
40*67e74705SXin Li 
41*67e74705SXin Li     if (Node)
42*67e74705SXin Li       Out << Node->getStmtClassName();
43*67e74705SXin Li     else
44*67e74705SXin Li       Out << "<NULL>";
45*67e74705SXin Li 
46*67e74705SXin Li     std::string OutStr = Out.str();
47*67e74705SXin Li     if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
48*67e74705SXin Li 
49*67e74705SXin Li     // Process string output to make it nicer...
50*67e74705SXin Li     for (unsigned i = 0; i != OutStr.length(); ++i)
51*67e74705SXin Li       if (OutStr[i] == '\n') {                            // Left justify
52*67e74705SXin Li         OutStr[i] = '\\';
53*67e74705SXin Li         OutStr.insert(OutStr.begin()+i+1, 'l');
54*67e74705SXin Li       }
55*67e74705SXin Li 
56*67e74705SXin Li     return OutStr;
57*67e74705SXin Li #else
58*67e74705SXin Li     return "";
59*67e74705SXin Li #endif
60*67e74705SXin Li   }
61*67e74705SXin Li };
62*67e74705SXin Li } // end namespace llvm
63