void StoredDeclsList::materializeDecls(ASTContext &Context) { if (isNull()) return; switch ((DataKind)(Data & 0x03)) { case DK_Decl: case DK_Decl_Vector: break; case DK_DeclID: { // Resolve this declaration ID to an actual declaration by // querying the external AST source. unsigned DeclID = Data >> 2; ExternalASTSource *Source = Context.getExternalSource(); assert(Source && "No external AST source available!"); Data = reinterpret_cast<uintptr_t>(Source->GetDecl(DeclID)); break; } case DK_ID_Vector: { // We have a vector of declaration IDs. Resolve all of them to // actual declarations. VectorTy &Vector = *getAsVector(); ExternalASTSource *Source = Context.getExternalSource(); assert(Source && "No external AST source available!"); for (unsigned I = 0, N = Vector.size(); I != N; ++I) Vector[I] = reinterpret_cast<uintptr_t>(Source->GetDecl(Vector[I])); Data = (Data & ~0x03) | DK_Decl_Vector; break; } } }
/// \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?"); llvm::SmallVector<uint32_t, 64> Decls; if (Source->ReadDeclsLexicallyInContext(const_cast<DeclContext *>(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 = Source->GetDecl(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; }