diff options
| author | Ilya Biryukov <ibiryukov@google.com> | 2019-01-03 13:37:12 +0000 |
|---|---|---|
| committer | Ilya Biryukov <ibiryukov@google.com> | 2019-01-03 13:37:12 +0000 |
| commit | b0826bdffe48b91d9d1dad7437e2266635c5b7dd (patch) | |
| tree | 17e6ba52dd1cab4ad09a4b0d1ebc130884876af2 /clang-tools-extra/clangd/Protocol.cpp | |
| parent | 22fa465a8c6ca9b4940d62dba5958580322abc4f (diff) | |
| download | bcm5719-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.cpp | 23 |
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: |

