From 4711fd36a3fcf4a63ff9a38cd155c5513c3cf2e0 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Thu, 26 Sep 2019 23:25:09 -0700 Subject: [PATCH] completion: don't reuse cache if the buffer line has changed Fix emacs-ccls#54 --- src/messages/textDocument_completion.cc | 3 ++- src/messages/textDocument_signatureHelp.cc | 8 ++++++-- src/sema_manager.hh | 7 +++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/messages/textDocument_completion.cc b/src/messages/textDocument_completion.cc index ac7c3489..866198e0 100644 --- a/src/messages/textDocument_completion.cc +++ b/src/messages/textDocument_completion.cc @@ -577,13 +577,14 @@ void MessageHandler::textDocument_completion(CompletionParam ¶m, if (!consumer->from_cache) { cache.withLock([&]() { cache.path = path; + cache.line = buffer_line; cache.position = begin_pos; cache.result = consumer->ls_items; }); } }; - if (cache.isCacheValid(path, begin_pos)) { + if (cache.isCacheValid(path, buffer_line, begin_pos)) { CompletionConsumer consumer(cCOpts, true); cache.withLock([&]() { consumer.ls_items = cache.result; }); callback(&consumer); diff --git a/src/messages/textDocument_signatureHelp.cc b/src/messages/textDocument_signatureHelp.cc index d49f348a..cc08445f 100644 --- a/src/messages/textDocument_signatureHelp.cc +++ b/src/messages/textDocument_signatureHelp.cc @@ -163,6 +163,9 @@ void MessageHandler::textDocument_signatureHelp( reply.notOpened(path); return; } + std::string buffer_line; + if (param.position.line >= 0 && param.position.line < wf->buffer_lines.size()) + buffer_line = wf->buffer_lines[param.position.line]; { std::string filter; Position end_pos; @@ -170,7 +173,7 @@ void MessageHandler::textDocument_signatureHelp( } SemaManager::OnComplete callback = - [reply, path, begin_pos](CodeCompleteConsumer *optConsumer) { + [reply, path, begin_pos, buffer_line](CodeCompleteConsumer *optConsumer) { if (!optConsumer) return; auto *consumer = static_cast(optConsumer); @@ -178,6 +181,7 @@ void MessageHandler::textDocument_signatureHelp( if (!consumer->from_cache) { cache.withLock([&]() { cache.path = path; + cache.line = buffer_line; cache.position = begin_pos; cache.result = consumer->ls_sighelp; }); @@ -188,7 +192,7 @@ void MessageHandler::textDocument_signatureHelp( cCOpts.IncludeGlobals = false; cCOpts.IncludeMacros = false; cCOpts.IncludeBriefComments = true; - if (cache.isCacheValid(path, begin_pos)) { + if (cache.isCacheValid(path, buffer_line, begin_pos)) { SignatureHelpConsumer consumer(cCOpts, true); cache.withLock([&]() { consumer.ls_sighelp = cache.result; }); callback(&consumer); diff --git a/src/sema_manager.hh b/src/sema_manager.hh index 9b4f183c..fc8fd1a5 100644 --- a/src/sema_manager.hh +++ b/src/sema_manager.hh @@ -176,6 +176,7 @@ struct SemaManager { template struct CompleteConsumerCache { std::mutex mutex; std::string path; + std::string line; Position position; T result; @@ -183,9 +184,11 @@ template struct CompleteConsumerCache { std::lock_guard lock(mutex); fn(); } - bool isCacheValid(const std::string path, Position position) { + bool isCacheValid(const std::string &path, const std::string &line, + Position position) { std::lock_guard lock(mutex); - return this->path == path && this->position == position; + return this->path == path && this->position == position && + this->line == line; } }; } // namespace ccls