From f5aa99f2298542c15cd379cd14f5001a55ea5291 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 16 Mar 2023 12:32:53 +0100 Subject: [PATCH] ProjectExplorer: Add functionality for mapping source files to binaries Works out of the box with qbs. cmake and qmake need backend adaptations. Task-number: QTCREATORBUG-28815 Change-Id: I0238416a23c1574bc2b6121e2ef942a9260d94d9 Reviewed-by: Qt CI Bot Reviewed-by: David Schulz --- src/plugins/projectexplorer/project.cpp | 47 ++++++++++++++----- src/plugins/projectexplorer/projectnodes.h | 2 + .../qbsprojectmanager/qbsnodetreebuilder.cpp | 4 ++ 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index e62d65c0f89..b9767fdedcb 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -869,11 +869,32 @@ const Node *Project::nodeForFilePath(const FilePath &filePath, return nullptr; } -FilePaths Project::binariesForSourceFile(const Utils::FilePath &sourceFile) const +FilePaths Project::binariesForSourceFile(const FilePath &sourceFile) const { - Q_UNUSED(sourceFile); - // TODO: QTCREATORBUG-28815 - return {}; + if (!rootProjectNode()) + return {}; + const QList fileNodes = rootProjectNode()->findNodes([&sourceFile](Node *n) { + return n->filePath() == sourceFile; + }); + FilePaths binaries; + for (const Node * const fileNode : fileNodes) { + for (ProjectNode *projectNode = fileNode->parentProjectNode(); projectNode; + projectNode = projectNode->parentProjectNode()) { + if (!projectNode->isProduct()) + continue; + if (projectNode->productType() == ProductType::App + || projectNode->productType() == ProductType::Lib) { + const QList binaryNodes = projectNode->findNodes([](Node *n) { + return n->asFileNode() && (n->asFileNode()->fileType() == FileType::App + || n->asFileNode()->fileType() == FileType::Lib); + + }); + binaries << Utils::transform(binaryNodes, &Node::filePath); + } + break; + } + } + return binaries; } void Project::setProjectLanguages(Context language) @@ -1533,19 +1554,23 @@ void ProjectExplorerPlugin::testSourceToBinaryMapping() } QVERIFY(!bs->isWaitingForParse() && !bs->isParsing()); - // Build project. - BuildManager::buildProjectWithoutDependencies(theProject.project()); - if (BuildManager::isBuilding()) { - QSignalSpy buildingFinishedSpy(BuildManager::instance(), &BuildManager::buildQueueFinished); - QVERIFY(buildingFinishedSpy.wait(10000)); + if (QLatin1String(QTest::currentDataTag()) == QLatin1String("qbs")) { + BuildManager::buildProjectWithoutDependencies(theProject.project()); + if (BuildManager::isBuilding()) { + QSignalSpy buildingFinishedSpy(BuildManager::instance(), &BuildManager::buildQueueFinished); + QVERIFY(buildingFinishedSpy.wait(10000)); + } + QVERIFY(!BuildManager::isBuilding()); + QSignalSpy projectUpdateSpy(theProject.project(), &Project::fileListChanged); + QVERIFY(projectUpdateSpy.wait(5000)); } - QVERIFY(!BuildManager::isBuilding()); // Check mapping const auto binariesForSource = [&](const QString &fileName) { return theProject.project()->binariesForSourceFile(projectDir.pathAppended(fileName)); }; - QEXPECT_FAIL(0, "QTCREATORBUG-28815", Abort); + QEXPECT_FAIL("cmake", "QTCREATORBUG-28815", Abort); + QEXPECT_FAIL("qmake", "QTCREATORBUG-28815", Abort); QCOMPARE(binariesForSource("multi-target-project-main.cpp").size(), 1); QCOMPARE(binariesForSource("multi-target-project-lib.cpp").size(), 1); QCOMPARE(binariesForSource("multi-target-project-shared.h").size(), 2); diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 35927c02c8e..58fbf9cb925 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -32,6 +32,8 @@ enum class FileType : quint16 { Resource, QML, Project, + App, + Lib, FileTypeSize }; diff --git a/src/plugins/qbsprojectmanager/qbsnodetreebuilder.cpp b/src/plugins/qbsprojectmanager/qbsnodetreebuilder.cpp index 55ae7d8ac03..82e896e77a8 100644 --- a/src/plugins/qbsprojectmanager/qbsnodetreebuilder.cpp +++ b/src/plugins/qbsprojectmanager/qbsnodetreebuilder.cpp @@ -42,6 +42,10 @@ static FileType fileType(const QJsonObject &artifact) return FileType::StateChart; if (fileTags.contains("qt.qml.qml")) return FileType::QML; + if (fileTags.contains("application")) + return FileType::App; + if (fileTags.contains("staticlibrary") || fileTags.contains("dynamiclibrary")) + return FileType::Lib; return FileType::Unknown; }