diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index cc1979d6b70..d9f53f2f5d2 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -714,9 +714,28 @@ void CppModelManager::GC() if (!m_enableGC) return; - const Snapshot currentSnapshot = snapshot(); + // Collect files of CppEditorSupport and AbstractEditorSupport. + QStringList filesInEditorSupports; + QList cppEditorSupports; + { + QMutexLocker locker(&m_cppEditorSupportsMutex); + cppEditorSupports = m_cppEditorSupports.values(); + } + foreach (const CppEditorSupport *cppEditorSupport, cppEditorSupports) + filesInEditorSupports << cppEditorSupport->fileName(); + + QSetIterator jt(m_extraEditorSupports); + while (jt.hasNext()) { + AbstractEditorSupport *abstractEditorSupport = jt.next(); + filesInEditorSupports << abstractEditorSupport->fileName(); + } + + Snapshot currentSnapshot = snapshot(); QSet reachableFiles; - QStringList todo = projectFiles(); + // The configuration file is part of the project files, which is just fine. + // If single files are open, without any project, then there is no need to + // keep the configuration file around. + QStringList todo = filesInEditorSupports + projectFiles(); // Collect all files that are reachable from the project files while (!todo.isEmpty()) { diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h index a8ca3ee1a03..5c65a9781ad 100644 --- a/src/plugins/cpptools/cppmodelmanager.h +++ b/src/plugins/cpptools/cppmodelmanager.h @@ -151,11 +151,11 @@ public slots: private slots: // This should be executed in the GUI thread. - void onAboutToRemoveProject(ProjectExplorer::Project *project); void onAboutToLoadSession(); void onAboutToUnloadSession(); - void onCoreAboutToClose(); void onProjectAdded(ProjectExplorer::Project *project); + void onAboutToRemoveProject(ProjectExplorer::Project *project); + void onCoreAboutToClose(); private: void delayedGC(); diff --git a/src/plugins/cpptools/cppmodelmanager_test.cpp b/src/plugins/cpptools/cppmodelmanager_test.cpp index 7e649a9c014..1fb02ba5ed1 100644 --- a/src/plugins/cpptools/cppmodelmanager_test.cpp +++ b/src/plugins/cpptools/cppmodelmanager_test.cpp @@ -551,3 +551,38 @@ void CppToolsPlugin::test_modelmanager_gc_if_last_cppeditor_closed() QVERIFY(!mm->workingCopy().contains(file)); QVERIFY(!mm->snapshot().contains(file)); } + +/// Check: Files that are open in the editor are not garbage collected. +void CppToolsPlugin::test_modelmanager_dont_gc_opened_files() +{ + ModelManagerTestHelper helper; + + 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)); + + // Check: File is in the working copy and snapshot + QVERIFY(mm->workingCopy().contains(file)); + QVERIFY(mm->snapshot().contains(file)); + + // Run the garbage collector + mm->GC(); + + // Check: File is still there + QVERIFY(mm->workingCopy().contains(file)); + QVERIFY(mm->snapshot().contains(file)); + + // Close editor + em->closeEditors(QList() << editor); + helper.waitForFinishedGc(); + QVERIFY(mm->snapshot().isEmpty()); +} diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index 7b6ae5aad05..de48a8fe218 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -195,6 +195,7 @@ private slots: void test_modelmanager_snapshot_after_two_projects(); void test_modelmanager_extraeditorsupport_uiFiles(); void test_modelmanager_gc_if_last_cppeditor_closed(); + void test_modelmanager_dont_gc_opened_files(); private: void test_completion();