1 //===--- ASTVisitor.h - Visitor for an ASTContext ---------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the ASTVisitor interface.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_INDEX_ASTVISITOR_H
15 #define LLVM_CLANG_INDEX_ASTVISITOR_H
17 #include "clang/AST/DeclVisitor.h"
18 #include "clang/AST/StmtVisitor.h"
19 #include "clang/AST/TypeLocVisitor.h"
25 /// \brief Traverses the full AST, both Decls and Stmts.
26 template<typename ImplClass>
27 class ASTVisitor : public DeclVisitor<ImplClass>,
28 public StmtVisitor<ImplClass>,
29 public TypeLocVisitor<ImplClass> {
31 ASTVisitor() : CurrentDecl(0) { }
35 typedef ASTVisitor<ImplClass> Base;
36 typedef DeclVisitor<ImplClass> BaseDeclVisitor;
37 typedef StmtVisitor<ImplClass> BaseStmtVisitor;
38 typedef TypeLocVisitor<ImplClass> BaseTypeLocVisitor;
40 using BaseStmtVisitor::Visit;
42 //===--------------------------------------------------------------------===//
44 //===--------------------------------------------------------------------===//
47 Decl *PrevDecl = CurrentDecl;
49 BaseDeclVisitor::Visit(D);
50 CurrentDecl = PrevDecl;
53 void VisitDeclaratorDecl(DeclaratorDecl *D) {
54 BaseDeclVisitor::VisitDeclaratorDecl(D);
55 if (TypeSourceInfo *TInfo = D->getTypeSourceInfo())
56 Visit(TInfo->getTypeLoc());
59 void VisitFunctionDecl(FunctionDecl *D) {
60 BaseDeclVisitor::VisitFunctionDecl(D);
61 if (D->isThisDeclarationADefinition())
65 void VisitObjCMethodDecl(ObjCMethodDecl *D) {
66 BaseDeclVisitor::VisitObjCMethodDecl(D);
71 void VisitBlockDecl(BlockDecl *D) {
72 BaseDeclVisitor::VisitBlockDecl(D);
76 void VisitVarDecl(VarDecl *D) {
77 BaseDeclVisitor::VisitVarDecl(D);
78 if (Expr *Init = D->getInit())
82 void VisitDecl(Decl *D) {
83 if (isa<FunctionDecl>(D) || isa<ObjCMethodDecl>(D) || isa<BlockDecl>(D))
86 if (DeclContext *DC = dyn_cast<DeclContext>(D))
87 static_cast<ImplClass*>(this)->VisitDeclContext(DC);
90 void VisitDeclContext(DeclContext *DC) {
91 for (DeclContext::decl_iterator
92 I = DC->decls_begin(), E = DC->decls_end(); I != E; ++I)
96 //===--------------------------------------------------------------------===//
98 //===--------------------------------------------------------------------===//
100 void VisitDeclStmt(DeclStmt *Node) {
101 for (DeclStmt::decl_iterator
102 I = Node->decl_begin(), E = Node->decl_end(); I != E; ++I)
106 void VisitBlockExpr(BlockExpr *Node) {
107 // The BlockDecl is also visited by 'VisitDeclContext()'. No need to visit it twice.
110 void VisitStmt(Stmt *Node) {
111 for (Stmt::child_iterator
112 I = Node->child_begin(), E = Node->child_end(); I != E; ++I)
117 //===--------------------------------------------------------------------===//
119 //===--------------------------------------------------------------------===//
121 void Visit(TypeLoc TL) {
122 for (; TL; TL = TL.getNextTypeLoc())
123 BaseTypeLocVisitor::Visit(TL);
126 void VisitArrayLoc(ArrayTypeLoc TL) {
127 BaseTypeLocVisitor::VisitArrayTypeLoc(TL);
128 if (TL.getSizeExpr())
129 Visit(TL.getSizeExpr());
132 void VisitFunctionTypeLoc(FunctionTypeLoc TL) {
133 BaseTypeLocVisitor::VisitFunctionTypeLoc(TL);
134 for (unsigned i = 0; i != TL.getNumArgs(); ++i)