summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/Protocol.cpp
diff options
context:
space:
mode:
authorIlya Biryukov <ibiryukov@google.com>2019-01-03 13:37:12 +0000
committerIlya Biryukov <ibiryukov@google.com>2019-01-03 13:37:12 +0000
commitb0826bdffe48b91d9d1dad7437e2266635c5b7dd (patch)
tree17e6ba52dd1cab4ad09a4b0d1ebc130884876af2 /clang-tools-extra/clangd/Protocol.cpp
parent22fa465a8c6ca9b4940d62dba5958580322abc4f (diff)
downloadbcm5719-llvm-b0826bdffe48b91d9d1dad7437e2266635c5b7dd.tar.gz
bcm5719-llvm-b0826bdffe48b91d9d1dad7437e2266635c5b7dd.zip
[clangd] Check preceding char when completion triggers on ':' or '>'
Summary: Only run completion when we were trigerred on '->' and '::', otherwise send an error code in return. To avoid automatically invoking completions in cases like 'a >^' or 'a ? b :^'. Reviewers: hokein Reviewed By: hokein Subscribers: ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits Differential Revision: https://reviews.llvm.org/D55994 llvm-svn: 350304
Diffstat (limited to 'clang-tools-extra/clangd/Protocol.cpp')
-rw-r--r--clang-tools-extra/clangd/Protocol.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/Protocol.cpp b/clang-tools-extra/clangd/Protocol.cpp
index 972ba25fbe1..fd94ca7d4bc 100644
--- a/clang-tools-extra/clangd/Protocol.cpp
+++ b/clang-tools-extra/clangd/Protocol.cpp
@@ -550,6 +550,29 @@ bool fromJSON(const json::Value &Params, TextDocumentPositionParams &R) {
O.map("position", R.position);
}
+bool fromJSON(const llvm::json::Value &Params, CompletionContext &R) {
+ json::ObjectMapper O(Params);
+ if (!O)
+ return false;
+
+ int triggerKind;
+ if (!O.map("triggerKind", triggerKind))
+ return false;
+ R.triggerKind = static_cast<CompletionTriggerKind>(triggerKind);
+
+ if (auto *TC = Params.getAsObject()->get("triggerCharacter"))
+ return fromJSON(*TC, R.triggerCharacter);
+ return true;
+}
+
+bool fromJSON(const llvm::json::Value &Params, CompletionParams &R) {
+ if (!fromJSON(Params, static_cast<TextDocumentPositionParams &>(R)))
+ return false;
+ if (auto *Context = Params.getAsObject()->get("context"))
+ return fromJSON(*Context, R.context);
+ return true;
+}
+
static StringRef toTextKind(MarkupKind Kind) {
switch (Kind) {
case MarkupKind::PlainText:
OpenPOWER on IntegriCloud