aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2021-10-06 13:27:23 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2021-10-06 12:03:08 +0000
commit25a7f30ffc8fcfc75040949e95d64e866653a10e (patch)
treece3ba3c49a541e235595202fb858978392dbb375
parent9ca3546e594ac1f1c4aff8b4bfaf589e811f6825 (diff)
ClangCodeModel: Do not hold highlighters by value in ClangdClient
Semantic highlighter objects are owned by their respective documents, so we can run into destruction issues when keeping them by value. Fixes: QTCREATORBUG-26364 Change-Id: Idc128d685ccdd25989dd9389d352453ccc935fa9 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
-rw-r--r--src/plugins/clangcodemodel/clangdclient.cpp15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp
index 8ba51f2fba..fb3efa95ec 100644
--- a/src/plugins/clangcodemodel/clangdclient.cpp
+++ b/src/plugins/clangcodemodel/clangdclient.cpp
@@ -77,6 +77,7 @@
#include <set>
#include <unordered_map>
+#include <utility>
using namespace CPlusPlus;
using namespace Core;
@@ -934,7 +935,10 @@ public:
Utils::optional<SwitchDeclDefData> switchDeclDefData;
Utils::optional<LocalRefsData> localRefsData;
Utils::optional<QVersionNumber> versionNumber;
- std::unordered_map<TextDocument *, CppEditor::SemanticHighlighter> highlighters;
+
+ // The highlighters are owned by their respective documents.
+ std::unordered_map<TextDocument *, CppEditor::SemanticHighlighter *> highlighters;
+
VersionedDataCache<const TextDocument *, AstNode> astCache;
VersionedDataCache<Utils::FilePath, AstNode> externalAstCache;
TaskTimer highlightingTimer{"highlighting"};
@@ -2400,12 +2404,13 @@ void ClangdClient::Private::handleSemanticTokens(TextDocument *doc,
auto it = highlighters.find(doc);
if (it == highlighters.end()) {
- it = highlighters.emplace(doc, doc).first;
+ it = highlighters.insert(std::make_pair(doc, new CppEditor::SemanticHighlighter(doc)))
+ .first;
} else {
- it->second.updateFormatMapFromFontSettings();
+ it->second->updateFormatMapFromFontSettings();
}
- it->second.setHighlightingRunner(runner);
- it->second.run();
+ it->second->setHighlightingRunner(runner);
+ it->second->run();
};
getAndHandleAst(doc, astHandler, AstCallbackMode::SyncIfPossible);
}