From 475b11aad150c68d9bb54c066f22313bf1d2ac17 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 2 Dec 2015 16:00:11 +0100 Subject: [PATCH] Clang: Fix recovering on clangbackend crash The translation unit was updated, but not re-registered. Handle the editor documents this way: 1. Reset all ClangEditorDocumentProcessors (this will send an unregister message, but that's not problematic). 2. For the visible editor documents, run their processors so that the translation units will be re-registered. 3. For the invisible editor documents, mark them dirty. Once the user makes an invisible document visible again, the processor will run and also re-register the translation unit. Change-Id: I23693ac197bd34a183f3a0020eb5372268636599 Reviewed-by: Marco Bubke --- .../clangbackendipcintegration.cpp | 21 +++++++++++++------ .../clangbackendipcintegration.h | 4 +++- src/plugins/cpptools/cppmodelmanager.h | 2 +- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/plugins/clangcodemodel/clangbackendipcintegration.cpp b/src/plugins/clangcodemodel/clangbackendipcintegration.cpp index 63cd16daf90..0e664aee807 100644 --- a/src/plugins/clangcodemodel/clangbackendipcintegration.cpp +++ b/src/plugins/clangcodemodel/clangbackendipcintegration.cpp @@ -476,15 +476,24 @@ void IpcCommunicator::registerCurrentProjectParts() registerProjectsParts(projectInfo.projectParts()); } -void IpcCommunicator::registerCurrentCppEditorDocuments() +void IpcCommunicator::restoreCppEditorDocuments() +{ + resetCppEditorDocumentProcessors(); + registerVisibleCppEditorDocumentAndMarkInvisibleDirty(); +} + +void IpcCommunicator::resetCppEditorDocumentProcessors() { using namespace CppTools; const auto cppEditorDocuments = CppModelManager::instance()->cppEditorDocuments(); - foreach (const CppEditorDocumentHandle *cppEditorDocument, cppEditorDocuments) { - if (cppEditorDocument->processor()->baseTextDocument()->isModified()) - updateTranslationUnitFromCppEditorDocument(cppEditorDocument->filePath()); - } + foreach (CppEditorDocumentHandle *cppEditorDocument, cppEditorDocuments) + cppEditorDocument->resetProcessor(); +} + +void IpcCommunicator::registerVisibleCppEditorDocumentAndMarkInvisibleDirty() +{ + CppTools::CppModelManager::instance()->updateCppEditorDocuments(); } void IpcCommunicator::registerCurrentCodeModelUiHeaders() @@ -657,8 +666,8 @@ void IpcCommunicator::initializeBackendWithCurrentData() { registerFallbackProjectPart(); registerCurrentProjectParts(); - registerCurrentCppEditorDocuments(); registerCurrentCodeModelUiHeaders(); + restoreCppEditorDocuments(); updateTranslationUnitVisiblity(); emit backendReinitialized(); diff --git a/src/plugins/clangcodemodel/clangbackendipcintegration.h b/src/plugins/clangcodemodel/clangbackendipcintegration.h index 2f045f2abe2..3d6a299c517 100644 --- a/src/plugins/clangcodemodel/clangbackendipcintegration.h +++ b/src/plugins/clangcodemodel/clangbackendipcintegration.h @@ -169,7 +169,9 @@ private: void initializeBackend(); void initializeBackendWithCurrentData(); void registerCurrentProjectParts(); - void registerCurrentCppEditorDocuments(); + void restoreCppEditorDocuments(); + void resetCppEditorDocumentProcessors(); + void registerVisibleCppEditorDocumentAndMarkInvisibleDirty(); void registerCurrentCodeModelUiHeaders(); diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h index 1c4b91ebf0f..4c10343edac 100644 --- a/src/plugins/cpptools/cppmodelmanager.h +++ b/src/plugins/cpptools/cppmodelmanager.h @@ -91,6 +91,7 @@ public: QFuture updateSourceFiles(const QSet &sourceFiles, ProgressNotificationMode mode = ReservedProgressNotification); + void updateCppEditorDocuments() const; WorkingCopy workingCopy() const; QByteArray codeModelConfiguration() const; @@ -209,7 +210,6 @@ private: void initializeModelManagerSupports(); void delayedGC(); void recalculateProjectPartMappings(); - void updateCppEditorDocuments() const; void replaceSnapshot(const CPlusPlus::Snapshot &newSnapshot); void removeFilesFromSnapshot(const QSet &removedFiles);