From 99bd0ed2a47f093cff1b2afc07e3d42a5e10c5a2 Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Thu, 22 Mar 2018 13:05:59 +0100 Subject: [PATCH] Clang: Rebuild overview model tree when token data is updated In release builds overview model tree is built earlier then the job with token information is completed. Change-Id: I1a563551e813996001fb97924ac441e2b7d599b9 Reviewed-by: Eike Ziller --- .../clangeditordocumentprocessor.cpp | 1 + .../clangcodemodel/clangeditordocumentprocessor.h | 3 +++ src/plugins/clangcodemodel/clangoverviewmodel.cpp | 14 +++++++++++++- src/plugins/cpptools/abstractoverviewmodel.h | 3 +++ src/plugins/cpptools/cppeditoroutline.cpp | 2 ++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 2b33d44e578..80908c03ab2 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -267,6 +267,7 @@ void ClangEditorDocumentProcessor::updateTokenInfos( if (documentRevision != revision()) return; m_tokenInfos = tokenInfos; + emit tokenInfosUpdated(); } static int currentLine(const TextEditor::AssistInterface &assistInterface) diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h index dafe4067aef..cd28c310cf3 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h @@ -106,6 +106,9 @@ public: public: static ClangEditorDocumentProcessor *get(const QString &filePath); +signals: + void tokenInfosUpdated(); + private: void onParserFinished(); void updateProjectPartAndTranslationUnitForEditor(); diff --git a/src/plugins/clangcodemodel/clangoverviewmodel.cpp b/src/plugins/clangcodemodel/clangoverviewmodel.cpp index d9cdebc4398..05341c79145 100644 --- a/src/plugins/clangcodemodel/clangoverviewmodel.cpp +++ b/src/plugins/clangcodemodel/clangoverviewmodel.cpp @@ -206,7 +206,19 @@ bool OverviewModel::rebuild(const QString &filePath) ClangEditorDocumentProcessor *processor = ClangEditorDocumentProcessor::get(filePath); if (!processor) return false; - m_filePath = filePath; + if (m_filePath != filePath) { + if (!m_filePath.isEmpty()) { + ClangEditorDocumentProcessor *previousProcessor + = ClangEditorDocumentProcessor::get(m_filePath); + if (previousProcessor) { + disconnect(previousProcessor, &ClangEditorDocumentProcessor::tokenInfosUpdated, + this, &OverviewModel::needsUpdate); + } + } + m_filePath = filePath; + connect(processor, &ClangEditorDocumentProcessor::tokenInfosUpdated, this, + &OverviewModel::needsUpdate); + } const TokenContainers &tokenContainers = processor->tokenInfos(); auto *root = new TokenTreeItem; diff --git a/src/plugins/cpptools/abstractoverviewmodel.h b/src/plugins/cpptools/abstractoverviewmodel.h index 08d4777cc4a..6a9bbebb991 100644 --- a/src/plugins/cpptools/abstractoverviewmodel.h +++ b/src/plugins/cpptools/abstractoverviewmodel.h @@ -90,6 +90,9 @@ public: virtual bool isGenerated(const QModelIndex &) const { return false; } virtual Utils::Link linkFromIndex(const QModelIndex &) const = 0; virtual Utils::LineColumn lineColumnFromIndex(const QModelIndex &) const = 0; + +signals: + void needsUpdate(); }; } // namespace CppTools diff --git a/src/plugins/cpptools/cppeditoroutline.cpp b/src/plugins/cpptools/cppeditoroutline.cpp index 3f92543f719..7d520bcfc87 100644 --- a/src/plugins/cpptools/cppeditoroutline.cpp +++ b/src/plugins/cpptools/cppeditoroutline.cpp @@ -133,6 +133,8 @@ CppEditorOutline::CppEditorOutline(TextEditor::TextEditorWidget *editorWidget) m_updateTimer = newSingleShotTimer(this, UpdateOutlineIntervalInMs, QLatin1String("CppEditorOutline::m_updateTimer")); connect(m_updateTimer, &QTimer::timeout, this, &CppEditorOutline::updateNow); + connect(m_model.get(), &CppTools::AbstractOverviewModel::needsUpdate, this, + &CppEditorOutline::updateNow); m_updateIndexTimer = newSingleShotTimer(this, UpdateOutlineIntervalInMs, QLatin1String("CppEditorOutline::m_updateIndexTimer"));