summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/Protocol.cpp
diff options
context:
space:
mode:
authorSam McCall <sam.mccall@gmail.com>2018-10-17 07:33:42 +0000
committerSam McCall <sam.mccall@gmail.com>2018-10-17 07:33:42 +0000
commitbf6a2fc329bc05f3c08a1a62568e8933dc692bf9 (patch)
treeba09db2ac059d41536cb2678667be3ae86f28308 /clang-tools-extra/clangd/Protocol.cpp
parentdc8f3cf8b0061e34ddda9f90d1db176b4a7c2d93 (diff)
downloadbcm5719-llvm-bf6a2fc329bc05f3c08a1a62568e8933dc692bf9.tar.gz
bcm5719-llvm-bf6a2fc329bc05f3c08a1a62568e8933dc692bf9.zip
[clangd] Simplify client capabilities parsing.
Summary: Instead of parsing into structs that mirror LSP, simply parse into a flat struct that contains the info we need. This is an exception to our strategy with Protocol.h, which seems justified: - the structure here is very large and deeply nested - we care about almost none of it - we should never have to serialize client capabilities Reviewers: kadircet Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, cfe-commits Differential Revision: https://reviews.llvm.org/D53266 llvm-svn: 344673
Diffstat (limited to 'clang-tools-extra/clangd/Protocol.cpp')
-rw-r--r--clang-tools-extra/clangd/Protocol.cpp111
1 files changed, 41 insertions, 70 deletions
diff --git a/clang-tools-extra/clangd/Protocol.cpp b/clang-tools-extra/clangd/Protocol.cpp
index a1e8226b3ca..805225a2434 100644
--- a/clang-tools-extra/clangd/Protocol.cpp
+++ b/clang-tools-extra/clangd/Protocol.cpp
@@ -161,35 +161,6 @@ bool fromJSON(const json::Value &E, TraceLevel &Out) {
return false;
}
-bool fromJSON(const json::Value &Params, CompletionItemClientCapabilities &R) {
- json::ObjectMapper O(Params);
- if (!O)
- return false;
- O.map("snippetSupport", R.snippetSupport);
- O.map("commitCharacterSupport", R.commitCharacterSupport);
- return true;
-}
-
-bool fromJSON(const json::Value &Params, CompletionClientCapabilities &R) {
- json::ObjectMapper O(Params);
- if (!O)
- return false;
- O.map("dynamicRegistration", R.dynamicRegistration);
- O.map("completionItem", R.completionItem);
- O.map("contextSupport", R.contextSupport);
- return true;
-}
-
-bool fromJSON(const llvm::json::Value &Params,
- PublishDiagnosticsClientCapabilities &R) {
- json::ObjectMapper O(Params);
- if (!O)
- return false;
- O.map("clangdFixSupport", R.clangdFixSupport);
- O.map("categorySupport", R.categorySupport);
- return true;
-}
-
bool fromJSON(const json::Value &E, SymbolKind &Out) {
if (auto T = E.getAsInteger()) {
if (*T < static_cast<int>(SymbolKind::File) ||
@@ -201,24 +172,18 @@ bool fromJSON(const json::Value &E, SymbolKind &Out) {
return false;
}
-bool fromJSON(const json::Value &E, std::vector<SymbolKind> &Out) {
+bool fromJSON(const json::Value &E, SymbolKindBitset &Out) {
if (auto *A = E.getAsArray()) {
- Out.clear();
for (size_t I = 0; I < A->size(); ++I) {
SymbolKind KindOut;
if (fromJSON((*A)[I], KindOut))
- Out.push_back(KindOut);
+ Out.set(size_t(KindOut));
}
return true;
}
return false;
}
-bool fromJSON(const json::Value &Params, SymbolKindCapabilities &R) {
- json::ObjectMapper O(Params);
- return O && O.map("valueSet", R.valueSet);
-}
-
SymbolKind adjustKindToCapability(SymbolKind Kind,
SymbolKindBitset &SupportedSymbolKinds) {
auto KindVal = static_cast<size_t>(Kind);
@@ -237,34 +202,46 @@ SymbolKind adjustKindToCapability(SymbolKind Kind,
}
}
-bool fromJSON(const json::Value &Params, WorkspaceSymbolCapabilities &R) {
- json::ObjectMapper O(Params);
- return O && O.map("symbolKind", R.symbolKind);
-}
-
-bool fromJSON(const json::Value &Params, WorkspaceClientCapabilities &R) {
- json::ObjectMapper O(Params);
- return O && O.map("symbol", R.symbol);
-}
-
-bool fromJSON(const json::Value &Params, TextDocumentClientCapabilities &R) {
- json::ObjectMapper O(Params);
- if (!O)
- return false;
- O.map("completion", R.completion);
- O.map("publishDiagnostics", R.publishDiagnostics);
- if (auto *CodeAction = Params.getAsObject()->getObject("codeAction"))
- if (CodeAction->getObject("codeActionLiteralSupport"))
- R.codeActionLiteralSupport = true;
- return true;
-}
-
bool fromJSON(const json::Value &Params, ClientCapabilities &R) {
- json::ObjectMapper O(Params);
+ const json::Object *O = Params.getAsObject();
if (!O)
return false;
- O.map("textDocument", R.textDocument);
- O.map("workspace", R.workspace);
+ if (auto *TextDocument = O->getObject("textDocument")) {
+ if (auto *Diagnostics = TextDocument->getObject("publishDiagnostics")) {
+ if (auto CategorySupport = Diagnostics->getBoolean("categorySupport"))
+ R.DiagnosticCategory = *CategorySupport;
+ if (auto ClangdFixSupport = Diagnostics->getBoolean("clangdFixSupport"))
+ R.DiagnosticFixes = *ClangdFixSupport;
+ }
+ if (auto *Completion = TextDocument->getObject("completion")) {
+ if (auto *Item = Completion->getObject("completionItem")) {
+ if (auto SnippetSupport = Item->getBoolean("snippetSupport"))
+ R.CompletionSnippets = *SnippetSupport;
+ }
+ if (auto *ItemKind = Completion->getObject("completionItemKind")) {
+ if (auto *ValueSet = ItemKind->get("valueSet")) {
+ R.CompletionItemKinds.emplace();
+ if (!fromJSON(*ValueSet, *R.CompletionItemKinds))
+ return false;
+ }
+ }
+ }
+ if (auto *CodeAction = TextDocument->getObject("codeAction")) {
+ if (CodeAction->getObject("codeActionLiteralSupport"))
+ R.CodeActionStructure = true;
+ }
+ }
+ if (auto *Workspace = O->getObject("workspace")) {
+ if (auto *Symbol = Workspace->getObject("symbol")) {
+ if (auto *SymbolKind = Symbol->getObject("symbolKind")) {
+ if (auto *ValueSet = SymbolKind->get("valueSet")) {
+ R.WorkspaceSymbolKinds.emplace();
+ if (!fromJSON(*ValueSet, *R.WorkspaceSymbolKinds))
+ return false;
+ }
+ }
+ }
+ }
return true;
}
@@ -560,24 +537,18 @@ adjustKindToCapability(CompletionItemKind Kind,
}
}
-bool fromJSON(const json::Value &E, std::vector<CompletionItemKind> &Out) {
+bool fromJSON(const json::Value &E, CompletionItemKindBitset &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);
+ Out.set(size_t(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