summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/ClangdUnit.h
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clangd/ClangdUnit.h')
-rw-r--r--clang-tools-extra/clangd/ClangdUnit.h34
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> {
OpenPOWER on IntegriCloud