aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2021-11-05 15:35:54 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2021-11-08 09:32:02 +0000
commit9a16eb5fe62780dda7ba10d22f2bfbe6aadd366b (patch)
treed55cb9c7e4d134d812ce5d6b93ed63a64013ea47
parentbcc5c9a344d27b08d5c629f763f54262da4efa93 (diff)
ClangCodeModel: Inform clangd about changes to non-open files
That is, project-wide changes done from Qt Creator, such as search/ replace or quickfixes. Fixes: QTCREATORBUG-26523 Change-Id: Ide4e56a7a1300eb6f25cabf1cfd94624d66e7e4e Reviewed-by: David Schulz <david.schulz@qt.io>
-rw-r--r--src/plugins/clangcodemodel/clangmodelmanagersupport.cpp24
-rw-r--r--src/plugins/clangcodemodel/clangmodelmanagersupport.h2
2 files changed, 25 insertions, 1 deletions
diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp
index 090a4549c3..3bd9d2640f 100644
--- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp
+++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp
@@ -112,6 +112,7 @@ ClangModelManagerSupport::ClangModelManagerSupport()
m_instance = this;
watchForExternalChanges();
+ watchForInternalChanges();
cppModelManager()->setCurrentDocumentFilter(std::make_unique<ClangdCurrentDocumentFilter>());
cppModelManager()->setLocatorFilter(std::make_unique<ClangGlobalSymbolFilter>());
cppModelManager()->setClassesFilter(std::make_unique<ClangClassesFilter>());
@@ -488,6 +489,29 @@ void ClangModelManagerSupport::watchForExternalChanges()
});
}
+void ClangModelManagerSupport::watchForInternalChanges()
+{
+ connect(Core::DocumentManager::instance(), &Core::DocumentManager::filesChangedInternally,
+ this, [this](const Utils::FilePaths &filePaths) {
+ for (const Utils::FilePath &fp : filePaths) {
+ ClangdClient * const client = clientForFile(fp);
+ if (!client || client->documentForFilePath(fp))
+ continue;
+ client->openExtraFile(fp);
+
+ // We need to give clangd some time to start re-parsing the file.
+ // Closing right away does not work, and neither does doing it queued.
+ // If it turns out that this delay is not always enough, we'll need to come up
+ // with something more clever.
+ // Ideally, clangd would implement workspace/didChangeWatchedFiles; let's keep
+ // any eye on that.
+ QTimer::singleShot(5000, client, [client, fp] {
+ if (!client->documentForFilePath(fp))
+ client->closeExtraFile(fp); });
+ }
+ });
+}
+
void ClangModelManagerSupport::onEditorOpened(Core::IEditor *editor)
{
QTC_ASSERT(editor, return);
diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.h b/src/plugins/clangcodemodel/clangmodelmanagersupport.h
index fc4e1d1a4b..5d591d6925 100644
--- a/src/plugins/clangcodemodel/clangmodelmanagersupport.h
+++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.h
@@ -135,8 +135,8 @@ private:
ClangdClient *createClient(ProjectExplorer::Project *project, const Utils::FilePath &jsonDbDir);
void claimNonProjectSources(ClangdClient *fallbackClient);
void watchForExternalChanges();
+ void watchForInternalChanges();
-private:
UiHeaderOnDiskManager m_uiHeaderOnDiskManager;
BackendCommunicator m_communicator;
ClangCompletionAssistProvider m_completionAssistProvider;