clang API Documentation
00001 //===- MultiplexConsumer.cpp - AST Consumer for PCH Generation --*- C++ -*-===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This file defines the MultiplexConsumer class. It also declares and defines 00011 // MultiplexASTDeserializationListener and MultiplexASTMutationListener, which 00012 // are implementation details of MultiplexConsumer. 00013 // 00014 //===----------------------------------------------------------------------===// 00015 00016 #include "clang/Frontend/MultiplexConsumer.h" 00017 00018 #include "clang/AST/ASTMutationListener.h" 00019 #include "clang/AST/DeclGroup.h" 00020 #include "clang/Serialization/ASTDeserializationListener.h" 00021 00022 using namespace clang; 00023 00024 namespace clang { 00025 00026 // This ASTDeserializationListener forwards its notifications to a set of 00027 // child listeners. 00028 class MultiplexASTDeserializationListener 00029 : public ASTDeserializationListener { 00030 public: 00031 // Does NOT take ownership of the elements in L. 00032 MultiplexASTDeserializationListener( 00033 const std::vector<ASTDeserializationListener*>& L); 00034 virtual void ReaderInitialized(ASTReader *Reader); 00035 virtual void IdentifierRead(serialization::IdentID ID, 00036 IdentifierInfo *II); 00037 virtual void TypeRead(serialization::TypeIdx Idx, QualType T); 00038 virtual void DeclRead(serialization::DeclID ID, const Decl *D); 00039 virtual void SelectorRead(serialization::SelectorID iD, Selector Sel); 00040 virtual void MacroDefinitionRead(serialization::PreprocessedEntityID, 00041 MacroDefinition *MD); 00042 private: 00043 std::vector<ASTDeserializationListener*> Listeners; 00044 }; 00045 00046 MultiplexASTDeserializationListener::MultiplexASTDeserializationListener( 00047 const std::vector<ASTDeserializationListener*>& L) 00048 : Listeners(L) { 00049 } 00050 00051 void MultiplexASTDeserializationListener::ReaderInitialized( 00052 ASTReader *Reader) { 00053 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00054 Listeners[i]->ReaderInitialized(Reader); 00055 } 00056 00057 void MultiplexASTDeserializationListener::IdentifierRead( 00058 serialization::IdentID ID, IdentifierInfo *II) { 00059 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00060 Listeners[i]->IdentifierRead(ID, II); 00061 } 00062 00063 void MultiplexASTDeserializationListener::TypeRead( 00064 serialization::TypeIdx Idx, QualType T) { 00065 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00066 Listeners[i]->TypeRead(Idx, T); 00067 } 00068 00069 void MultiplexASTDeserializationListener::DeclRead( 00070 serialization::DeclID ID, const Decl *D) { 00071 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00072 Listeners[i]->DeclRead(ID, D); 00073 } 00074 00075 void MultiplexASTDeserializationListener::SelectorRead( 00076 serialization::SelectorID ID, Selector Sel) { 00077 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00078 Listeners[i]->SelectorRead(ID, Sel); 00079 } 00080 00081 void MultiplexASTDeserializationListener::MacroDefinitionRead( 00082 serialization::PreprocessedEntityID ID, MacroDefinition *MD) { 00083 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00084 Listeners[i]->MacroDefinitionRead(ID, MD); 00085 } 00086 00087 // This ASTMutationListener forwards its notifications to a set of 00088 // child listeners. 00089 class MultiplexASTMutationListener : public ASTMutationListener { 00090 public: 00091 // Does NOT take ownership of the elements in L. 00092 MultiplexASTMutationListener(ArrayRef<ASTMutationListener*> L); 00093 virtual void CompletedTagDefinition(const TagDecl *D); 00094 virtual void AddedVisibleDecl(const DeclContext *DC, const Decl *D); 00095 virtual void AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D); 00096 virtual void AddedCXXTemplateSpecialization(const ClassTemplateDecl *TD, 00097 const ClassTemplateSpecializationDecl *D); 00098 virtual void AddedCXXTemplateSpecialization(const FunctionTemplateDecl *TD, 00099 const FunctionDecl *D); 00100 virtual void CompletedImplicitDefinition(const FunctionDecl *D); 00101 virtual void StaticDataMemberInstantiated(const VarDecl *D); 00102 virtual void AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD, 00103 const ObjCInterfaceDecl *IFD); 00104 virtual void AddedObjCPropertyInClassExtension(const ObjCPropertyDecl *Prop, 00105 const ObjCPropertyDecl *OrigProp, 00106 const ObjCCategoryDecl *ClassExt); 00107 private: 00108 std::vector<ASTMutationListener*> Listeners; 00109 }; 00110 00111 MultiplexASTMutationListener::MultiplexASTMutationListener( 00112 ArrayRef<ASTMutationListener*> L) 00113 : Listeners(L.begin(), L.end()) { 00114 } 00115 00116 void MultiplexASTMutationListener::CompletedTagDefinition(const TagDecl *D) { 00117 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00118 Listeners[i]->CompletedTagDefinition(D); 00119 } 00120 00121 void MultiplexASTMutationListener::AddedVisibleDecl( 00122 const DeclContext *DC, const Decl *D) { 00123 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00124 Listeners[i]->AddedVisibleDecl(DC, D); 00125 } 00126 00127 void MultiplexASTMutationListener::AddedCXXImplicitMember( 00128 const CXXRecordDecl *RD, const Decl *D) { 00129 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00130 Listeners[i]->AddedCXXImplicitMember(RD, D); 00131 } 00132 void MultiplexASTMutationListener::AddedCXXTemplateSpecialization( 00133 const ClassTemplateDecl *TD, const ClassTemplateSpecializationDecl *D) { 00134 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00135 Listeners[i]->AddedCXXTemplateSpecialization(TD, D); 00136 } 00137 void MultiplexASTMutationListener::AddedCXXTemplateSpecialization( 00138 const FunctionTemplateDecl *TD, const FunctionDecl *D) { 00139 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00140 Listeners[i]->AddedCXXTemplateSpecialization(TD, D); 00141 } 00142 void MultiplexASTMutationListener::CompletedImplicitDefinition( 00143 const FunctionDecl *D) { 00144 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00145 Listeners[i]->CompletedImplicitDefinition(D); 00146 } 00147 void MultiplexASTMutationListener::StaticDataMemberInstantiated( 00148 const VarDecl *D) { 00149 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00150 Listeners[i]->StaticDataMemberInstantiated(D); 00151 } 00152 void MultiplexASTMutationListener::AddedObjCCategoryToInterface( 00153 const ObjCCategoryDecl *CatD, 00154 const ObjCInterfaceDecl *IFD) { 00155 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00156 Listeners[i]->AddedObjCCategoryToInterface(CatD, IFD); 00157 } 00158 void MultiplexASTMutationListener::AddedObjCPropertyInClassExtension( 00159 const ObjCPropertyDecl *Prop, 00160 const ObjCPropertyDecl *OrigProp, 00161 const ObjCCategoryDecl *ClassExt) { 00162 for (size_t i = 0, e = Listeners.size(); i != e; ++i) 00163 Listeners[i]->AddedObjCPropertyInClassExtension(Prop, OrigProp, ClassExt); 00164 } 00165 00166 } // end namespace clang 00167 00168 00169 MultiplexConsumer::MultiplexConsumer(ArrayRef<ASTConsumer*> C) 00170 : Consumers(C.begin(), C.end()), 00171 MutationListener(0), DeserializationListener(0) { 00172 // Collect the mutation listeners and deserialization listeners of all 00173 // children, and create a multiplex listener each if so. 00174 std::vector<ASTMutationListener*> mutationListeners; 00175 std::vector<ASTDeserializationListener*> serializationListeners; 00176 for (size_t i = 0, e = Consumers.size(); i != e; ++i) { 00177 ASTMutationListener* mutationListener = 00178 Consumers[i]->GetASTMutationListener(); 00179 if (mutationListener) 00180 mutationListeners.push_back(mutationListener); 00181 ASTDeserializationListener* serializationListener = 00182 Consumers[i]->GetASTDeserializationListener(); 00183 if (serializationListener) 00184 serializationListeners.push_back(serializationListener); 00185 } 00186 if (mutationListeners.size()) { 00187 MutationListener.reset(new MultiplexASTMutationListener(mutationListeners)); 00188 } 00189 if (serializationListeners.size()) { 00190 DeserializationListener.reset( 00191 new MultiplexASTDeserializationListener(serializationListeners)); 00192 } 00193 } 00194 00195 MultiplexConsumer::~MultiplexConsumer() { 00196 for (size_t i = 0, e = Consumers.size(); i != e; ++i) 00197 delete Consumers[i]; 00198 } 00199 00200 void MultiplexConsumer::Initialize(ASTContext &Context) { 00201 for (size_t i = 0, e = Consumers.size(); i != e; ++i) 00202 Consumers[i]->Initialize(Context); 00203 } 00204 00205 bool MultiplexConsumer::HandleTopLevelDecl(DeclGroupRef D) { 00206 bool Continue = true; 00207 for (size_t i = 0, e = Consumers.size(); i != e; ++i) 00208 Continue = Continue && Consumers[i]->HandleTopLevelDecl(D); 00209 return Continue; 00210 } 00211 00212 void MultiplexConsumer::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) { 00213 for (size_t i = 0, e = Consumers.size(); i != e; ++i) 00214 Consumers[i]->HandleCXXStaticMemberVarInstantiation(VD); 00215 } 00216 00217 void MultiplexConsumer::HandleInterestingDecl(DeclGroupRef D) { 00218 for (size_t i = 0, e = Consumers.size(); i != e; ++i) 00219 Consumers[i]->HandleInterestingDecl(D); 00220 } 00221 00222 void MultiplexConsumer::HandleTranslationUnit(ASTContext &Ctx) { 00223 for (size_t i = 0, e = Consumers.size(); i != e; ++i) 00224 Consumers[i]->HandleTranslationUnit(Ctx); 00225 } 00226 00227 void MultiplexConsumer::HandleTagDeclDefinition(TagDecl *D) { 00228 for (size_t i = 0, e = Consumers.size(); i != e; ++i) 00229 Consumers[i]->HandleTagDeclDefinition(D); 00230 } 00231 00232 void MultiplexConsumer::HandleCXXImplicitFunctionInstantiation(FunctionDecl *D){ 00233 for (size_t i = 0, e = Consumers.size(); i != e; ++i) 00234 Consumers[i]->HandleCXXImplicitFunctionInstantiation(D); 00235 } 00236 00237 void MultiplexConsumer::HandleTopLevelDeclInObjCContainer(DeclGroupRef D) { 00238 for (size_t i = 0, e = Consumers.size(); i != e; ++i) 00239 Consumers[i]->HandleTopLevelDeclInObjCContainer(D); 00240 } 00241 00242 void MultiplexConsumer::CompleteTentativeDefinition(VarDecl *D) { 00243 for (size_t i = 0, e = Consumers.size(); i != e; ++i) 00244 Consumers[i]->CompleteTentativeDefinition(D); 00245 } 00246 00247 void MultiplexConsumer::HandleVTable( 00248 CXXRecordDecl *RD, bool DefinitionRequired) { 00249 for (size_t i = 0, e = Consumers.size(); i != e; ++i) 00250 Consumers[i]->HandleVTable(RD, DefinitionRequired); 00251 } 00252 00253 ASTMutationListener *MultiplexConsumer::GetASTMutationListener() { 00254 return MutationListener.get(); 00255 } 00256 00257 ASTDeserializationListener *MultiplexConsumer::GetASTDeserializationListener() { 00258 return DeserializationListener.get(); 00259 } 00260 00261 void MultiplexConsumer::PrintStats() { 00262 for (size_t i = 0, e = Consumers.size(); i != e; ++i) 00263 Consumers[i]->PrintStats(); 00264 } 00265 00266 void MultiplexConsumer::InitializeSema(Sema &S) { 00267 for (size_t i = 0, e = Consumers.size(); i != e; ++i) 00268 if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumers[i])) 00269 SC->InitializeSema(S); 00270 } 00271 00272 void MultiplexConsumer::ForgetSema() { 00273 for (size_t i = 0, e = Consumers.size(); i != e; ++i) 00274 if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumers[i])) 00275 SC->ForgetSema(); 00276 }