aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib/corelib/api/project.cpp13
-rw-r--r--src/lib/corelib/api/project.h2
-rw-r--r--src/lib/corelib/language/language.cpp14
-rw-r--r--src/lib/corelib/language/language.h2
-rw-r--r--tests/auto/api/testdata/generated-files-list/generated-files-list.qbs12
-rw-r--r--tests/auto/api/testdata/generated-files-list/main.cpp11
-rw-r--r--tests/auto/api/testdata/generated-files-list/mainwindow.cpp14
-rw-r--r--tests/auto/api/testdata/generated-files-list/mainwindow.h22
-rw-r--r--tests/auto/api/testdata/generated-files-list/mainwindow.ui24
-rw-r--r--tests/auto/api/tst_api.cpp33
-rw-r--r--tests/auto/api/tst_api.h1
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();