summaryrefslogtreecommitdiff
path: root/src/buildtool/build_engine/analysed_target/analysed_target.cpp
diff options
context:
space:
mode:
authorOliver Reiche <oliver.reiche@huawei.com>2022-06-13 13:30:13 +0200
committerOliver Reiche <oliver.reiche@huawei.com>2022-06-13 15:55:41 +0200
commit8206d7cfa6aad9a48628da417c03efd77e78df1e (patch)
tree3f2266e0821b30ddd8ffe2f5b30d9d86c7152fa9 /src/buildtool/build_engine/analysed_target/analysed_target.cpp
parenta1c2e003f921cc4a04c5845ed18d75546a96fd88 (diff)
downloadjustbuild-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.cpp44
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;
+}