- //===--- ASTMutationListener.h - AST Mutation Interface --------*- C++ -*-===// 
- // 
- // 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 defines the ASTMutationListener interface. 
- // 
- //===----------------------------------------------------------------------===// 
- #ifndef LLVM_CLANG_AST_ASTMUTATIONLISTENER_H 
- #define LLVM_CLANG_AST_ASTMUTATIONLISTENER_H 
-   
- namespace clang { 
-   class Attr; 
-   class ClassTemplateDecl; 
-   class ClassTemplateSpecializationDecl; 
-   class ConstructorUsingShadowDecl; 
-   class CXXDestructorDecl; 
-   class CXXRecordDecl; 
-   class Decl; 
-   class DeclContext; 
-   class Expr; 
-   class FieldDecl; 
-   class FunctionDecl; 
-   class FunctionTemplateDecl; 
-   class Module; 
-   class NamedDecl; 
-   class ObjCCategoryDecl; 
-   class ObjCContainerDecl; 
-   class ObjCInterfaceDecl; 
-   class ObjCPropertyDecl; 
-   class ParmVarDecl; 
-   class QualType; 
-   class RecordDecl; 
-   class TagDecl; 
-   class ValueDecl; 
-   class VarDecl; 
-   class VarTemplateDecl; 
-   class VarTemplateSpecializationDecl; 
-   
- /// An abstract interface that should be implemented by listeners 
- /// that want to be notified when an AST entity gets modified after its 
- /// initial creation. 
- class ASTMutationListener { 
- public: 
-   virtual ~ASTMutationListener(); 
-   
-   /// A new TagDecl definition was completed. 
-   virtual void CompletedTagDefinition(const TagDecl *D) { } 
-   
-   /// A new declaration with name has been added to a DeclContext. 
-   virtual void AddedVisibleDecl(const DeclContext *DC, const Decl *D) {} 
-   
-   /// An implicit member was added after the definition was completed. 
-   virtual void AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) {} 
-   
-   /// A template specialization (or partial one) was added to the 
-   /// template declaration. 
-   virtual void AddedCXXTemplateSpecialization(const ClassTemplateDecl *TD, 
-                                     const ClassTemplateSpecializationDecl *D) {} 
-   
-   /// A template specialization (or partial one) was added to the 
-   /// template declaration. 
-   virtual void 
-   AddedCXXTemplateSpecialization(const VarTemplateDecl *TD, 
-                                  const VarTemplateSpecializationDecl *D) {} 
-   
-   /// A template specialization (or partial one) was added to the 
-   /// template declaration. 
-   virtual void AddedCXXTemplateSpecialization(const FunctionTemplateDecl *TD, 
-                                               const FunctionDecl *D) {} 
-   
-   /// A function's exception specification has been evaluated or 
-   /// instantiated. 
-   virtual void ResolvedExceptionSpec(const FunctionDecl *FD) {} 
-   
-   /// A function's return type has been deduced. 
-   virtual void DeducedReturnType(const FunctionDecl *FD, QualType ReturnType); 
-   
-   /// A virtual destructor's operator delete has been resolved. 
-   virtual void ResolvedOperatorDelete(const CXXDestructorDecl *DD, 
-                                       const FunctionDecl *Delete, 
-                                       Expr *ThisArg) {} 
-   
-   /// An implicit member got a definition. 
-   virtual void CompletedImplicitDefinition(const FunctionDecl *D) {} 
-   
-   /// The instantiation of a templated function or variable was 
-   /// requested. In particular, the point of instantiation and template 
-   /// specialization kind of \p D may have changed. 
-   virtual void InstantiationRequested(const ValueDecl *D) {} 
-   
-   /// A templated variable's definition was implicitly instantiated. 
-   virtual void VariableDefinitionInstantiated(const VarDecl *D) {} 
-   
-   /// A function template's definition was instantiated. 
-   virtual void FunctionDefinitionInstantiated(const FunctionDecl *D) {} 
-   
-   /// A default argument was instantiated. 
-   virtual void DefaultArgumentInstantiated(const ParmVarDecl *D) {} 
-   
-   /// A default member initializer was instantiated. 
-   virtual void DefaultMemberInitializerInstantiated(const FieldDecl *D) {} 
-   
-   /// A new objc category class was added for an interface. 
-   virtual void AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD, 
-                                             const ObjCInterfaceDecl *IFD) {} 
-   
-   /// A declaration is marked used which was not previously marked used. 
-   /// 
-   /// \param D the declaration marked used 
-   virtual void DeclarationMarkedUsed(const Decl *D) {} 
-   
-   /// A declaration is marked as OpenMP threadprivate which was not 
-   /// previously marked as threadprivate. 
-   /// 
-   /// \param D the declaration marked OpenMP threadprivate. 
-   virtual void DeclarationMarkedOpenMPThreadPrivate(const Decl *D) {} 
-   
-   /// A declaration is marked as OpenMP declaretarget which was not 
-   /// previously marked as declaretarget. 
-   /// 
-   /// \param D the declaration marked OpenMP declaretarget. 
-   /// \param Attr the added attribute. 
-   virtual void DeclarationMarkedOpenMPDeclareTarget(const Decl *D, 
-                                                     const Attr *Attr) {} 
-   
-   /// A declaration is marked as a variable with OpenMP allocator. 
-   /// 
-   /// \param D the declaration marked as a variable with OpenMP allocator. 
-   virtual void DeclarationMarkedOpenMPAllocate(const Decl *D, const Attr *A) {} 
-   
-   /// A definition has been made visible by being redefined locally. 
-   /// 
-   /// \param D The definition that was previously not visible. 
-   /// \param M The containing module in which the definition was made visible, 
-   ///        if any. 
-   virtual void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) {} 
-   
-   /// An attribute was added to a RecordDecl 
-   /// 
-   /// \param Attr The attribute that was added to the Record 
-   /// 
-   /// \param Record The RecordDecl that got a new attribute 
-   virtual void AddedAttributeToRecord(const Attr *Attr, 
-                                       const RecordDecl *Record) {} 
-   
-   // NOTE: If new methods are added they should also be added to 
-   // MultiplexASTMutationListener. 
- }; 
-   
- } // end namespace clang 
-   
- #endif 
-