Commit 2665a124 authored by Nikolai Kosjar's avatar Nikolai Kosjar

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: default avatarErik Verbruggen <erik.verbruggen@digia.com>
parent 7583039b
......@@ -714,9 +714,28 @@ void CppModelManager::GC()
if (!m_enableGC)
return;
const Snapshot currentSnapshot = snapshot();
// Collect files of CppEditorSupport and AbstractEditorSupport.
QStringList filesInEditorSupports;
QList<CppEditorSupport *> cppEditorSupports;
{
QMutexLocker locker(&m_cppEditorSupportsMutex);
cppEditorSupports = m_cppEditorSupports.values();
}
foreach (const CppEditorSupport *cppEditorSupport, cppEditorSupports)
filesInEditorSupports << cppEditorSupport->fileName();
QSetIterator<AbstractEditorSupport *> jt(m_extraEditorSupports);
while (jt.hasNext()) {
AbstractEditorSupport *abstractEditorSupport = jt.next();
filesInEditorSupports << abstractEditorSupport->fileName();
}
Snapshot currentSnapshot = snapshot();
QSet<QString> 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()) {
......
......@@ -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();
......
......@@ -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<Core::IEditor*>() << editor);
helper.waitForFinishedGc();
QVERIFY(mm->snapshot().isEmpty());
}
......@@ -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();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment