1 //===--- StmtGraphTraits.h - Graph Traits for the class Stmt ----*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines a template specialization of llvm::GraphTraits to 11 // treat ASTs (Stmt*) as graphs 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CLANG_AST_STMTGRAPHTRAITS_H 16 #define LLVM_CLANG_AST_STMTGRAPHTRAITS_H 17 18 #include "clang/AST/Stmt.h" 19 #include "llvm/ADT/DepthFirstIterator.h" 20 #include "llvm/ADT/GraphTraits.h" 21 22 namespace llvm { 23 24 //template <typename T> struct GraphTraits; 25 26 27 template <> struct GraphTraits<clang::Stmt*> { 28 typedef clang::Stmt NodeType; 29 typedef clang::Stmt::child_iterator ChildIteratorType; 30 typedef llvm::df_iterator<clang::Stmt*> nodes_iterator; 31 32 static NodeType* getEntryNode(clang::Stmt* S) { return S; } 33 34 static inline ChildIteratorType child_begin(NodeType* N) { 35 if (N) return N->child_begin(); 36 else return ChildIteratorType(); 37 } 38 39 static inline ChildIteratorType child_end(NodeType* N) { 40 if (N) return N->child_end(); 41 else return ChildIteratorType(); 42 } 43 44 static nodes_iterator nodes_begin(clang::Stmt* S) { 45 return df_begin(S); 46 } 47 48 static nodes_iterator nodes_end(clang::Stmt* S) { 49 return df_end(S); 50 } 51 }; 52 53 54 template <> struct GraphTraits<const clang::Stmt*> { 55 typedef const clang::Stmt NodeType; 56 typedef clang::Stmt::const_child_iterator ChildIteratorType; 57 typedef llvm::df_iterator<const clang::Stmt*> nodes_iterator; 58 59 static NodeType* getEntryNode(const clang::Stmt* S) { return S; } 60 61 static inline ChildIteratorType child_begin(NodeType* N) { 62 if (N) return N->child_begin(); 63 else return ChildIteratorType(); 64 } 65 66 static inline ChildIteratorType child_end(NodeType* N) { 67 if (N) return N->child_end(); 68 else return ChildIteratorType(); 69 } 70 71 static nodes_iterator nodes_begin(const clang::Stmt* S) { 72 return df_begin(S); 73 } 74 75 static nodes_iterator nodes_end(const clang::Stmt* S) { 76 return df_end(S); 77 } 78 }; 79 80 81 } // end namespace llvm 82 83 #endif 84