//===--- ASTNodeTraverser.h - Traversal of AST nodes ----------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements the AST traversal facilities. Other users // of this class may make use of the same traversal logic by inheriting it, // similar to RecursiveASTVisitor. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_AST_ASTNODETRAVERSER_H #define LLVM_CLANG_AST_ASTNODETRAVERSER_H #include "clang/AST/ASTTypeTraits.h" #include "clang/AST/AttrVisitor.h" #include "clang/AST/CommentVisitor.h" #include "clang/AST/DeclVisitor.h" #include "clang/AST/LocInfoType.h" #include "clang/AST/StmtVisitor.h" #include "clang/AST/TemplateArgumentVisitor.h" #include "clang/AST/Type.h" #include "clang/AST/TypeLocVisitor.h" #include "clang/AST/TypeVisitor.h" #include "llvm/Support/SaveAndRestore.h" namespace clang { class APValue; /** ASTNodeTraverser traverses the Clang AST for dumping purposes. The `Derived::doGetNodeDelegate()` method is required to be an accessible member which returns a reference of type `NodeDelegateType &` which implements the following interface: struct { template <typename Fn> void AddChild(Fn DoAddChild); template <typename Fn> void AddChild(StringRef Label, Fn DoAddChild); void Visit(const comments::Comment *C, const comments::FullComment *FC); void Visit(const Attr *A); void Visit(const TemplateArgument &TA, SourceRange R = {}, const Decl *From = nullptr, StringRef Label = {}); void Visit(const Stmt *Node); void Visit(const Type *T); void Visit(QualType T); void Visit(TypeLoc); void Visit(const Decl *D); void Visit(const CXXCtorInitializer *Init); void Visit(const OpenACCClause *C); void Visit(const OMPClause *C); void Visit(const BlockDecl::Capture &C); void Visit(const GenericSelectionExpr::ConstAssociation &A); void Visit(const concepts::Requirement *R); void Visit(const APValue &Value, QualType Ty); }; */ template <typename Derived, typename NodeDelegateType> class ASTNodeTraverser : public ConstDeclVisitor<Derived>, public ConstStmtVisitor<Derived>, public comments::ConstCommentVisitor<Derived, void, const comments::FullComment *>, public TypeVisitor<Derived>, public TypeLocVisitor<Derived>, public ConstAttrVisitor<Derived>, public ConstTemplateArgumentVisitor<Derived> { … }; } // namespace clang #endif // LLVM_CLANG_AST_ASTNODETRAVERSER_H