xref: /freebsd/contrib/llvm-project/clang/include/clang/Serialization/ASTDeserializationListener.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===- ASTDeserializationListener.h - Decl/Type PCH Read Events -*- 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 the ASTDeserializationListener class, which is notified
10 //  by the ASTReader whenever a type or declaration is deserialized.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CLANG_SERIALIZATION_ASTDESERIALIZATIONLISTENER_H
15 #define LLVM_CLANG_SERIALIZATION_ASTDESERIALIZATIONLISTENER_H
16 
17 #include "clang/Basic/IdentifierTable.h"
18 #include "clang/Serialization/ASTBitCodes.h"
19 
20 namespace clang {
21 
22 class Decl;
23 class ASTReader;
24 class QualType;
25 class MacroDefinitionRecord;
26 class MacroInfo;
27 class Module;
28 class SourceLocation;
29 
30 // IMPORTANT: when you add a new interface to this class, please update the
31 // DelegatingDeserializationListener below.
32 class ASTDeserializationListener {
33 public:
34   virtual ~ASTDeserializationListener();
35 
36   /// The ASTReader was initialized.
ReaderInitialized(ASTReader * Reader)37   virtual void ReaderInitialized(ASTReader *Reader) { }
38 
39   /// An identifier was deserialized from the AST file.
IdentifierRead(serialization::IdentifierID ID,IdentifierInfo * II)40   virtual void IdentifierRead(serialization::IdentifierID ID,
41                               IdentifierInfo *II) { }
42   /// A macro was read from the AST file.
MacroRead(serialization::MacroID ID,MacroInfo * MI)43   virtual void MacroRead(serialization::MacroID ID, MacroInfo *MI) { }
44   /// A type was deserialized from the AST file. The ID here has the
45   ///        qualifier bits already removed, and T is guaranteed to be locally
46   ///        unqualified.
TypeRead(serialization::TypeIdx Idx,QualType T)47   virtual void TypeRead(serialization::TypeIdx Idx, QualType T) { }
48   /// A decl was deserialized from the AST file.
49   //
50   // Note: Implementors should be cautious when introducing additional
51   // serialization (e.g., printing the qualified name of the declaration) within
52   // the callback. Doing so may lead to unintended and complex side effects, or
53   // even cause a crash.
DeclRead(GlobalDeclID ID,const Decl * D)54   virtual void DeclRead(GlobalDeclID ID, const Decl *D) {}
55   /// A predefined decl was built during the serialization.
PredefinedDeclBuilt(PredefinedDeclIDs ID,const Decl * D)56   virtual void PredefinedDeclBuilt(PredefinedDeclIDs ID, const Decl *D) {}
57   /// A selector was read from the AST file.
SelectorRead(serialization::SelectorID iD,Selector Sel)58   virtual void SelectorRead(serialization::SelectorID iD, Selector Sel) {}
59   /// A macro definition was read from the AST file.
MacroDefinitionRead(serialization::PreprocessedEntityID,MacroDefinitionRecord * MD)60   virtual void MacroDefinitionRead(serialization::PreprocessedEntityID,
61                                    MacroDefinitionRecord *MD) {}
62   /// A module definition was read from the AST file.
ModuleRead(serialization::SubmoduleID ID,Module * Mod)63   virtual void ModuleRead(serialization::SubmoduleID ID, Module *Mod) {}
64   /// A module import was read from the AST file.
ModuleImportRead(serialization::SubmoduleID ID,SourceLocation ImportLoc)65   virtual void ModuleImportRead(serialization::SubmoduleID ID,
66                                 SourceLocation ImportLoc) {}
67 };
68 
69 class DelegatingDeserializationListener : public ASTDeserializationListener {
70   ASTDeserializationListener *Previous;
71   bool DeletePrevious;
72 
73 public:
DelegatingDeserializationListener(ASTDeserializationListener * Previous,bool DeletePrevious)74   explicit DelegatingDeserializationListener(
75       ASTDeserializationListener *Previous, bool DeletePrevious)
76       : Previous(Previous), DeletePrevious(DeletePrevious) {}
~DelegatingDeserializationListener()77   ~DelegatingDeserializationListener() override {
78     if (DeletePrevious)
79       delete Previous;
80   }
81 
82   DelegatingDeserializationListener(const DelegatingDeserializationListener &) =
83       delete;
84   DelegatingDeserializationListener &
85   operator=(const DelegatingDeserializationListener &) = delete;
86 
ReaderInitialized(ASTReader * Reader)87   void ReaderInitialized(ASTReader *Reader) override {
88     if (Previous)
89       Previous->ReaderInitialized(Reader);
90   }
IdentifierRead(serialization::IdentifierID ID,IdentifierInfo * II)91   void IdentifierRead(serialization::IdentifierID ID,
92                       IdentifierInfo *II) override {
93     if (Previous)
94       Previous->IdentifierRead(ID, II);
95   }
MacroRead(serialization::MacroID ID,MacroInfo * MI)96   void MacroRead(serialization::MacroID ID, MacroInfo *MI) override {
97     if (Previous)
98       Previous->MacroRead(ID, MI);
99   }
TypeRead(serialization::TypeIdx Idx,QualType T)100   void TypeRead(serialization::TypeIdx Idx, QualType T) override {
101     if (Previous)
102       Previous->TypeRead(Idx, T);
103   }
DeclRead(GlobalDeclID ID,const Decl * D)104   void DeclRead(GlobalDeclID ID, const Decl *D) override {
105     if (Previous)
106       Previous->DeclRead(ID, D);
107   }
PredefinedDeclBuilt(PredefinedDeclIDs ID,const Decl * D)108   void PredefinedDeclBuilt(PredefinedDeclIDs ID, const Decl *D) override {
109     if (Previous)
110       Previous->PredefinedDeclBuilt(ID, D);
111   }
SelectorRead(serialization::SelectorID ID,Selector Sel)112   void SelectorRead(serialization::SelectorID ID, Selector Sel) override {
113     if (Previous)
114       Previous->SelectorRead(ID, Sel);
115   }
MacroDefinitionRead(serialization::PreprocessedEntityID PPID,MacroDefinitionRecord * MD)116   void MacroDefinitionRead(serialization::PreprocessedEntityID PPID,
117                            MacroDefinitionRecord *MD) override {
118     if (Previous)
119       Previous->MacroDefinitionRead(PPID, MD);
120   }
ModuleRead(serialization::SubmoduleID ID,Module * Mod)121   void ModuleRead(serialization::SubmoduleID ID, Module *Mod) override {
122     if (Previous)
123       Previous->ModuleRead(ID, Mod);
124   }
ModuleImportRead(serialization::SubmoduleID ID,SourceLocation ImportLoc)125   void ModuleImportRead(serialization::SubmoduleID ID,
126                         SourceLocation ImportLoc) override {
127     if (Previous)
128       Previous->ModuleImportRead(ID, ImportLoc);
129   }
130 };
131 
132 } // namespace clang
133 
134 #endif
135