diff options
Diffstat (limited to 'clang-tools-extra/clangd/ClangdUnit.h')
-rw-r--r-- | clang-tools-extra/clangd/ClangdUnit.h | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/clang-tools-extra/clangd/ClangdUnit.h b/clang-tools-extra/clangd/ClangdUnit.h index 22a1b5a5656..0df3179add7 100644 --- a/clang-tools-extra/clangd/ClangdUnit.h +++ b/clang-tools-extra/clangd/ClangdUnit.h @@ -48,6 +48,17 @@ struct DiagWithFixIts { llvm::SmallVector<tooling::Replacement, 1> FixIts; }; +// Stores Preamble and associated data. +struct PreambleData { + PreambleData(PrecompiledPreamble Preamble, + std::vector<serialization::DeclID> TopLevelDeclIDs, + std::vector<DiagWithFixIts> Diags); + + PrecompiledPreamble Preamble; + std::vector<serialization::DeclID> TopLevelDeclIDs; + std::vector<DiagWithFixIts> Diags; +}; + /// Stores and provides access to parsed AST. class ParsedAST { public: @@ -55,8 +66,7 @@ public: /// it is reused during parsing. static llvm::Optional<ParsedAST> Build(std::unique_ptr<clang::CompilerInvocation> CI, - const PrecompiledPreamble *Preamble, - ArrayRef<serialization::DeclID> PreambleDeclIDs, + std::shared_ptr<const PreambleData> Preamble, std::unique_ptr<llvm::MemoryBuffer> Buffer, std::shared_ptr<PCHContainerOperations> PCHs, IntrusiveRefCntPtr<vfs::FileSystem> VFS, clangd::Logger &Logger); @@ -80,15 +90,18 @@ public: const std::vector<DiagWithFixIts> &getDiagnostics() const; private: - ParsedAST(std::unique_ptr<CompilerInstance> Clang, + ParsedAST(std::shared_ptr<const PreambleData> Preamble, + std::unique_ptr<CompilerInstance> Clang, std::unique_ptr<FrontendAction> Action, std::vector<const Decl *> TopLevelDecls, - std::vector<serialization::DeclID> PendingTopLevelDecls, std::vector<DiagWithFixIts> Diags); private: void ensurePreambleDeclsDeserialized(); + // In-memory preambles must outlive the AST, it is important that this member + // goes before Clang and Action. + std::shared_ptr<const PreambleData> Preamble; // We store an "incomplete" FrontendAction (i.e. no EndSourceFile was called // on it) and CompilerInstance used to run it. That way we don't have to do // complex memory management of all Clang structures on our own. (They are @@ -100,7 +113,7 @@ private: // Data, stored after parsing. std::vector<DiagWithFixIts> Diags; std::vector<const Decl *> TopLevelDecls; - std::vector<serialization::DeclID> PendingTopLevelDecls; + bool PreambleDeclsDeserialized; }; // Provides thread-safe access to ParsedAST. @@ -124,17 +137,6 @@ private: mutable llvm::Optional<ParsedAST> AST; }; -// Stores Preamble and associated data. -struct PreambleData { - PreambleData(PrecompiledPreamble Preamble, - std::vector<serialization::DeclID> TopLevelDeclIDs, - std::vector<DiagWithFixIts> Diags); - - PrecompiledPreamble Preamble; - std::vector<serialization::DeclID> TopLevelDeclIDs; - std::vector<DiagWithFixIts> Diags; -}; - /// Manages resources, required by clangd. Allows to rebuild file with new /// contents, and provides AST and Preamble for it. class CppFile : public std::enable_shared_from_this<CppFile> { |