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.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/Protocol.cpp b/clang-tools-extra/clangd/Protocol.cpp
index e6ffe66a129..7a137eb6b8e 100644
--- a/clang-tools-extra/clangd/Protocol.cpp
+++ b/clang-tools-extra/clangd/Protocol.cpp
@@ -496,6 +496,57 @@ json::Value toJSON(const Hover &H) {
return std::move(Result);
}
+bool fromJSON(const json::Value &E, CompletionItemKind &Out) {
+ if (auto T = E.getAsInteger()) {
+ if (*T < static_cast<int>(CompletionItemKind::Text) ||
+ *T > static_cast<int>(CompletionItemKind::TypeParameter))
+ return false;
+ Out = static_cast<CompletionItemKind>(*T);
+ return true;
+ }
+ return false;
+}
+
+CompletionItemKind
+adjustKindToCapability(CompletionItemKind Kind,
+ CompletionItemKindBitset &supportedCompletionItemKinds) {
+ auto KindVal = static_cast<size_t>(Kind);
+ if (KindVal >= CompletionItemKindMin &&
+ KindVal <= supportedCompletionItemKinds.size() &&
+ supportedCompletionItemKinds[KindVal])
+ return Kind;
+
+ switch (Kind) {
+ // Provide some fall backs for common kinds that are close enough.
+ case CompletionItemKind::Folder:
+ return CompletionItemKind::File;
+ case CompletionItemKind::EnumMember:
+ return CompletionItemKind::Enum;
+ case CompletionItemKind::Struct:
+ return CompletionItemKind::Class;
+ default:
+ return CompletionItemKind::Text;
+ }
+}
+
+bool fromJSON(const json::Value &E, std::vector<CompletionItemKind> &Out) {
+ if (auto *A = E.getAsArray()) {
+ Out.clear();
+ for (size_t I = 0; I < A->size(); ++I) {
+ CompletionItemKind KindOut;
+ if (fromJSON((*A)[I], KindOut))
+ Out.push_back(KindOut);
+ }
+ return true;
+ }
+ return false;
+}
+
+bool fromJSON(const json::Value &Params, CompletionItemKindCapabilities &R) {
+ json::ObjectMapper O(Params);
+ return O && O.map("valueSet", R.valueSet);
+}
+
json::Value toJSON(const CompletionItem &CI) {
assert(!CI.label.empty() && "completion item label is required");
json::Object Result{{"label", CI.label}};
OpenPOWER on IntegriCloud