mirror of
https://github.com/MaskRay/ccls.git
synced 2024-11-28 18:41:57 +00:00
completion: don't reuse cache if the buffer line has changed
Fix emacs-ccls#54
This commit is contained in:
parent
0c6be472ce
commit
aa9668a8fc
@ -565,13 +565,14 @@ void MessageHandler::textDocument_completion(CompletionParam ¶m,
|
|||||||
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);
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user