diff options
author | Oliver Reiche <oliver.reiche@huawei.com> | 2022-06-13 13:30:13 +0200 |
---|---|---|
committer | Oliver Reiche <oliver.reiche@huawei.com> | 2022-06-13 15:55:41 +0200 |
commit | 8206d7cfa6aad9a48628da417c03efd77e78df1e (patch) | |
tree | 3f2266e0821b30ddd8ffe2f5b30d9d86c7152fa9 /src/buildtool/build_engine/analysed_target/analysed_target.cpp | |
parent | a1c2e003f921cc4a04c5845ed18d75546a96fd88 (diff) | |
download | justbuild-8206d7cfa6aad9a48628da417c03efd77e78df1e.tar.gz |
AnalysedTarget: Add getter to obtain non-known artifacts
Diffstat (limited to 'src/buildtool/build_engine/analysed_target/analysed_target.cpp')
-rw-r--r-- | src/buildtool/build_engine/analysed_target/analysed_target.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/buildtool/build_engine/analysed_target/analysed_target.cpp b/src/buildtool/build_engine/analysed_target/analysed_target.cpp new file mode 100644 index 00000000..7124e672 --- /dev/null +++ b/src/buildtool/build_engine/analysed_target/analysed_target.cpp @@ -0,0 +1,44 @@ +#include "src/buildtool/build_engine/analysed_target/analysed_target.hpp" + +namespace { + +// NOLINTNEXTLINE(misc-no-recursion) +void CollectNonKnownArtifacts( + ExpressionPtr const& expr, + gsl::not_null<std::vector<ArtifactDescription>*> const& artifacts, + gsl::not_null<std::unordered_set<ExpressionPtr>*> const& traversed) { + if (not traversed->contains(expr)) { + if (expr->IsMap()) { + auto result_map = Expression::map_t::underlying_map_t{}; + for (auto const& [key, val] : expr->Map()) { + CollectNonKnownArtifacts(val, artifacts, traversed); + } + } + else if (expr->IsList()) { + auto result_list = Expression::list_t{}; + result_list.reserve(expr->List().size()); + for (auto const& val : expr->List()) { + CollectNonKnownArtifacts(val, artifacts, traversed); + } + } + else if (expr->IsArtifact()) { + auto const& artifact = expr->Artifact(); + if (not artifact.IsKnown()) { + artifacts->emplace_back(artifact); + } + } + traversed->emplace(expr); + } +} + +} // namespace + +auto AnalysedTarget::ContainedNonKnownArtifacts() const + -> std::vector<ArtifactDescription> { + auto artifacts = std::vector<ArtifactDescription>{}; + auto traversed = std::unordered_set<ExpressionPtr>{}; + CollectNonKnownArtifacts(Artifacts(), &artifacts, &traversed); + CollectNonKnownArtifacts(RunFiles(), &artifacts, &traversed); + CollectNonKnownArtifacts(Provides(), &artifacts, &traversed); + return artifacts; +} |