diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index eb29947d7ae..95a2e51065c 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -116,25 +116,43 @@ void ModelManagerSupportClang::onCurrentEditorChanged(Core::IEditor *newCurrent) void ModelManagerSupportClang::connectTextDocumentToTranslationUnit(TextEditor::TextDocument *textDocument) { // Handle externally changed documents + connect(textDocument, &Core::IDocument::aboutToReload, + this, &ModelManagerSupportClang::onCppDocumentAboutToReloadOnTranslationUnit, + Qt::UniqueConnection); connect(textDocument, &Core::IDocument::reloadFinished, this, &ModelManagerSupportClang::onCppDocumentReloadFinishedOnTranslationUnit, Qt::UniqueConnection); // Handle changes from e.g. refactoring actions - connect(textDocument, &TextEditor::TextDocument::contentsChangedWithPosition, - this, &ModelManagerSupportClang::onCppDocumentContentsChangedOnTranslationUnit, - Qt::UniqueConnection); + connectToTextDocumentContentsChangedForTranslationUnit(textDocument); } void ModelManagerSupportClang::connectTextDocumentToUnsavedFiles(TextEditor::TextDocument *textDocument) { // Handle externally changed documents + connect(textDocument, &Core::IDocument::aboutToReload, + this, &ModelManagerSupportClang::onCppDocumentAboutToReloadOnUnsavedFile, + Qt::UniqueConnection); connect(textDocument, &Core::IDocument::reloadFinished, this, &ModelManagerSupportClang::onCppDocumentReloadFinishedOnUnsavedFile, Qt::UniqueConnection); // Handle changes from e.g. refactoring actions - connect(textDocument, &TextEditor::TextDocument::contentsChanged, + connectToTextDocumentContentsChangedForUnsavedFile(textDocument); +} + +void ModelManagerSupportClang::connectToTextDocumentContentsChangedForTranslationUnit( + TextEditor::TextDocument *textDocument) +{ + connect(textDocument, &TextEditor::TextDocument::contentsChangedWithPosition, + this, &ModelManagerSupportClang::onCppDocumentContentsChangedOnTranslationUnit, + Qt::UniqueConnection); +} + +void ModelManagerSupportClang::connectToTextDocumentContentsChangedForUnsavedFile( + TextEditor::TextDocument *textDocument) +{ + connect(textDocument, &TextEditor::TextDocument::contentsChangedWithPosition, this, &ModelManagerSupportClang::onCppDocumentContentsChangedOnUnsavedFile, Qt::UniqueConnection); } @@ -168,11 +186,19 @@ void ModelManagerSupportClang::onEditorOpened(Core::IEditor *editor) } } +void ModelManagerSupportClang::onCppDocumentAboutToReloadOnTranslationUnit() +{ + TextEditor::TextDocument *textDocument = qobject_cast(sender()); + disconnect(textDocument, &TextEditor::TextDocument::contentsChangedWithPosition, + this, &ModelManagerSupportClang::onCppDocumentContentsChangedOnTranslationUnit); +} + void ModelManagerSupportClang::onCppDocumentReloadFinishedOnTranslationUnit(bool success) { if (success) { - Core::IDocument *document = qobject_cast(sender()); - m_ipcCommunicator.requestDiagnostics(document); + TextEditor::TextDocument *textDocument = qobject_cast(sender()); + connectToTextDocumentContentsChangedForTranslationUnit(textDocument); + m_ipcCommunicator.requestDiagnostics(textDocument); } } @@ -187,11 +213,19 @@ void ModelManagerSupportClang::onCppDocumentContentsChangedOnTranslationUnit(int m_ipcCommunicator.updateTranslationUnitIfNotCurrentDocument(document); } +void ModelManagerSupportClang::onCppDocumentAboutToReloadOnUnsavedFile() +{ + TextEditor::TextDocument *textDocument = qobject_cast(sender()); + disconnect(textDocument, &TextEditor::TextDocument::contentsChangedWithPosition, + this, &ModelManagerSupportClang::onCppDocumentContentsChangedOnUnsavedFile); +} + void ModelManagerSupportClang::onCppDocumentReloadFinishedOnUnsavedFile(bool success) { if (success) { - Core::IDocument *document = qobject_cast(sender()); - m_ipcCommunicator.updateUnsavedFile(document); + TextEditor::TextDocument *textDocument = qobject_cast(sender()); + connectToTextDocumentContentsChangedForUnsavedFile(textDocument); + m_ipcCommunicator.updateUnsavedFile(textDocument); } } diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.h b/src/plugins/clangcodemodel/clangmodelmanagersupport.h index b433f4c0ecf..54478a6ee53 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.h +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.h @@ -72,10 +72,12 @@ public: private: void onEditorOpened(Core::IEditor *editor); void onCurrentEditorChanged(Core::IEditor *newCurrent); + void onCppDocumentAboutToReloadOnTranslationUnit(); void onCppDocumentReloadFinishedOnTranslationUnit(bool success); void onCppDocumentContentsChangedOnTranslationUnit(int position, int charsRemoved, int charsAdded); + void onCppDocumentAboutToReloadOnUnsavedFile(); void onCppDocumentReloadFinishedOnUnsavedFile(bool success); void onCppDocumentContentsChangedOnUnsavedFile(); @@ -93,6 +95,9 @@ private: void connectTextDocumentToTranslationUnit(TextEditor::TextDocument *textDocument); void connectTextDocumentToUnsavedFiles(TextEditor::TextDocument *textDocument); + void connectToTextDocumentContentsChangedForTranslationUnit( + TextEditor::TextDocument *textDocument); + void connectToTextDocumentContentsChangedForUnsavedFile(TextEditor::TextDocument *textDocument); void connectToWidgetsMarkContextMenuRequested(QWidget *editorWidget); private: