diff options
Diffstat (limited to 'clang/include/clang')
-rw-r--r-- | clang/include/clang/AST/DeclBase.h | 2 | ||||
-rw-r--r-- | clang/include/clang/AST/ExternalASTSource.h | 103 | ||||
-rw-r--r-- | clang/include/clang/Frontend/PCHReader.h | 45 | ||||
-rw-r--r-- | clang/include/clang/Sema/ExternalSemaSource.h | 2 |
4 files changed, 82 insertions, 70 deletions
diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h index 453c8597bf4..3e2435197d2 100644 --- a/clang/include/clang/AST/DeclBase.h +++ b/clang/include/clang/AST/DeclBase.h @@ -632,6 +632,8 @@ class DeclContext { /// another pointer. mutable Decl *LastDecl; + friend class ExternalASTSource; + protected: DeclContext(Decl::Kind K) : DeclKind(K), ExternalLexicalStorage(false), diff --git a/clang/include/clang/AST/ExternalASTSource.h b/clang/include/clang/AST/ExternalASTSource.h index 79e44511d32..def9ced94c2 100644 --- a/clang/include/clang/AST/ExternalASTSource.h +++ b/clang/include/clang/AST/ExternalASTSource.h @@ -58,67 +58,85 @@ public: virtual ~ExternalASTSource(); - /// \brief Resolve a type ID into a type, potentially building a new - /// type. - virtual QualType GetType(uint32_t ID) = 0; - /// \brief Resolve a declaration ID into a declaration, potentially /// building a new declaration. - virtual Decl *GetDecl(uint32_t ID) = 0; + /// + /// This method only needs to be implemented if the AST source ever + /// passes back decl sets as VisibleDeclaration objects. + virtual Decl *GetExternalDecl(uint32_t ID) = 0; /// \brief Resolve a selector ID into a selector. - virtual Selector GetSelector(uint32_t ID) = 0; + /// + /// This operation only needs to be implemented if the AST source + /// returns non-zero for GetNumKnownSelectors(). + virtual Selector GetExternalSelector(uint32_t ID) = 0; /// \brief Returns the number of selectors known to the external AST /// source. - virtual uint32_t GetNumKnownSelectors() = 0; + virtual uint32_t GetNumExternalSelectors() = 0; - /// \brief Resolve the offset of a statement in the decl stream into a - /// statement. + /// \brief Resolve the offset of a statement in the decl stream into + /// a statement. /// - /// This operation will read a new statement from the external - /// source each time it is called, and is meant to be used via a - /// LazyOffsetPtr. - virtual Stmt *GetDeclStmt(uint64_t Offset) = 0; + /// This operation is meant to be used via a LazyOffsetPtr. It only + /// needs to be implemented if the AST source uses methods like + /// FunctionDecl::setLazyBody when building decls. + virtual Stmt *GetExternalDeclStmt(uint64_t Offset) = 0; - /// \brief Read all of the declarations lexically stored in a - /// declaration context. + /// \brief Finds all declarations with the given name in the + /// given context. /// - /// \param DC The declaration context whose declarations will be - /// read. + /// Generally the final step of this method is either to call + /// SetExternalVisibleDeclsForName or to recursively call lookup on + /// the DeclContext after calling SetExternalVisibleDecls. + virtual DeclContext::lookup_result + FindExternalVisibleDeclsByName(const DeclContext *DC, + DeclarationName Name) = 0; + + /// \brief Finds all declarations lexically contained within the given + /// DeclContext. /// - /// \param Decls Vector that will contain the declarations loaded - /// from the external source. The caller is responsible for merging - /// these declarations with any declarations already stored in the - /// declaration context. - /// - /// \returns true if there was an error while reading the - /// declarations for this declaration context. - virtual bool ReadDeclsLexicallyInContext(DeclContext *DC, - llvm::SmallVectorImpl<uint32_t> &Decls) = 0; - - /// \brief Read all of the declarations visible from a declaration - /// context. - /// - /// \param DC The declaration context whose visible declarations - /// will be read. - /// - /// \param Decls A vector of visible declaration structures, - /// providing the mapping from each name visible in the declaration - /// context to the declaration IDs of declarations with that name. - /// - /// \returns true if there was an error while reading the - /// declarations for this declaration context. - virtual bool ReadDeclsVisibleInContext(DeclContext *DC, - llvm::SmallVectorImpl<VisibleDeclaration> & Decls) = 0; + /// \return true if an error occurred + virtual bool FindExternalLexicalDecls(const DeclContext *DC, + llvm::SmallVectorImpl<Decl*> &Result) = 0; /// \brief Function that will be invoked when we begin parsing a new /// translation unit involving this external AST source. + /// + /// The default implementation of this method is a no-op. virtual void StartTranslationUnit(ASTConsumer *Consumer) { } /// \brief Print any statistics that have been gathered regarding /// the external AST source. + /// + /// The default implementation of this method is a no-op. virtual void PrintStats(); + +protected: + /// \brief Initialize the context's lookup map with the given decls. + /// It is assumed that none of the declarations are redeclarations of + /// each other. + static void SetExternalVisibleDecls(const DeclContext *DC, + const llvm::SmallVectorImpl<VisibleDeclaration> &Decls); + + /// \brief Initialize the context's lookup map with the given decls. + /// It is assumed that none of the declarations are redeclarations of + /// each other. + static void SetExternalVisibleDecls(const DeclContext *DC, + const llvm::SmallVectorImpl<NamedDecl*> &Decls); + + static DeclContext::lookup_result + SetExternalVisibleDeclsForName(const DeclContext *DC, + const VisibleDeclaration &VD); + + static DeclContext::lookup_result + SetExternalVisibleDeclsForName(const DeclContext *DC, + DeclarationName Name, + llvm::SmallVectorImpl<NamedDecl*> &Decls); + + static DeclContext::lookup_result + SetNoExternalVisibleDeclsForName(const DeclContext *DC, + DeclarationName Name); }; /// \brief A lazy pointer to an AST node (of base type T) that resides @@ -185,7 +203,8 @@ public: }; /// \brief A lazy pointer to a statement. -typedef LazyOffsetPtr<Stmt, &ExternalASTSource::GetDeclStmt> LazyDeclStmtPtr; +typedef LazyOffsetPtr<Stmt, &ExternalASTSource::GetExternalDeclStmt> + LazyDeclStmtPtr; } // end namespace clang diff --git a/clang/include/clang/Frontend/PCHReader.h b/clang/include/clang/Frontend/PCHReader.h index e144738236e..b6881edce94 100644 --- a/clang/include/clang/Frontend/PCHReader.h +++ b/clang/include/clang/Frontend/PCHReader.h @@ -570,29 +570,37 @@ public: const RecordData &Record, unsigned &Idx); /// \brief Reads a declarator info from the given record. - virtual TypeSourceInfo *GetTypeSourceInfo(const RecordData &Record, - unsigned &Idx); + TypeSourceInfo *GetTypeSourceInfo(const RecordData &Record, + unsigned &Idx); /// \brief Resolve a type ID into a type, potentially building a new /// type. - virtual QualType GetType(pch::TypeID ID); + QualType GetType(pch::TypeID ID); /// \brief Resolve a declaration ID into a declaration, potentially /// building a new declaration. - virtual Decl *GetDecl(pch::DeclID ID); + Decl *GetDecl(pch::DeclID ID); + virtual Decl *GetExternalDecl(uint32_t ID); /// \brief Resolve the offset of a statement into a statement. /// /// This operation will read a new statement from the external /// source each time it is called, and is meant to be used via a /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). - virtual Stmt *GetDeclStmt(uint64_t Offset); + virtual Stmt *GetExternalDeclStmt(uint64_t Offset); /// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the /// specified cursor. Read the abbreviations that are at the top of the block /// and then leave the cursor pointing into the block. bool ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, unsigned BlockID); + /// \brief Finds all the visible declarations with a given name. + /// The current implementation of this method just loads the entire + /// lookup table as unmaterialized references. + virtual DeclContext::lookup_result + FindExternalVisibleDeclsByName(const DeclContext *DC, + DeclarationName Name); + /// \brief Read all of the declarations lexically stored in a /// declaration context. /// @@ -606,27 +614,8 @@ public: /// /// \returns true if there was an error while reading the /// declarations for this declaration context. - virtual bool ReadDeclsLexicallyInContext(DeclContext *DC, - llvm::SmallVectorImpl<pch::DeclID> &Decls); - - /// \brief Read all of the declarations visible from a declaration - /// context. - /// - /// \param DC The declaration context whose visible declarations - /// will be read. - /// - /// \param Decls A vector of visible declaration structures, - /// providing the mapping from each name visible in the declaration - /// context to the declaration IDs of declarations with that name. - /// - /// \returns true if there was an error while reading the - /// declarations for this declaration context. - /// - /// FIXME: Using this intermediate data structure results in an - /// extraneous copying of the data. Could we pass in a reference to - /// the StoredDeclsMap instead? - virtual bool ReadDeclsVisibleInContext(DeclContext *DC, - llvm::SmallVectorImpl<VisibleDeclaration> & Decls); + virtual bool FindExternalLexicalDecls(const DeclContext *DC, + llvm::SmallVectorImpl<Decl*> &Decls); /// \brief Function that will be invoked when we begin parsing a new /// translation unit involving this external AST source. @@ -691,8 +680,8 @@ public: Selector DecodeSelector(unsigned Idx); - virtual Selector GetSelector(uint32_t ID); - virtual uint32_t GetNumKnownSelectors(); + virtual Selector GetExternalSelector(uint32_t ID); + uint32_t GetNumExternalSelectors(); Selector GetSelector(const RecordData &Record, unsigned &Idx) { return DecodeSelector(Record[Idx++]); diff --git a/clang/include/clang/Sema/ExternalSemaSource.h b/clang/include/clang/Sema/ExternalSemaSource.h index d27e29281b5..ad42a847fa4 100644 --- a/clang/include/clang/Sema/ExternalSemaSource.h +++ b/clang/include/clang/Sema/ExternalSemaSource.h @@ -29,6 +29,8 @@ public: ExternalASTSource::SemaSource = true; } + ~ExternalSemaSource(); + /// \brief Initialize the semantic source with the Sema instance /// being used to perform semantic analysis on the abstract syntax /// tree. |