12 #include "llvm/Support/Errc.h"
18 std::lock_guard<std::mutex> Lock(Mutex);
20 auto It = Drafts.find(
File);
21 if (It == Drafts.end())
28 std::lock_guard<std::mutex> Lock(Mutex);
29 std::vector<Path> ResultVector;
31 for (
auto DraftIt = Drafts.begin(); DraftIt != Drafts.end(); DraftIt++)
32 ResultVector.push_back(std::string(DraftIt->getKey()));
38 llvm::Optional<int64_t> Version) {
42 log(
"File version went from {0} to {1}", D.
Version, Version);
52 std::lock_guard<std::mutex> Lock(Mutex);
61 PathRef File, llvm::Optional<int64_t> Version,
62 llvm::ArrayRef<TextDocumentContentChangeEvent>
Changes) {
63 std::lock_guard<std::mutex> Lock(Mutex);
65 auto EntryIt = Drafts.find(
File);
66 if (EntryIt == Drafts.end()) {
67 return llvm::make_error<llvm::StringError>(
68 "Trying to do incremental update on non-added document: " +
File,
69 llvm::errc::invalid_argument);
71 Draft &D = EntryIt->second;
72 std::string
Contents = EntryIt->second.Contents;
80 const Position &Start = Change.range->start;
81 llvm::Expected<size_t> StartIndex =
84 return StartIndex.takeError();
86 const Position &End = Change.range->end;
89 return EndIndex.takeError();
91 if (*EndIndex < *StartIndex)
92 return llvm::make_error<llvm::StringError>(
94 "Range's end position ({0}) is before start position ({1})", End,
96 llvm::errc::invalid_argument);
105 ssize_t ComputedRangeLength =
108 if (Change.rangeLength && ComputedRangeLength != *Change.rangeLength)
109 return llvm::make_error<llvm::StringError>(
110 llvm::formatv(
"Change's rangeLength ({0}) doesn't match the "
111 "computed range length ({1}).",
112 *Change.rangeLength, ComputedRangeLength),
113 llvm::errc::invalid_argument);
115 std::string NewContents;
116 NewContents.reserve(*StartIndex + Change.text.length() +
119 NewContents =
Contents.substr(0, *StartIndex);
120 NewContents += Change.text;
121 NewContents +=
Contents.substr(*EndIndex);
132 std::lock_guard<std::mutex> Lock(Mutex);