summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/Protocol.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clangd/Protocol.cpp')
-rw-r--r--clang-tools-extra/clangd/Protocol.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/Protocol.cpp b/clang-tools-extra/clangd/Protocol.cpp
index 3f56056e436..609cfa62108 100644
--- a/clang-tools-extra/clangd/Protocol.cpp
+++ b/clang-tools-extra/clangd/Protocol.cpp
@@ -616,5 +616,38 @@ bool fromJSON(const json::Value &Params,
O.map("compilationDatabaseChanges", CCPC.compilationDatabaseChanges);
}
+json::Value toJSON(const CancelParams &CP) {
+ return json::Object{{"id", CP.ID}};
+}
+
+llvm::raw_ostream &operator<<(llvm::raw_ostream &O, const CancelParams &CP) {
+ O << toJSON(CP);
+ return O;
+}
+
+llvm::Optional<std::string> parseNumberOrString(const json::Value *Params) {
+ if (!Params)
+ return llvm::None;
+ // ID is either a number or a string, check for both.
+ if(const auto AsString = Params->getAsString())
+ return AsString->str();
+
+ if(const auto AsNumber = Params->getAsInteger())
+ return itostr(AsNumber.getValue());
+
+ return llvm::None;
+}
+
+bool fromJSON(const json::Value &Params, CancelParams &CP) {
+ const auto ParamsAsObject = Params.getAsObject();
+ if (!ParamsAsObject)
+ return false;
+ if (auto Parsed = parseNumberOrString(ParamsAsObject->get("id"))) {
+ CP.ID = std::move(*Parsed);
+ return true;
+ }
+ return false;
+}
+
} // namespace clangd
} // namespace clang
OpenPOWER on IntegriCloud