diff options
Diffstat (limited to 'src/plugins/cpptools')
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.cpp | 5 | ||||
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager_test.cpp | 31 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsplugin.h | 1 |
3 files changed, 35 insertions, 2 deletions
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 6d55de5cdf..90e98b1afa 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -618,21 +618,22 @@ void CppModelManager::deleteEditorSupport(TextEditor::BaseTextEditor *textEditor return; CppEditorSupport *editorSupport; + int numberOfOpenEditors = 0; { // only lock the operations on m_editorSupport QMutexLocker locker(&m_editorSupportMutex); editorSupport = m_editorSupport.value(textEditor, 0); m_editorSupport.remove(textEditor); + numberOfOpenEditors = m_editorSupport.size(); } delete editorSupport; ++numberOfClosedEditors; - if (numberOfClosedEditors == 5) { + if (numberOfOpenEditors == 0 || numberOfClosedEditors == 5) { numberOfClosedEditors = 0; GC(); } - } bool CppModelManager::isCppEditor(Core::IEditor *editor) const diff --git a/src/plugins/cpptools/cppmodelmanager_test.cpp b/src/plugins/cpptools/cppmodelmanager_test.cpp index 305b16b2c2..7bd128d209 100644 --- a/src/plugins/cpptools/cppmodelmanager_test.cpp +++ b/src/plugins/cpptools/cppmodelmanager_test.cpp @@ -32,6 +32,7 @@ #include "cpppreprocessor.h" #include "modelmanagertesthelper.h" +#include <coreplugin/editormanager/editormanager.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/session.h> @@ -413,3 +414,33 @@ void CppToolsPlugin::test_modelmanager_extraeditorsupport_uiFiles() sm->removeProject(project); ModelManagerTestHelper::verifyClean(); } + +/// QTCREATORBUG-9828: Locator shows symbols of closed files +/// Check: The garbage collector should be run if the last CppEditor is closed. +void CppToolsPlugin::test_modelmanager_gc_if_last_cppeditor_closed() +{ + TestDataDirectory testDataDirectory(QLatin1String("testdata_guiproject1")); + const QString file = testDataDirectory.file(QLatin1String("main.cpp")); + + Core::EditorManager *em = Core::EditorManager::instance(); + CppModelManager *mm = CppModelManager::instance(); + + // Open a file in the editor + QCOMPARE(Core::EditorManager::documentModel()->openedDocuments().size(), 0); + Core::IEditor *editor = em->openEditor(file); + QVERIFY(editor); + QCOMPARE(Core::EditorManager::documentModel()->openedDocuments().size(), 1); + QVERIFY(mm->isCppEditor(editor)); + QVERIFY(mm->workingCopy().contains(file)); + + // Check: File is in the snapshot + QVERIFY(mm->snapshot().contains(file)); + + // Close file/editor + const QList<Core::IEditor*> editorsToClose = QList<Core::IEditor*>() << editor; + em->closeEditors(editorsToClose, /*askAboutModifiedEditors=*/ false); + + // Check: File is removed from the snapshpt + QVERIFY(!mm->workingCopy().contains(file)); + QVERIFY(!mm->snapshot().contains(file)); +} diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index 9ebea97461..62204fac96 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -187,6 +187,7 @@ private slots: void test_modelmanager_refresh_2(); void test_modelmanager_snapshot_after_two_projects(); void test_modelmanager_extraeditorsupport_uiFiles(); + void test_modelmanager_gc_if_last_cppeditor_closed(); private: void test_completion(); |