1*f4a2713aSLionel Sambuc //===--- MultiplexExternalSemaSource.cpp ---------------------------------===// 2*f4a2713aSLionel Sambuc // 3*f4a2713aSLionel Sambuc // The LLVM Compiler Infrastructure 4*f4a2713aSLionel Sambuc // 5*f4a2713aSLionel Sambuc // This file is distributed under the University of Illinois Open Source 6*f4a2713aSLionel Sambuc // License. See LICENSE.TXT for details. 7*f4a2713aSLionel Sambuc // 8*f4a2713aSLionel Sambuc //===----------------------------------------------------------------------===// 9*f4a2713aSLionel Sambuc // 10*f4a2713aSLionel Sambuc // This file implements the event dispatching to the subscribed clients. 11*f4a2713aSLionel Sambuc // 12*f4a2713aSLionel Sambuc //===----------------------------------------------------------------------===// 13*f4a2713aSLionel Sambuc #include "clang/Sema/MultiplexExternalSemaSource.h" 14*f4a2713aSLionel Sambuc #include "clang/AST/DeclContextInternals.h" 15*f4a2713aSLionel Sambuc #include "clang/Sema/Lookup.h" 16*f4a2713aSLionel Sambuc 17*f4a2713aSLionel Sambuc using namespace clang; 18*f4a2713aSLionel Sambuc 19*f4a2713aSLionel Sambuc ///\brief Constructs a new multiplexing external sema source and appends the 20*f4a2713aSLionel Sambuc /// given element to it. 21*f4a2713aSLionel Sambuc /// 22*f4a2713aSLionel Sambuc ///\param[in] source - An ExternalSemaSource. 23*f4a2713aSLionel Sambuc /// 24*f4a2713aSLionel Sambuc MultiplexExternalSemaSource::MultiplexExternalSemaSource(ExternalSemaSource &s1, 25*f4a2713aSLionel Sambuc ExternalSemaSource &s2){ 26*f4a2713aSLionel Sambuc Sources.push_back(&s1); 27*f4a2713aSLionel Sambuc Sources.push_back(&s2); 28*f4a2713aSLionel Sambuc } 29*f4a2713aSLionel Sambuc 30*f4a2713aSLionel Sambuc // pin the vtable here. 31*f4a2713aSLionel Sambuc MultiplexExternalSemaSource::~MultiplexExternalSemaSource() {} 32*f4a2713aSLionel Sambuc 33*f4a2713aSLionel Sambuc ///\brief Appends new source to the source list. 34*f4a2713aSLionel Sambuc /// 35*f4a2713aSLionel Sambuc ///\param[in] source - An ExternalSemaSource. 36*f4a2713aSLionel Sambuc /// 37*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::addSource(ExternalSemaSource &source) { 38*f4a2713aSLionel Sambuc Sources.push_back(&source); 39*f4a2713aSLionel Sambuc } 40*f4a2713aSLionel Sambuc 41*f4a2713aSLionel Sambuc //===----------------------------------------------------------------------===// 42*f4a2713aSLionel Sambuc // ExternalASTSource. 43*f4a2713aSLionel Sambuc //===----------------------------------------------------------------------===// 44*f4a2713aSLionel Sambuc 45*f4a2713aSLionel Sambuc Decl *MultiplexExternalSemaSource::GetExternalDecl(uint32_t ID) { 46*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 47*f4a2713aSLionel Sambuc if (Decl *Result = Sources[i]->GetExternalDecl(ID)) 48*f4a2713aSLionel Sambuc return Result; 49*f4a2713aSLionel Sambuc return 0; 50*f4a2713aSLionel Sambuc } 51*f4a2713aSLionel Sambuc 52*f4a2713aSLionel Sambuc Selector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) { 53*f4a2713aSLionel Sambuc Selector Sel; 54*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) { 55*f4a2713aSLionel Sambuc Sel = Sources[i]->GetExternalSelector(ID); 56*f4a2713aSLionel Sambuc if (!Sel.isNull()) 57*f4a2713aSLionel Sambuc return Sel; 58*f4a2713aSLionel Sambuc } 59*f4a2713aSLionel Sambuc return Sel; 60*f4a2713aSLionel Sambuc } 61*f4a2713aSLionel Sambuc 62*f4a2713aSLionel Sambuc uint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() { 63*f4a2713aSLionel Sambuc uint32_t total = 0; 64*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 65*f4a2713aSLionel Sambuc total += Sources[i]->GetNumExternalSelectors(); 66*f4a2713aSLionel Sambuc return total; 67*f4a2713aSLionel Sambuc } 68*f4a2713aSLionel Sambuc 69*f4a2713aSLionel Sambuc Stmt *MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset) { 70*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 71*f4a2713aSLionel Sambuc if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset)) 72*f4a2713aSLionel Sambuc return Result; 73*f4a2713aSLionel Sambuc return 0; 74*f4a2713aSLionel Sambuc } 75*f4a2713aSLionel Sambuc 76*f4a2713aSLionel Sambuc CXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers( 77*f4a2713aSLionel Sambuc uint64_t Offset){ 78*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 79*f4a2713aSLionel Sambuc if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset)) 80*f4a2713aSLionel Sambuc return R; 81*f4a2713aSLionel Sambuc return 0; 82*f4a2713aSLionel Sambuc } 83*f4a2713aSLionel Sambuc 84*f4a2713aSLionel Sambuc bool MultiplexExternalSemaSource:: 85*f4a2713aSLionel Sambuc FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) { 86*f4a2713aSLionel Sambuc bool AnyDeclsFound = false; 87*f4a2713aSLionel Sambuc for (size_t i = 0; i < Sources.size(); ++i) 88*f4a2713aSLionel Sambuc AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name); 89*f4a2713aSLionel Sambuc return AnyDeclsFound; 90*f4a2713aSLionel Sambuc } 91*f4a2713aSLionel Sambuc 92*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){ 93*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 94*f4a2713aSLionel Sambuc Sources[i]->completeVisibleDeclsMap(DC); 95*f4a2713aSLionel Sambuc } 96*f4a2713aSLionel Sambuc 97*f4a2713aSLionel Sambuc ExternalLoadResult MultiplexExternalSemaSource:: 98*f4a2713aSLionel Sambuc FindExternalLexicalDecls(const DeclContext *DC, 99*f4a2713aSLionel Sambuc bool (*isKindWeWant)(Decl::Kind), 100*f4a2713aSLionel Sambuc SmallVectorImpl<Decl*> &Result) { 101*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 102*f4a2713aSLionel Sambuc // FIXME: The semantics of the return result is unclear to me... 103*f4a2713aSLionel Sambuc Sources[i]->FindExternalLexicalDecls(DC, isKindWeWant, Result); 104*f4a2713aSLionel Sambuc 105*f4a2713aSLionel Sambuc return ELR_Success; 106*f4a2713aSLionel Sambuc } 107*f4a2713aSLionel Sambuc 108*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::FindFileRegionDecls(FileID File, 109*f4a2713aSLionel Sambuc unsigned Offset, 110*f4a2713aSLionel Sambuc unsigned Length, 111*f4a2713aSLionel Sambuc SmallVectorImpl<Decl *> &Decls){ 112*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 113*f4a2713aSLionel Sambuc Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls); 114*f4a2713aSLionel Sambuc } 115*f4a2713aSLionel Sambuc 116*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::CompleteType(TagDecl *Tag) { 117*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 118*f4a2713aSLionel Sambuc Sources[i]->CompleteType(Tag); 119*f4a2713aSLionel Sambuc } 120*f4a2713aSLionel Sambuc 121*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::CompleteType(ObjCInterfaceDecl *Class) { 122*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 123*f4a2713aSLionel Sambuc Sources[i]->CompleteType(Class); 124*f4a2713aSLionel Sambuc } 125*f4a2713aSLionel Sambuc 126*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadComments() { 127*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 128*f4a2713aSLionel Sambuc Sources[i]->ReadComments(); 129*f4a2713aSLionel Sambuc } 130*f4a2713aSLionel Sambuc 131*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::StartedDeserializing() { 132*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 133*f4a2713aSLionel Sambuc Sources[i]->StartedDeserializing(); 134*f4a2713aSLionel Sambuc } 135*f4a2713aSLionel Sambuc 136*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::FinishedDeserializing() { 137*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 138*f4a2713aSLionel Sambuc Sources[i]->FinishedDeserializing(); 139*f4a2713aSLionel Sambuc } 140*f4a2713aSLionel Sambuc 141*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::StartTranslationUnit(ASTConsumer *Consumer) { 142*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 143*f4a2713aSLionel Sambuc Sources[i]->StartTranslationUnit(Consumer); 144*f4a2713aSLionel Sambuc } 145*f4a2713aSLionel Sambuc 146*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::PrintStats() { 147*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 148*f4a2713aSLionel Sambuc Sources[i]->PrintStats(); 149*f4a2713aSLionel Sambuc } 150*f4a2713aSLionel Sambuc 151*f4a2713aSLionel Sambuc bool MultiplexExternalSemaSource::layoutRecordType(const RecordDecl *Record, 152*f4a2713aSLionel Sambuc uint64_t &Size, 153*f4a2713aSLionel Sambuc uint64_t &Alignment, 154*f4a2713aSLionel Sambuc llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets, 155*f4a2713aSLionel Sambuc llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets, 156*f4a2713aSLionel Sambuc llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets){ 157*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 158*f4a2713aSLionel Sambuc if (Sources[i]->layoutRecordType(Record, Size, Alignment, FieldOffsets, 159*f4a2713aSLionel Sambuc BaseOffsets, VirtualBaseOffsets)) 160*f4a2713aSLionel Sambuc return true; 161*f4a2713aSLionel Sambuc return false; 162*f4a2713aSLionel Sambuc } 163*f4a2713aSLionel Sambuc 164*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource:: 165*f4a2713aSLionel Sambuc getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 166*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 167*f4a2713aSLionel Sambuc Sources[i]->getMemoryBufferSizes(sizes); 168*f4a2713aSLionel Sambuc 169*f4a2713aSLionel Sambuc } 170*f4a2713aSLionel Sambuc 171*f4a2713aSLionel Sambuc //===----------------------------------------------------------------------===// 172*f4a2713aSLionel Sambuc // ExternalSemaSource. 173*f4a2713aSLionel Sambuc //===----------------------------------------------------------------------===// 174*f4a2713aSLionel Sambuc 175*f4a2713aSLionel Sambuc 176*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::InitializeSema(Sema &S) { 177*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 178*f4a2713aSLionel Sambuc Sources[i]->InitializeSema(S); 179*f4a2713aSLionel Sambuc } 180*f4a2713aSLionel Sambuc 181*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ForgetSema() { 182*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 183*f4a2713aSLionel Sambuc Sources[i]->ForgetSema(); 184*f4a2713aSLionel Sambuc } 185*f4a2713aSLionel Sambuc 186*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadMethodPool(Selector Sel) { 187*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 188*f4a2713aSLionel Sambuc Sources[i]->ReadMethodPool(Sel); 189*f4a2713aSLionel Sambuc } 190*f4a2713aSLionel Sambuc 191*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadKnownNamespaces( 192*f4a2713aSLionel Sambuc SmallVectorImpl<NamespaceDecl*> &Namespaces){ 193*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 194*f4a2713aSLionel Sambuc Sources[i]->ReadKnownNamespaces(Namespaces); 195*f4a2713aSLionel Sambuc } 196*f4a2713aSLionel Sambuc 197*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadUndefinedButUsed( 198*f4a2713aSLionel Sambuc llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined){ 199*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 200*f4a2713aSLionel Sambuc Sources[i]->ReadUndefinedButUsed(Undefined); 201*f4a2713aSLionel Sambuc } 202*f4a2713aSLionel Sambuc 203*f4a2713aSLionel Sambuc bool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){ 204*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 205*f4a2713aSLionel Sambuc Sources[i]->LookupUnqualified(R, S); 206*f4a2713aSLionel Sambuc 207*f4a2713aSLionel Sambuc return !R.empty(); 208*f4a2713aSLionel Sambuc } 209*f4a2713aSLionel Sambuc 210*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadTentativeDefinitions( 211*f4a2713aSLionel Sambuc SmallVectorImpl<VarDecl*> &TentativeDefs) { 212*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 213*f4a2713aSLionel Sambuc Sources[i]->ReadTentativeDefinitions(TentativeDefs); 214*f4a2713aSLionel Sambuc } 215*f4a2713aSLionel Sambuc 216*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadUnusedFileScopedDecls( 217*f4a2713aSLionel Sambuc SmallVectorImpl<const DeclaratorDecl*> &Decls) { 218*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 219*f4a2713aSLionel Sambuc Sources[i]->ReadUnusedFileScopedDecls(Decls); 220*f4a2713aSLionel Sambuc } 221*f4a2713aSLionel Sambuc 222*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadDelegatingConstructors( 223*f4a2713aSLionel Sambuc SmallVectorImpl<CXXConstructorDecl*> &Decls) { 224*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 225*f4a2713aSLionel Sambuc Sources[i]->ReadDelegatingConstructors(Decls); 226*f4a2713aSLionel Sambuc } 227*f4a2713aSLionel Sambuc 228*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadExtVectorDecls( 229*f4a2713aSLionel Sambuc SmallVectorImpl<TypedefNameDecl*> &Decls) { 230*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 231*f4a2713aSLionel Sambuc Sources[i]->ReadExtVectorDecls(Decls); 232*f4a2713aSLionel Sambuc } 233*f4a2713aSLionel Sambuc 234*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadDynamicClasses( 235*f4a2713aSLionel Sambuc SmallVectorImpl<CXXRecordDecl*> &Decls) { 236*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 237*f4a2713aSLionel Sambuc Sources[i]->ReadDynamicClasses(Decls); 238*f4a2713aSLionel Sambuc } 239*f4a2713aSLionel Sambuc 240*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadLocallyScopedExternCDecls( 241*f4a2713aSLionel Sambuc SmallVectorImpl<NamedDecl*> &Decls) { 242*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 243*f4a2713aSLionel Sambuc Sources[i]->ReadLocallyScopedExternCDecls(Decls); 244*f4a2713aSLionel Sambuc } 245*f4a2713aSLionel Sambuc 246*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadReferencedSelectors( 247*f4a2713aSLionel Sambuc SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) { 248*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 249*f4a2713aSLionel Sambuc Sources[i]->ReadReferencedSelectors(Sels); 250*f4a2713aSLionel Sambuc } 251*f4a2713aSLionel Sambuc 252*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers( 253*f4a2713aSLionel Sambuc SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) { 254*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 255*f4a2713aSLionel Sambuc Sources[i]->ReadWeakUndeclaredIdentifiers(WI); 256*f4a2713aSLionel Sambuc } 257*f4a2713aSLionel Sambuc 258*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadUsedVTables( 259*f4a2713aSLionel Sambuc SmallVectorImpl<ExternalVTableUse> &VTables) { 260*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 261*f4a2713aSLionel Sambuc Sources[i]->ReadUsedVTables(VTables); 262*f4a2713aSLionel Sambuc } 263*f4a2713aSLionel Sambuc 264*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadPendingInstantiations( 265*f4a2713aSLionel Sambuc SmallVectorImpl<std::pair<ValueDecl*, 266*f4a2713aSLionel Sambuc SourceLocation> > &Pending) { 267*f4a2713aSLionel Sambuc for(size_t i = 0; i < Sources.size(); ++i) 268*f4a2713aSLionel Sambuc Sources[i]->ReadPendingInstantiations(Pending); 269*f4a2713aSLionel Sambuc } 270*f4a2713aSLionel Sambuc 271*f4a2713aSLionel Sambuc void MultiplexExternalSemaSource::ReadLateParsedTemplates( 272*f4a2713aSLionel Sambuc llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) { 273*f4a2713aSLionel Sambuc for (size_t i = 0; i < Sources.size(); ++i) 274*f4a2713aSLionel Sambuc Sources[i]->ReadLateParsedTemplates(LPTMap); 275*f4a2713aSLionel Sambuc } 276*f4a2713aSLionel Sambuc 277*f4a2713aSLionel Sambuc TypoCorrection MultiplexExternalSemaSource::CorrectTypo( 278*f4a2713aSLionel Sambuc const DeclarationNameInfo &Typo, 279*f4a2713aSLionel Sambuc int LookupKind, Scope *S, CXXScopeSpec *SS, 280*f4a2713aSLionel Sambuc CorrectionCandidateCallback &CCC, 281*f4a2713aSLionel Sambuc DeclContext *MemberContext, 282*f4a2713aSLionel Sambuc bool EnteringContext, 283*f4a2713aSLionel Sambuc const ObjCObjectPointerType *OPT) { 284*f4a2713aSLionel Sambuc for (size_t I = 0, E = Sources.size(); I < E; ++I) { 285*f4a2713aSLionel Sambuc if (TypoCorrection C = Sources[I]->CorrectTypo(Typo, LookupKind, S, SS, CCC, 286*f4a2713aSLionel Sambuc MemberContext, 287*f4a2713aSLionel Sambuc EnteringContext, OPT)) 288*f4a2713aSLionel Sambuc return C; 289*f4a2713aSLionel Sambuc } 290*f4a2713aSLionel Sambuc return TypoCorrection(); 291*f4a2713aSLionel Sambuc } 292*f4a2713aSLionel Sambuc 293*f4a2713aSLionel Sambuc bool MultiplexExternalSemaSource::MaybeDiagnoseMissingCompleteType( 294*f4a2713aSLionel Sambuc SourceLocation Loc, QualType T) { 295*f4a2713aSLionel Sambuc for (size_t I = 0, E = Sources.size(); I < E; ++I) { 296*f4a2713aSLionel Sambuc if (Sources[I]->MaybeDiagnoseMissingCompleteType(Loc, T)) 297*f4a2713aSLionel Sambuc return true; 298*f4a2713aSLionel Sambuc } 299*f4a2713aSLionel Sambuc return false; 300*f4a2713aSLionel Sambuc } 301