/// \brief Load the declarations within this lexical storage from an /// external source. void DeclContext::LoadLexicalDeclsFromExternalStorage() const { ExternalASTSource *Source = getParentASTContext().getExternalSource(); assert(hasExternalLexicalStorage() && Source && "No external storage?"); // Notify that we have a DeclContext that is initializing. ExternalASTSource::Deserializing ADeclContext(Source); llvm::SmallVector<Decl*, 64> Decls; if (Source->FindExternalLexicalDecls(this, Decls)) return; // There is no longer any lexical storage in this context ExternalLexicalStorage = false; if (Decls.empty()) return; // We may have already loaded just the fields of this record, in which case // don't add the decls, just replace the FirstDecl/LastDecl chain. if (const RecordDecl *RD = dyn_cast<RecordDecl>(this)) if (RD->LoadedFieldsFromExternalStorage) { llvm::tie(FirstDecl, LastDecl) = BuildDeclChain(Decls); return; } // Splice the newly-read declarations into the beginning of the list // of declarations. Decl *ExternalFirst, *ExternalLast; llvm::tie(ExternalFirst, ExternalLast) = BuildDeclChain(Decls); ExternalLast->NextDeclInContext = FirstDecl; FirstDecl = ExternalFirst; if (!LastDecl) LastDecl = ExternalLast; }
/// \brief Load the declarations within this lexical storage from an /// external source. void DeclContext::LoadLexicalDeclsFromExternalStorage() const { ExternalASTSource *Source = getParentASTContext().getExternalSource(); assert(hasExternalLexicalStorage() && Source && "No external storage?"); // Notify that we have a DeclContext that is initializing. ExternalASTSource::Deserializing ADeclContext(Source); llvm::SmallVector<Decl*, 64> Decls; if (Source->FindExternalLexicalDecls(this, Decls)) return; // There is no longer any lexical storage in this context ExternalLexicalStorage = false; if (Decls.empty()) return; // Resolve all of the declaration IDs into declarations, building up // a chain of declarations via the Decl::NextDeclInContext field. Decl *FirstNewDecl = 0; Decl *PrevDecl = 0; for (unsigned I = 0, N = Decls.size(); I != N; ++I) { Decl *D = Decls[I]; if (PrevDecl) PrevDecl->NextDeclInContext = D; else FirstNewDecl = D; PrevDecl = D; } // Splice the newly-read declarations into the beginning of the list // of declarations. PrevDecl->NextDeclInContext = FirstDecl; FirstDecl = FirstNewDecl; if (!LastDecl) LastDecl = PrevDecl; }
/// \brief Load the declarations within this lexical storage from an /// external source. void DeclContext::LoadLexicalDeclsFromExternalStorage() const { ExternalASTSource *Source = getParentASTContext().getExternalSource(); assert(hasExternalLexicalStorage() && Source && "No external storage?"); // Notify that we have a DeclContext that is initializing. ExternalASTSource::Deserializing ADeclContext(Source); // Load the external declarations, if any. SmallVector<Decl*, 64> Decls; ExternalLexicalStorage = false; switch (Source->FindExternalLexicalDecls(this, Decls)) { case ELR_Success: break; case ELR_Failure: case ELR_AlreadyLoaded: return; } if (Decls.empty()) return; // We may have already loaded just the fields of this record, in which case // we need to ignore them. bool FieldsAlreadyLoaded = false; if (const RecordDecl *RD = dyn_cast<RecordDecl>(this)) FieldsAlreadyLoaded = RD->LoadedFieldsFromExternalStorage; // Splice the newly-read declarations into the beginning of the list // of declarations. Decl *ExternalFirst, *ExternalLast; llvm::tie(ExternalFirst, ExternalLast) = BuildDeclChain(Decls, FieldsAlreadyLoaded); ExternalLast->NextInContextAndBits.setPointer(FirstDecl); FirstDecl = ExternalFirst; if (!LastDecl) LastDecl = ExternalLast; }