ProjectExplorer: Prevent target switch on project that's to be removed

Switching targets starts up a lot of machinery that is undesired for a
project that's going away.
The same goes for switching build configurations on a target that is
being removed.

Fixes: QTCREATORBUG-25655
Change-Id: I0cb6e395cca8f89bfeb70fcdf571bbcb64f94247
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Christian Kandeler
2021-05-05 11:18:51 +02:00
parent eafba223a5
commit 201786d3fc
19 changed files with 158 additions and 1 deletions

View File

@@ -187,6 +187,7 @@ public:
bool m_hasMakeInstallEquivalent = false;
bool m_needsBuildConfigurations = true;
bool m_needsDeployConfigurations = true;
bool m_shuttingDown = false;
std::function<BuildSystem *(Target *)> m_buildSystemCreator;
@@ -246,6 +247,16 @@ Utils::Id Project::id() const
return d->m_id;
}
void Project::markAsShuttingDown()
{
d->m_shuttingDown = true;
}
bool Project::isShuttingDown() const
{
return d->m_shuttingDown;
}
QString Project::mimeType() const
{
return d->m_document->mimeType();
@@ -311,6 +322,7 @@ bool Project::removeTarget(Target *target)
if (BuildManager::isBuilding(target))
return false;
target->markAsShuttingDown();
emit aboutToRemoveTarget(target);
auto keep = Utils::take(d->m_targets, target);
if (target == d->m_activeTarget) {
@@ -1065,10 +1077,14 @@ QStringList Project::availableQmlPreviewTranslations(QString *errorMessage)
} // namespace ProjectExplorer
#include <coreplugin/editormanager/editormanager.h>
#include <utils/hostosinfo.h>
#include <utils/temporarydirectory.h>
#include <QTest>
#include <QEventLoop>
#include <QSignalSpy>
#include <QTest>
#include <QTimer>
namespace ProjectExplorer {
@@ -1265,6 +1281,60 @@ void ProjectExplorerPlugin::testProject_projectTree()
QVERIFY(!project.rootProjectNode());
}
void ProjectExplorerPlugin::testProject_multipleBuildConfigs()
{
// Find suitable kit.
Kit * const kit = Utils::findOr(KitManager::kits(), nullptr, [](const Kit *k) {
return k->isValid();
});
if (!kit)
QSKIP("The test requires at least one valid kit.");
// Copy project from qrc file and set it up.
using namespace Utils;
QTemporaryDir * const tempDir = TemporaryDirectory::masterTemporaryDirectory();
QVERIFY(tempDir->isValid());
QString error;
const FilePath projectDir = FilePath::fromString(tempDir->path() + "/generic-project");
FileUtils::copyRecursively(FilePath::fromString(":/projectexplorer/testdata/generic-project"),
projectDir, &error);
QVERIFY2(error.isEmpty(), qPrintable(error));
const QFileInfoList files = QDir(projectDir.toString()).entryInfoList(QDir::Files | QDir::Dirs);
for (const QFileInfo &f : files)
QFile(f.absoluteFilePath()).setPermissions(f.permissions() | QFile::WriteUser);
const auto theProject = openProject(projectDir.pathAppended("generic-project.creator")
.toString());
QVERIFY2(theProject, qPrintable(theProject.errorMessage()));
theProject.project()->configureAsExampleProject(kit);
QCOMPARE(theProject.project()->targets().size(), 1);
Target * const target = theProject.project()->activeTarget();
QVERIFY(target);
QCOMPARE(target->buildConfigurations().size(), 6);
SessionManager::setActiveBuildConfiguration(target, target->buildConfigurations().at(1),
SetActive::Cascade);
BuildSystem * const bs = theProject.project()->activeTarget()->buildSystem();
QVERIFY(bs);
QCOMPARE(bs, target->activeBuildConfiguration()->buildSystem());
if (bs->isWaitingForParse() || bs->isParsing()) {
QEventLoop loop;
QTimer t;
t.setSingleShot(true);
connect(&t, &QTimer::timeout, &loop, &QEventLoop::quit);
connect(bs, &BuildSystem::parsingFinished, &loop, &QEventLoop::quit);
t.start(10000);
QVERIFY(loop.exec());
QVERIFY(t.isActive());
}
QVERIFY(!bs->isWaitingForParse() && !bs->isParsing());
QCOMPARE(SessionManager::startupProject(), theProject.project());
QCOMPARE(ProjectTree::currentProject(), theProject.project());
QVERIFY(Core::EditorManager::openEditor(projectDir.pathAppended("main.cpp").toString()));
QVERIFY(ProjectTree::currentNode());
ProjectTree::instance()->expandAll();
SessionManager::closeAllProjects(); // QTCREATORBUG-25655
}
#endif // WITH_TESTS
} // namespace ProjectExplorer