From 2665a1249bd666b260455b43462dcebcefaa3ff4 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 17 Jul 2013 13:50:38 +0200 Subject: [PATCH] CppTools: Do not garbage collect files in the working copy ...except the configuration file if no projects are open. For this case there is no need to keep the configuration file around. Task-number: QTCREATORBUG-9829 Change-Id: I51b01b30c17cbc1ced491ef2c47c338dae6ed983 Reviewed-by: Erik Verbruggen --- src/plugins/cpptools/cppmodelmanager.cpp | 23 ++++++++++-- src/plugins/cpptools/cppmodelmanager.h | 4 +-- src/plugins/cpptools/cppmodelmanager_test.cpp | 35 +++++++++++++++++++ src/plugins/cpptools/cpptoolsplugin.h | 1 + 4 files changed, 59 insertions(+), 4 deletions(-) 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();