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