mirror of
https://github.com/MaskRay/ccls.git
synced 2025-02-16 13:48:04 +00:00
Remove issue where diagnostics would disappear file saves.
Also allow rebuilding of completion session by closing and reopening a file.
This commit is contained in:
parent
809a55a351
commit
a6807dcb8c
@ -303,6 +303,12 @@ void EnsureDocumentParsed(ClangCompleteManager* manager,
|
||||
|
||||
// Build diagnostics.
|
||||
if (manager->config_->diagnosticsOnParse && !(*tu)->did_fail) {
|
||||
// If we're emitting diagnostics, do an immedaite reparse, otherwise we will
|
||||
// emit stale/bad diagnostics.
|
||||
clang_reparseTranslationUnit(
|
||||
(*tu)->cx_tu, unsaved.size(), unsaved.data(),
|
||||
clang_defaultReparseOptions((*tu)->cx_tu));
|
||||
|
||||
NonElidedVector<lsDiagnostic> ls_diagnostics;
|
||||
unsigned num_diagnostics = clang_getNumDiagnostics((*tu)->cx_tu);
|
||||
for (unsigned i = 0; i < num_diagnostics; ++i) {
|
||||
@ -360,9 +366,10 @@ void CompletionQueryMain(ClangCompleteManager* completion_manager) {
|
||||
completion_manager->TryGetSession(path, true /*create_if_needed*/);
|
||||
|
||||
std::lock_guard<std::mutex> lock(session->tu_lock);
|
||||
Timer timer;
|
||||
EnsureDocumentParsed(completion_manager, session, &session->tu,
|
||||
&session->index);
|
||||
Timer timer;
|
||||
timer.ResetAndPrint("[complete] EnsureDocumentParsed");
|
||||
|
||||
std::vector<CXUnsavedFile> unsaved =
|
||||
completion_manager->working_files_->AsUnsavedFiles();
|
||||
@ -631,6 +638,23 @@ void ClangCompleteManager::NotifySave(const std::string& filename) {
|
||||
parse_requests_.PriorityEnqueue(ParseRequest(filename));
|
||||
}
|
||||
|
||||
void ClangCompleteManager::NotifyClose(const std::string& filename) {
|
||||
//
|
||||
// On close, we clear any existing CompletionSession instance.
|
||||
//
|
||||
|
||||
std::lock_guard<std::mutex> lock(sessions_lock_);
|
||||
|
||||
// Take and drop. It's okay if we don't actually drop the file, it'll
|
||||
// eventually get pushed out of the caches as the user opens other files.
|
||||
auto view_ptr = view_sessions_.TryTakeEntry(filename);
|
||||
LOG_IF_S(INFO, !!view_ptr)
|
||||
<< "Dropped view-based code completion session for " << filename;
|
||||
auto edit_ptr = edit_sessions_.TryTakeEntry(filename);
|
||||
LOG_IF_S(INFO, !!edit_ptr)
|
||||
<< "Dropped edit-based code completion session for " << filename;
|
||||
}
|
||||
|
||||
std::shared_ptr<CompletionSession> ClangCompleteManager::TryGetSession(
|
||||
const std::string& filename,
|
||||
bool create_if_needed) {
|
||||
|
@ -95,6 +95,9 @@ struct ClangCompleteManager {
|
||||
// Notify the completion manager that |filename| has been saved. This
|
||||
// triggers a reparse.
|
||||
void NotifySave(const std::string& filename);
|
||||
// Notify the completion manager that |filename| has been closed. Any existing
|
||||
// completion session will be dropped.
|
||||
void NotifyClose(const std::string& filename);
|
||||
|
||||
std::shared_ptr<CompletionSession> TryGetSession(const std::string& filename,
|
||||
bool create_if_needed);
|
||||
|
@ -1765,6 +1765,7 @@ bool QueryDbMainLoop(Config* config,
|
||||
|
||||
case IpcId::TextDocumentDidClose: {
|
||||
auto msg = message->As<Ipc_TextDocumentDidClose>();
|
||||
std::string path = msg->params.textDocument.uri.GetPath();
|
||||
|
||||
// Clear any diagnostics for the file.
|
||||
Out_TextDocumentPublishDiagnostics diag;
|
||||
@ -1774,6 +1775,7 @@ bool QueryDbMainLoop(Config* config,
|
||||
|
||||
// Remove internal state.
|
||||
working_files->OnClose(msg->params);
|
||||
clang_complete->NotifyClose(path);
|
||||
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user