summaryrefslogtreecommitdiff
path: root/src/lib/language/language.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/language/language.cpp')
-rw-r--r--src/lib/language/language.cpp73
1 files changed, 64 insertions, 9 deletions
diff --git a/src/lib/language/language.cpp b/src/lib/language/language.cpp
index 0530a78a6..f856a052b 100644
--- a/src/lib/language/language.cpp
+++ b/src/lib/language/language.cpp
@@ -104,6 +104,32 @@ void FileTagger::store(PersistentPool &pool) const
}
/*!
+ * \class TagScanner
+ * \brief The \c TagScanner class represents an entity that scans and tags source artifacts.
+ */
+void TagScanner::load(PersistentPool &pool)
+{
+ m_name = pool.idLoadString();
+ pool.stream()
+ >> m_location
+ >> m_inputTags
+ >> m_outputTags;
+ m_scanScript = pool.idLoadS<ScriptFunction>();
+ pool.loadContainerS(m_dependencies);
+}
+
+void TagScanner::store(PersistentPool &pool) const
+{
+ pool.storeString(m_name);
+ pool.stream()
+ << m_location
+ << m_inputTags
+ << m_outputTags;
+ pool.store(m_scanScript);
+ pool.storeContainer(m_dependencies);
+}
+
+/*!
* \class SourceArtifact
* \brief The \c SourceArtifact class represents a source file.
* Everything except the file path is inherited from the surrounding \c ResolvedGroup.
@@ -352,8 +378,9 @@ static bool modulesAreEqual(const ResolvedModuleConstPtr &m1, const ResolvedModu
QString Rule::toString() const
{
- return QLatin1Char('[') + inputs.toStringList().join(QLatin1String(",")) + QLatin1String(" -> ")
- + outputFileTags().toStringList().join(QLatin1String(",")) + QLatin1Char(']');
+ return QLatin1Char('[') + outputFileTags().toStringList().join(QLatin1String(","))
+ + QLatin1String("][")
+ + inputs.toStringList().join(QLatin1String(",")) + QLatin1Char(']');
}
FileTags Rule::outputFileTags() const
@@ -401,6 +428,14 @@ ResolvedProduct::~ResolvedProduct()
{
}
+void ResolvedProduct::accept(BuildGraphVisitor *visitor) const
+{
+ if (!buildData)
+ return;
+ foreach (Artifact *artifact, buildData->targetArtifacts)
+ artifact->accept(visitor);
+}
+
/*!
* \brief Returns all files of all groups as source artifacts.
* This includes the expanded list of wildcards.
@@ -455,6 +490,7 @@ void ResolvedProduct::load(PersistentPool &pool)
pool.loadContainerS(rules);
pool.loadContainerS(dependencies);
pool.loadContainerS(fileTaggers);
+ pool.loadContainerS(tagScanners);
pool.loadContainerS(modules);
pool.loadContainerS(transformers);
pool.loadContainerS(groups);
@@ -478,6 +514,7 @@ void ResolvedProduct::store(PersistentPool &pool) const
pool.storeContainer(rules);
pool.storeContainer(dependencies);
pool.storeContainer(fileTaggers);
+ pool.storeContainer(tagScanners);
pool.storeContainer(modules);
pool.storeContainer(transformers);
pool.storeContainer(groups);
@@ -678,13 +715,13 @@ TopLevelProject *ResolvedProduct::topLevelProject() const
static QStringList findGeneratedFiles(const Artifact *base, const FileTags &tags)
{
QStringList result;
- foreach (const Artifact *parent, base->parents) {
+ foreach (const Artifact *parent, base->parentArtifacts()) {
if (tags.isEmpty() || parent->fileTags.matches(tags))
result << parent->filePath();
}
if (result.isEmpty() || tags.isEmpty())
- foreach (const Artifact *parent, base->parents)
+ foreach (const Artifact *parent, base->parentArtifacts())
result << findGeneratedFiles(parent, tags);
return result;
@@ -696,7 +733,7 @@ QStringList ResolvedProduct::generatedFiles(const QString &baseFile, const FileT
if (!data)
return QStringList();
- foreach (const Artifact *art, data->artifacts) {
+ foreach (const Artifact *art, ArtifactSet::fromNodeSet(data->nodes)) {
if (art->filePath() == baseFile)
return findGeneratedFiles(art, tags);
}
@@ -707,6 +744,12 @@ ResolvedProject::ResolvedProject() : enabled(true), m_topLevelProject(0)
{
}
+void ResolvedProject::accept(BuildGraphVisitor *visitor) const
+{
+ foreach (const ResolvedProductPtr &product, products)
+ product->accept(visitor);
+}
+
TopLevelProject *ResolvedProject::topLevelProject()
{
if (m_topLevelProject)
@@ -755,8 +798,13 @@ void ResolvedProject::load(PersistentPool &pool)
for (; --count >= 0;) {
ResolvedProductPtr rProduct = pool.idLoadS<ResolvedProduct>();
if (rProduct->buildData) {
- foreach (Artifact * const a, rProduct->buildData->artifacts)
- a->product = rProduct;
+ foreach (BuildGraphNode * const node, rProduct->buildData->nodes) {
+ node->product = rProduct;
+
+ // restore parent links
+ foreach (BuildGraphNode *child, node->children)
+ child->parents.insert(node);
+ }
}
products.append(rProduct);
}
@@ -810,6 +858,13 @@ QString TopLevelProject::deriveBuildDirectory(const QString &buildRoot, const QS
return buildRoot + QLatin1Char('/') + id;
}
+void TopLevelProject::accept(BuildGraphVisitor *visitor) const
+{
+ ResolvedProject::accept(visitor);
+ foreach (const ResolvedProjectPtr &subProject, subProjects)
+ subProject->accept(visitor);
+}
+
void TopLevelProject::setBuildConfiguration(const QVariantMap &config)
{
m_buildConfiguration = config;
@@ -1040,7 +1095,7 @@ bool operator==(const SourceArtifact &sa1, const SourceArtifact &sa2)
&& sa1.properties->value() == sa2.properties->value();
}
-bool sourceArtifactListsAreEqual(const QList<SourceArtifactPtr> &l1,
+bool sourceArtifactSetsAreEqual(const QList<SourceArtifactPtr> &l1,
const QList<SourceArtifactPtr> &l2)
{
return listsAreEqual(l1, l2);
@@ -1050,7 +1105,7 @@ bool operator==(const ResolvedTransformer &t1, const ResolvedTransformer &t2)
{
return modulesAreEqual(t1.module, t2.module)
&& t1.inputs.toSet() == t2.inputs.toSet()
- && sourceArtifactListsAreEqual(t1.outputs, t2.outputs)
+ && sourceArtifactSetsAreEqual(t1.outputs, t2.outputs)
&& *t1.transform == *t2.transform;
}