StmtViz.cpp revision 193326
1272343Sngie//===--- StmtViz.cpp - Graphviz visualization for Stmt ASTs -----*- C++ -*-===//
2272343Sngie//
3272343Sngie//                     The LLVM Compiler Infrastructure
4272343Sngie//
5272343Sngie// This file is distributed under the University of Illinois Open Source
6272343Sngie// License. See LICENSE.TXT for details.
7272343Sngie//
8272343Sngie//===----------------------------------------------------------------------===//
9272343Sngie//
10272343Sngie//  This file implements Stmt::viewAST, which generates a Graphviz DOT file
11272343Sngie//  that depicts the AST and then calls Graphviz/dot+gv on it.
12272343Sngie//
13272343Sngie//===----------------------------------------------------------------------===//
14272343Sngie
15272343Sngie#include "clang/AST/StmtGraphTraits.h"
16272343Sngie#include "clang/AST/Decl.h"
17272343Sngie#include "llvm/Support/GraphWriter.h"
18272343Sngie#include <sstream>
19272343Sngie
20272343Sngieusing namespace clang;
21272343Sngie
22272343Sngievoid Stmt::viewAST() const {
23272343Sngie#ifndef NDEBUG
24272343Sngie  llvm::ViewGraph(this,"AST");
25272343Sngie#else
26272343Sngie  llvm::cerr << "Stmt::viewAST is only available in debug builds on "
27272343Sngie  << "systems with Graphviz or gv!\n";
28272343Sngie#endif
29272343Sngie}
30272343Sngie
31272343Sngienamespace llvm {
32272343Sngietemplate<>
33272343Sngiestruct DOTGraphTraits<const Stmt*> : public DefaultDOTGraphTraits {
34272343Sngie  static std::string getNodeLabel(const Stmt* Node, const Stmt* Graph) {
35272343Sngie
36272343Sngie#ifndef NDEBUG
37272343Sngie    std::string OutSStr;
38272343Sngie    llvm::raw_string_ostream Out(OutSStr);
39272343Sngie
40272343Sngie    if (Node)
41272343Sngie      Out << Node->getStmtClassName();
42272343Sngie    else
43272343Sngie      Out << "<NULL>";
44272343Sngie
45272343Sngie    std::string OutStr = Out.str();
46272343Sngie    if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
47272343Sngie
48272343Sngie    // Process string output to make it nicer...
49272343Sngie    for (unsigned i = 0; i != OutStr.length(); ++i)
50272343Sngie      if (OutStr[i] == '\n') {                            // Left justify
51272343Sngie        OutStr[i] = '\\';
52272343Sngie        OutStr.insert(OutStr.begin()+i+1, 'l');
53272343Sngie      }
54272343Sngie
55272343Sngie    return OutStr;
56272343Sngie#else
57272343Sngie    return "";
58272343Sngie#endif
59272343Sngie  }
60272343Sngie};
61272343Sngie} // end namespace llvm
62272343Sngie