diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2021-10-06 13:27:23 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2021-10-06 12:03:08 +0000 |
commit | 25a7f30ffc8fcfc75040949e95d64e866653a10e (patch) | |
tree | ce3ba3c49a541e235595202fb858978392dbb375 | |
parent | 9ca3546e594ac1f1c4aff8b4bfaf589e811f6825 (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.cpp | 15 |
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); } |