From: Ted Kremenek Date: Wed, 19 Sep 2007 21:21:39 +0000 (+0000) Subject: Moved GraphTraits to StmtGraphTraits.h. This allows consumers of Stmt.h not... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d2a4a1af1088fca80e2dc76eb3369db0fbbfdefd;p=clang Moved GraphTraits to StmtGraphTraits.h. This allows consumers of Stmt.h not to have to pay the cost of parsing the GraphTraits templates if they don't need that functionality. Defined nodes_iterator for GraphTraits to be based on llvm::df_iterator. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42150 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index c86da49291..cc1c1cf6e3 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -17,7 +17,6 @@ #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/iterator" -#include "llvm/ADT/GraphTraits.h" #include namespace clang { @@ -79,6 +78,10 @@ public: void dumpPretty() const; void printPretty(std::ostream &OS, PrinterHelper* = NULL) const; + /// viewAST - Visualize an AST rooted at this Stmt* using GraphViz. Only + /// works on systems with GraphViz (Mac OS X) or dot+gv installed. + void viewAST() const; + // Implement isa support. static bool classof(const Stmt *) { return true; } @@ -635,41 +638,4 @@ public: } // end namespace clang -//===----------------------------------------------------------------------===// -// GraphTraits specialization to treat ASTs (Stmt*) as graphs -//===----------------------------------------------------------------------===// - -namespace llvm { - -template <> struct GraphTraits { - typedef clang::Stmt NodeType; - typedef clang::Stmt::child_iterator ChildIteratorType; - - static NodeType* getEntryNode(clang::Stmt* S) { return S; } - - static inline ChildIteratorType child_begin(NodeType* N) { - return N->child_begin(); - } - - static inline ChildIteratorType child_end(NodeType* N) { - return N->child_end(); - } -}; - -template <> struct GraphTraits { - typedef const clang::Stmt NodeType; - typedef clang::Stmt::const_child_iterator ChildIteratorType; - - static NodeType* getEntryNode(const clang::Stmt* S) { return S; } - - static inline ChildIteratorType child_begin(NodeType* N) { - return N->child_begin(); - } - - static inline ChildIteratorType child_end(NodeType* N) { - return N->child_end(); - } -}; - -} // end namespace llvm #endif diff --git a/include/clang/AST/StmtGraphTraits.h b/include/clang/AST/StmtGraphTraits.h new file mode 100644 index 0000000000..43f594b098 --- /dev/null +++ b/include/clang/AST/StmtGraphTraits.h @@ -0,0 +1,83 @@ +//===--- StmtGraphTraits.h - Graph Traits for the class Stmt ----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by Ted Kremenek and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines a template specialization of llvm::GraphTraits to +// treat ASTs (Stmt*) as graphs +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_AST_STMT_GRAPHTRAITS_H +#define LLVM_CLANG_AST_STMT_GRAPHTRAITS_H + +#include "clang/AST/Stmt.h" +#include "llvm/ADT/GraphTraits.h" +#include "llvm/ADT/DepthFirstIterator.h" + +namespace llvm { + +//template struct GraphTraits; + + +template <> struct GraphTraits { + typedef clang::Stmt NodeType; + typedef clang::Stmt::child_iterator ChildIteratorType; + typedef llvm::df_iterator nodes_iterator; + + static NodeType* getEntryNode(clang::Stmt* S) { return S; } + + static inline ChildIteratorType child_begin(NodeType* N) { + if (N) return N->child_begin(); + else return NULL; + } + + static inline ChildIteratorType child_end(NodeType* N) { + if (N) return N->child_end(); + else return NULL; + } + + static nodes_iterator nodes_begin(clang::Stmt* S) { + return df_begin(S); + } + + static nodes_iterator nodes_end(clang::Stmt* S) { + return df_end(S); + } +}; + + +template <> struct GraphTraits { + typedef const clang::Stmt NodeType; + typedef clang::Stmt::const_child_iterator ChildIteratorType; + typedef llvm::df_iterator nodes_iterator; + + static NodeType* getEntryNode(const clang::Stmt* S) { return S; } + + static inline ChildIteratorType child_begin(NodeType* N) { + if (N) return N->child_begin(); + else return NULL; + } + + static inline ChildIteratorType child_end(NodeType* N) { + if (N) return N->child_end(); + else return NULL; + } + + static nodes_iterator nodes_begin(const clang::Stmt* S) { + return df_begin(S); + } + + static nodes_iterator nodes_end(const clang::Stmt* S) { + return df_end(S); + } +}; + + +} // end namespace llvm + +#endif