Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 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 |