completion: don't reuse cache if the buffer line has changed

Fix emacs-ccls#54
This commit is contained in:
Fangrui Song 2019-09-26 23:25:09 -07:00
parent 0c6be472ce
commit aa9668a8fc
3 changed files with 14 additions and 5 deletions

View File

@ -565,13 +565,14 @@ void MessageHandler::textDocument_completion(CompletionParam &param,
if (!consumer->from_cache) { if (!consumer->from_cache) {
cache.withLock([&]() { cache.withLock([&]() {
cache.path = path; cache.path = path;
cache.line = buffer_line;
cache.position = begin_pos; cache.position = begin_pos;
cache.result = consumer->ls_items; cache.result = consumer->ls_items;
}); });
} }
}; };
if (cache.isCacheValid(path, begin_pos)) { if (cache.isCacheValid(path, buffer_line, begin_pos)) {
CompletionConsumer consumer(ccOpts, true); CompletionConsumer consumer(ccOpts, true);
cache.withLock([&]() { consumer.ls_items = cache.result; }); cache.withLock([&]() { consumer.ls_items = cache.result; });
callback(&consumer); callback(&consumer);

View File

@ -151,6 +151,9 @@ void MessageHandler::textDocument_signatureHelp(
reply.notOpened(path); reply.notOpened(path);
return; 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; std::string filter;
Position end_pos; Position end_pos;
@ -158,7 +161,7 @@ void MessageHandler::textDocument_signatureHelp(
} }
SemaManager::OnComplete callback = SemaManager::OnComplete callback =
[reply, path, begin_pos](CodeCompleteConsumer *optConsumer) { [reply, path, begin_pos, buffer_line](CodeCompleteConsumer *optConsumer) {
if (!optConsumer) if (!optConsumer)
return; return;
auto *consumer = static_cast<SignatureHelpConsumer *>(optConsumer); auto *consumer = static_cast<SignatureHelpConsumer *>(optConsumer);
@ -166,6 +169,7 @@ void MessageHandler::textDocument_signatureHelp(
if (!consumer->from_cache) { if (!consumer->from_cache) {
cache.withLock([&]() { cache.withLock([&]() {
cache.path = path; cache.path = path;
cache.line = buffer_line;
cache.position = begin_pos; cache.position = begin_pos;
cache.result = consumer->ls_sighelp; cache.result = consumer->ls_sighelp;
}); });
@ -176,7 +180,7 @@ void MessageHandler::textDocument_signatureHelp(
ccOpts.IncludeGlobals = false; ccOpts.IncludeGlobals = false;
ccOpts.IncludeMacros = false; ccOpts.IncludeMacros = false;
ccOpts.IncludeBriefComments = true; ccOpts.IncludeBriefComments = true;
if (cache.isCacheValid(path, begin_pos)) { if (cache.isCacheValid(path, buffer_line, begin_pos)) {
SignatureHelpConsumer consumer(ccOpts, true); SignatureHelpConsumer consumer(ccOpts, true);
cache.withLock([&]() { consumer.ls_sighelp = cache.result; }); cache.withLock([&]() { consumer.ls_sighelp = cache.result; });
callback(&consumer); callback(&consumer);

View File

@ -164,6 +164,7 @@ struct SemaManager {
template <typename T> struct CompleteConsumerCache { template <typename T> struct CompleteConsumerCache {
std::mutex mutex; std::mutex mutex;
std::string path; std::string path;
std::string line;
Position position; Position position;
T result; T result;
@ -171,9 +172,12 @@ template <typename T> struct CompleteConsumerCache {
std::lock_guard lock(mutex); std::lock_guard lock(mutex);
fn(); 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); std::lock_guard lock(mutex);
return this->path == path && this->position == position; return this->position == position && this->path == path &&
this->line.compare(0, position.character, line, 0,
position.character) == 0;
} }
}; };
} // namespace ccls } // namespace ccls