diff options
Diffstat (limited to 'src/lib/language/language.cpp')
| -rw-r--r-- | src/lib/language/language.cpp | 73 |
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; } |
