summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/index/YAMLSerialization.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clangd/index/YAMLSerialization.cpp')
-rw-r--r--clang-tools-extra/clangd/index/YAMLSerialization.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/clang-tools-extra/clangd/index/YAMLSerialization.cpp b/clang-tools-extra/clangd/index/YAMLSerialization.cpp
index c929deb0706..4517dcf1437 100644
--- a/clang-tools-extra/clangd/index/YAMLSerialization.cpp
+++ b/clang-tools-extra/clangd/index/YAMLSerialization.cpp
@@ -20,8 +20,10 @@
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/Allocator.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/StringSaver.h"
#include "llvm/Support/YAMLTraits.h"
#include "llvm/Support/raw_ostream.h"
#include <cstdint>
@@ -128,9 +130,26 @@ struct NormalizedPosition {
YPosition P;
};
+struct NormalizedFileURI {
+ NormalizedFileURI(IO &) {}
+ NormalizedFileURI(IO &, const char *FileURI) { URI = FileURI; }
+
+ const char *denormalize(IO &IO) {
+ assert(IO.getContext() &&
+ "Expecting an UniqueStringSaver to allocate data");
+ return static_cast<llvm::UniqueStringSaver *>(IO.getContext())
+ ->save(URI)
+ .data();
+ }
+
+ std::string URI;
+};
+
template <> struct MappingTraits<SymbolLocation> {
static void mapping(IO &IO, SymbolLocation &Value) {
- IO.mapRequired("FileURI", Value.FileURI);
+ MappingNormalization<NormalizedFileURI, const char *> NFile(IO,
+ Value.FileURI);
+ IO.mapRequired("FileURI", NFile->URI);
MappingNormalization<NormalizedPosition, SymbolLocation::Position> NStart(
IO, Value.Start);
IO.mapRequired("Start", NStart->P);
@@ -292,7 +311,9 @@ void writeYAML(const IndexFileOut &O, raw_ostream &OS) {
Expected<IndexFileIn> readYAML(StringRef Data) {
SymbolSlab::Builder Symbols;
RefSlab::Builder Refs;
- yaml::Input Yin(Data);
+ BumpPtrAllocator Arena; // store the underlying data of Position::FileURI.
+ UniqueStringSaver Strings(Arena);
+ yaml::Input Yin(Data, &Strings);
do {
VariantEntry Variant;
Yin >> Variant;
OpenPOWER on IntegriCloud