From 8206d7cfa6aad9a48628da417c03efd77e78df1e Mon Sep 17 00:00:00 2001 From: Oliver Reiche Date: Mon, 13 Jun 2022 13:30:13 +0200 Subject: AnalysedTarget: Add getter to obtain non-known artifacts --- .../analysed_target/analysed_target.cpp | 44 ++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/buildtool/build_engine/analysed_target/analysed_target.cpp (limited to 'src/buildtool/build_engine/analysed_target/analysed_target.cpp') 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*> const& artifacts, + gsl::not_null*> 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 { + auto artifacts = std::vector{}; + auto traversed = std::unordered_set{}; + CollectNonKnownArtifacts(Artifacts(), &artifacts, &traversed); + CollectNonKnownArtifacts(RunFiles(), &artifacts, &traversed); + CollectNonKnownArtifacts(Provides(), &artifacts, &traversed); + return artifacts; +} -- cgit v1.2.3