1 //===- StmtGraphTraits.h - Graph Traits for the class Stmt ------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 //  This file defines a template specialization of llvm::GraphTraits to
10 //  treat ASTs (Stmt*) as graphs
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CLANG_AST_STMTGRAPHTRAITS_H
15 #define LLVM_CLANG_AST_STMTGRAPHTRAITS_H
16 
17 #include "clang/AST/Stmt.h"
18 #include "llvm/ADT/DepthFirstIterator.h"
19 #include "llvm/ADT/GraphTraits.h"
20 
21 namespace llvm {
22 
23 template <> struct GraphTraits<clang::Stmt *> {
24   using NodeRef = clang::Stmt *;
25   using ChildIteratorType = clang::Stmt::child_iterator;
26   using nodes_iterator = llvm::df_iterator<clang::Stmt *>;
27 
28   static NodeRef getEntryNode(clang::Stmt *S) { return S; }
29 
30   static ChildIteratorType child_begin(NodeRef N) {
31     if (N) return N->child_begin();
32     else return ChildIteratorType();
33   }
34 
35   static ChildIteratorType child_end(NodeRef N) {
36     if (N) return N->child_end();
37     else return ChildIteratorType();
38   }
39 
40   static nodes_iterator nodes_begin(clang::Stmt* S) {
41     return df_begin(S);
42   }
43 
44   static nodes_iterator nodes_end(clang::Stmt* S) {
45     return df_end(S);
46   }
47 };
48 
49 template <> struct GraphTraits<const clang::Stmt *> {
50   using NodeRef = const clang::Stmt *;
51   using ChildIteratorType = clang::Stmt::const_child_iterator;
52   using nodes_iterator = llvm::df_iterator<const clang::Stmt *>;
53 
54   static NodeRef getEntryNode(const clang::Stmt *S) { return S; }
55 
56   static ChildIteratorType child_begin(NodeRef N) {
57     if (N) return N->child_begin();
58     else return ChildIteratorType();
59   }
60 
61   static ChildIteratorType child_end(NodeRef N) {
62     if (N) return N->child_end();
63     else return ChildIteratorType();
64   }
65 
66   static nodes_iterator nodes_begin(const clang::Stmt* S) {
67     return df_begin(S);
68   }
69 
70   static nodes_iterator nodes_end(const clang::Stmt* S) {
71     return df_end(S);
72   }
73 };
74 
75 } // namespace llvm
76 
77 #endif // LLVM_CLANG_AST_STMTGRAPHTRAITS_H
78