diff options
-rw-r--r-- | src/lib/corelib/api/project.cpp | 13 | ||||
-rw-r--r-- | src/lib/corelib/api/project.h | 2 | ||||
-rw-r--r-- | src/lib/corelib/language/language.cpp | 14 | ||||
-rw-r--r-- | src/lib/corelib/language/language.h | 2 | ||||
-rw-r--r-- | tests/auto/api/testdata/generated-files-list/generated-files-list.qbs | 12 | ||||
-rw-r--r-- | tests/auto/api/testdata/generated-files-list/main.cpp | 11 | ||||
-rw-r--r-- | tests/auto/api/testdata/generated-files-list/mainwindow.cpp | 14 | ||||
-rw-r--r-- | tests/auto/api/testdata/generated-files-list/mainwindow.h | 22 | ||||
-rw-r--r-- | tests/auto/api/testdata/generated-files-list/mainwindow.ui | 24 | ||||
-rw-r--r-- | tests/auto/api/tst_api.cpp | 33 | ||||
-rw-r--r-- | tests/auto/api/tst_api.h | 1 |
11 files changed, 131 insertions, 17 deletions
diff --git a/src/lib/corelib/api/project.cpp b/src/lib/corelib/api/project.cpp index 78fdb6797..a8707a7b6 100644 --- a/src/lib/corelib/api/project.cpp +++ b/src/lib/corelib/api/project.cpp @@ -1074,18 +1074,17 @@ void Project::updateTimestamps(const QList<ProductData> &products) /*! * \brief Finds files generated from the given file in the given product. - * The function returns files generated from the given file and the given product. To do so it will - * traverse the graph of generated files and the files generated from those files. - * - * If an empty list of tags is given, then all directly and indirectly generated files will be - * returned. If there are tags, then processing will stop once matching files were found. + * If \a recursive is \c false, only files generated directly from \a file will be considered, + * otherwise the generated files are collected recursively. + * If \a tags is not empty, only generated files matching at least one of these tags will + * be considered. */ QStringList Project::generatedFiles(const ProductData &product, const QString &file, - const QStringList &tags) const + bool recursive, const QStringList &tags) const { QBS_ASSERT(isValid(), return QStringList()); const ResolvedProductConstPtr internalProduct = d->internalProduct(product); - return internalProduct->generatedFiles(file, FileTags::fromStringList(tags)); + return internalProduct->generatedFiles(file, recursive, FileTags::fromStringList(tags)); } QVariantMap Project::projectConfiguration() const diff --git a/src/lib/corelib/api/project.h b/src/lib/corelib/api/project.h index 589e06861..2f0a5a620 100644 --- a/src/lib/corelib/api/project.h +++ b/src/lib/corelib/api/project.h @@ -125,7 +125,7 @@ public: bool operator==(const Project &other) const { return d.data() == other.d.data(); } QStringList generatedFiles(const ProductData &product, const QString &file, - const QStringList &tags = QStringList()) const; + bool recursive, const QStringList &tags = QStringList()) const; QVariantMap projectConfiguration() const; QHash<QString, QString> usedEnvironment() const; diff --git a/src/lib/corelib/language/language.cpp b/src/lib/corelib/language/language.cpp index fa57cc1c8..6abba8d20 100644 --- a/src/lib/corelib/language/language.cpp +++ b/src/lib/corelib/language/language.cpp @@ -728,22 +728,20 @@ QString ResolvedProduct::uniqueName() const return uniqueName(name, profile); } -static QStringList findGeneratedFiles(const Artifact *base, const FileTags &tags) +static QStringList findGeneratedFiles(const Artifact *base, bool recursive, const FileTags &tags) { QStringList result; foreach (const Artifact *parent, base->parentArtifacts()) { if (tags.isEmpty() || parent->fileTags().matches(tags)) result << parent->filePath(); + if (recursive) + result << findGeneratedFiles(parent, true, tags); } - - if (result.isEmpty() || tags.isEmpty()) - foreach (const Artifact *parent, base->parentArtifacts()) - result << findGeneratedFiles(parent, tags); - return result; } -QStringList ResolvedProduct::generatedFiles(const QString &baseFile, const FileTags &tags) const +QStringList ResolvedProduct::generatedFiles(const QString &baseFile, bool recursive, + const FileTags &tags) const { ProductBuildData *data = buildData.data(); if (!data) @@ -751,7 +749,7 @@ QStringList ResolvedProduct::generatedFiles(const QString &baseFile, const FileT foreach (const Artifact *art, ArtifactSet::fromNodeSet(data->nodes)) { if (art->filePath() == baseFile) - return findGeneratedFiles(art, tags); + return findGeneratedFiles(art, recursive, tags); } return QStringList(); } diff --git a/src/lib/corelib/language/language.h b/src/lib/corelib/language/language.h index 857170fe0..d098d189d 100644 --- a/src/lib/corelib/language/language.h +++ b/src/lib/corelib/language/language.h @@ -395,7 +395,7 @@ public: static QString uniqueName(const QString &name, const QString &profile); QString uniqueName() const; - QStringList generatedFiles(const QString &baseFile, const FileTags &tags) const; + QStringList generatedFiles(const QString &baseFile, bool recursive, const FileTags &tags) const; static QString deriveBuildDirectoryName(const QString &name, const QString &profile); QString buildDirectory() const; diff --git a/tests/auto/api/testdata/generated-files-list/generated-files-list.qbs b/tests/auto/api/testdata/generated-files-list/generated-files-list.qbs new file mode 100644 index 000000000..004452f21 --- /dev/null +++ b/tests/auto/api/testdata/generated-files-list/generated-files-list.qbs @@ -0,0 +1,12 @@ +import qbs + +CppApplication { + Depends { name: "Qt.widgets" } + files: [ + "main.cpp", + "mainwindow.cpp", + "mainwindow.h", + "mainwindow.ui" + ] +} + diff --git a/tests/auto/api/testdata/generated-files-list/main.cpp b/tests/auto/api/testdata/generated-files-list/main.cpp new file mode 100644 index 000000000..b48f94ec8 --- /dev/null +++ b/tests/auto/api/testdata/generated-files-list/main.cpp @@ -0,0 +1,11 @@ +#include "mainwindow.h" +#include <QApplication> + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + + return a.exec(); +} diff --git a/tests/auto/api/testdata/generated-files-list/mainwindow.cpp b/tests/auto/api/testdata/generated-files-list/mainwindow.cpp new file mode 100644 index 000000000..49d64fce7 --- /dev/null +++ b/tests/auto/api/testdata/generated-files-list/mainwindow.cpp @@ -0,0 +1,14 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + ui->setupUi(this); +} + +MainWindow::~MainWindow() +{ + delete ui; +} diff --git a/tests/auto/api/testdata/generated-files-list/mainwindow.h b/tests/auto/api/testdata/generated-files-list/mainwindow.h new file mode 100644 index 000000000..1e645a339 --- /dev/null +++ b/tests/auto/api/testdata/generated-files-list/mainwindow.h @@ -0,0 +1,22 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include <QMainWindow> + +QT_BEGIN_NAMESPACE +namespace Ui { class MainWindow; } +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); + +private: + Ui::MainWindow *ui; +}; + +#endif // MAINWINDOW_H diff --git a/tests/auto/api/testdata/generated-files-list/mainwindow.ui b/tests/auto/api/testdata/generated-files-list/mainwindow.ui new file mode 100644 index 000000000..6050363fa --- /dev/null +++ b/tests/auto/api/testdata/generated-files-list/mainwindow.ui @@ -0,0 +1,24 @@ +<ui version="4.0"> + <class>MainWindow</class> + <widget class="QMainWindow" name="MainWindow" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle" > + <string>MainWindow</string> + </property> + <widget class="QMenuBar" name="menuBar" /> + <widget class="QToolBar" name="mainToolBar" /> + <widget class="QWidget" name="centralWidget" /> + <widget class="QStatusBar" name="statusBar" /> + </widget> + <layoutDefault spacing="6" margin="11" /> + <pixmapfunction></pixmapfunction> + <resources/> + <connections/> +</ui> diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp index fcd673b82..35126e79c 100644 --- a/tests/auto/api/tst_api.cpp +++ b/tests/auto/api/tst_api.cpp @@ -944,6 +944,39 @@ void TestApi::fileTagsFilterOverride() QVERIFY(installableFiles.first().targetFilePath().contains("habicht")); } +void TestApi::generatedFilesList() +{ + qbs::SetupProjectParameters setupParams + = defaultSetupParameters("generated-files-list/generated-files-list.qbs"); + QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(setupParams, + m_logSink, 0)); + QVERIFY(waitForFinished(setupJob.data())); + QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString())); + qbs::Project project = setupJob->project(); + const QScopedPointer<qbs::BuildJob> buildJob(project.buildAllProducts(qbs::BuildOptions())); + QVERIFY(waitForFinished(buildJob.data())); + const qbs::ProjectData projectData = project.projectData(); + QCOMPARE(projectData.products().count(), 1); + const qbs::ProductData product = projectData.products().first(); + QString uiFilePath; + foreach (const qbs::GroupData &group, product.groups()) { + foreach (const qbs::SourceArtifact &a, group.sourceArtifacts()) { + if (a.fileTags().contains(QLatin1String("ui"))) { + uiFilePath = a.filePath(); + break; + } + } + if (!uiFilePath.isEmpty()) + break; + } + QVERIFY(!uiFilePath.isEmpty()); + const QStringList directParents = project.generatedFiles(product, uiFilePath, false); + QCOMPARE(directParents.count(), 1); + QCOMPARE(QFileInfo(directParents.first()).fileName(), QLatin1String("ui_mainwindow.h")); + const QStringList allParents = project.generatedFiles(product, uiFilePath, true); + QCOMPARE(allParents.count(), 3); +} + void TestApi::infiniteLoopBuilding() { QFETCH(QString, projectDirName); diff --git a/tests/auto/api/tst_api.h b/tests/auto/api/tst_api.h index 606802f88..6a3f50e1c 100644 --- a/tests/auto/api/tst_api.h +++ b/tests/auto/api/tst_api.h @@ -82,6 +82,7 @@ private slots: void exportWithRecursiveDepends(); void fileTagger(); void fileTagsFilterOverride(); + void generatedFilesList(); void infiniteLoopBuilding(); void infiniteLoopBuilding_data(); void infiniteLoopResolving(); |