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
21namespace llvm {
22
23template <> 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(G: S);
42 }
43
44 static nodes_iterator nodes_end(clang::Stmt* S) {
45 return df_end(G: S);
46 }
47};
48
49template <> 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(G: S);
68 }
69
70 static nodes_iterator nodes_end(const clang::Stmt* S) {
71 return df_end(G: S);
72 }
73};
74
75} // namespace llvm
76
77#endif // LLVM_CLANG_AST_STMTGRAPHTRAITS_H
78

source code of clang/include/clang/AST/StmtGraphTraits.h