From d7c7089ff3ff2877fe89ac09cc2afa9a3da041c0 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 20 Oct 2021 11:41:38 +0200 Subject: [PATCH] ClangCodeModel: Restart clangd fallback client ... on fallback project part change. Change-Id: Icfc355443b4d6bb3c94eae27c2d23bbd9f681211 Reviewed-by: David Schulz --- .../clangmodelmanagersupport.cpp | 6 +++++ src/plugins/cppeditor/cppmodelmanager.cpp | 24 ++++++++++++------- src/plugins/cppeditor/cppmodelmanager.h | 1 + 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index d1c6b0d0ce3..c06d8a8fff7 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -134,6 +134,12 @@ ClangModelManagerSupport::ClangModelManagerSupport() this, &ClangModelManagerSupport::onProjectPartsUpdated); connect(modelManager, &CppEditor::CppModelManager::projectPartsRemoved, this, &ClangModelManagerSupport::onProjectPartsRemoved); + connect(modelManager, &CppModelManager::fallbackProjectPartUpdated, this, [this] { + if (ClangdClient * const fallbackClient = clientForProject(nullptr)) { + LanguageClientManager::shutdownClient(fallbackClient); + claimNonProjectSources(createClient(nullptr, {})); + } + }); auto *sessionManager = ProjectExplorer::SessionManager::instance(); connect(sessionManager, &ProjectExplorer::SessionManager::projectAdded, diff --git a/src/plugins/cppeditor/cppmodelmanager.cpp b/src/plugins/cppeditor/cppmodelmanager.cpp index 4ddd690b42a..b87e1098da1 100644 --- a/src/plugins/cppeditor/cppmodelmanager.cpp +++ b/src/plugins/cppeditor/cppmodelmanager.cpp @@ -196,6 +196,7 @@ public: bool m_enableGC; QTimer m_delayedGcTimer; + QTimer m_fallbackProjectPartTimer; // Refactoring using REHash = QMap; @@ -692,12 +693,16 @@ CppModelManager::CppModelManager() connect(Core::ICore::instance(), &Core::ICore::coreAboutToClose, this, &CppModelManager::onCoreAboutToClose); - connect(KitManager::instance(), &KitManager::kitsChanged, this, - &CppModelManager::setupFallbackProjectPart); - connect(this, &CppModelManager::projectPartsRemoved, this, - &CppModelManager::setupFallbackProjectPart); - connect(this, &CppModelManager::projectPartsUpdated, this, - &CppModelManager::setupFallbackProjectPart); + d->m_fallbackProjectPartTimer.setSingleShot(true); + d->m_fallbackProjectPartTimer.setInterval(5000); + connect(&d->m_fallbackProjectPartTimer, &QTimer::timeout, + this, &CppModelManager::setupFallbackProjectPart); + connect(KitManager::instance(), &KitManager::kitsChanged, + &d->m_fallbackProjectPartTimer, qOverload<>(&QTimer::start)); + connect(this, &CppModelManager::projectPartsRemoved, + &d->m_fallbackProjectPartTimer, qOverload<>(&QTimer::start)); + connect(this, &CppModelManager::projectPartsUpdated, + &d->m_fallbackProjectPartTimer, qOverload<>(&QTimer::start)); setupFallbackProjectPart(); qRegisterMetaType("CPlusPlus::Document::Ptr"); @@ -1581,8 +1586,11 @@ void CppModelManager::setupFallbackProjectPart() } const auto part = ProjectPart::create({}, rpp, {}, {}, {}, langExtensions, {}, tcInfo); - QMutexLocker locker(&d->m_fallbackProjectPartMutex); - d->m_fallbackProjectPart = part; + { + QMutexLocker locker(&d->m_fallbackProjectPartMutex); + d->m_fallbackProjectPart = part; + } + emit fallbackProjectPartUpdated(); } void CppModelManager::GC() diff --git a/src/plugins/cppeditor/cppmodelmanager.h b/src/plugins/cppeditor/cppmodelmanager.h index 3a05368e15a..e6dc746a1f1 100644 --- a/src/plugins/cppeditor/cppmodelmanager.h +++ b/src/plugins/cppeditor/cppmodelmanager.h @@ -263,6 +263,7 @@ signals: const QString &sourcePath, const QByteArray &contents); void abstractEditorSupportRemoved(const QString &filePath); + void fallbackProjectPartUpdated(); public slots: void updateModifiedSourceFiles();