Clangd: clean up text marks after deleting client

This is a blindshot and more a workaround than a fix.
Assert and try to cleanup dangling text marks after a client got
deleted. In theory those marks should get deleted by the
DiagnosticManager but somehow, they are still alive and happy after the
client was deleted.

Task-number: QTCREATORBUG-26585
Change-Id: I9d5d708db3fbbe30a09d322400d97184fe40a518
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
David Schulz
2022-01-14 10:55:15 +01:00
parent 1abe76549e
commit dc4b9e48dc
2 changed files with 13 additions and 0 deletions

View File

@@ -406,6 +406,11 @@ ClangdTextMark::ClangdTextMark(const FilePath &filePath,
ClangDiagnosticManager::addTask(m_diagnostic); ClangDiagnosticManager::addTask(m_diagnostic);
} }
m_clientDeleted = QObject::connect(client, &QObject::destroyed, [this] (){
QTC_ASSERT_STRING("ClangdClient deleted before TextMark");
delete this;
});
// Copy to clipboard action // Copy to clipboard action
QVector<QAction *> actions; QVector<QAction *> actions;
QAction *action = new QAction(); QAction *action = new QAction();
@@ -433,6 +438,11 @@ ClangdTextMark::ClangdTextMark(const FilePath &filePath,
setActions(actions); setActions(actions);
} }
ClangdTextMark::~ClangdTextMark()
{
QObject::disconnect(m_clientDeleted);
}
bool ClangdTextMark::addToolTipContent(QLayout *target) const bool ClangdTextMark::addToolTipContent(QLayout *target) const
{ {
const auto canApplyFixIt = [c = m_client, diag = m_lspDiagnostic, fp = fileName()] { const auto canApplyFixIt = [c = m_client, diag = m_lspDiagnostic, fp = fileName()] {

View File

@@ -73,6 +73,7 @@ public:
ClangdTextMark(const ::Utils::FilePath &filePath, ClangdTextMark(const ::Utils::FilePath &filePath,
const LanguageServerProtocol::Diagnostic &diagnostic, const LanguageServerProtocol::Diagnostic &diagnostic,
const LanguageClient::Client *client); const LanguageClient::Client *client);
~ClangdTextMark();
private: private:
bool addToolTipContent(QLayout *target) const override; bool addToolTipContent(QLayout *target) const override;
@@ -80,6 +81,8 @@ private:
const LanguageServerProtocol::Diagnostic m_lspDiagnostic; const LanguageServerProtocol::Diagnostic m_lspDiagnostic;
const ClangBackEnd::DiagnosticContainer m_diagnostic; const ClangBackEnd::DiagnosticContainer m_diagnostic;
const QPointer<const LanguageClient::Client> m_client; const QPointer<const LanguageClient::Client> m_client;
QMetaObject::Connection m_clientDeleted;
}; };
} // namespace Internal } // namespace Internal