diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2021-11-05 15:35:54 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2021-11-08 09:32:02 +0000 |
commit | 9a16eb5fe62780dda7ba10d22f2bfbe6aadd366b (patch) | |
tree | d55cb9c7e4d134d812ce5d6b93ed63a64013ea47 | |
parent | bcc5c9a344d27b08d5c629f763f54262da4efa93 (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.cpp | 24 | ||||
-rw-r--r-- | src/plugins/clangcodemodel/clangmodelmanagersupport.h | 2 |
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; |