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 | |
parent | a1c2e003f921cc4a04c5845ed18d75546a96fd88 (diff) | |
download | justbuild-8206d7cfa6aad9a48628da417c03efd77e78df1e.tar.gz |
AnalysedTarget: Add getter to obtain non-known artifacts
3 files changed, 50 insertions, 0 deletions
diff --git a/src/buildtool/build_engine/analysed_target/TARGETS b/src/buildtool/build_engine/analysed_target/TARGETS index 99668ba4..85c69d45 100644 --- a/src/buildtool/build_engine/analysed_target/TARGETS +++ b/src/buildtool/build_engine/analysed_target/TARGETS @@ -2,9 +2,11 @@ { "type": ["@", "rules", "CC", "library"] , "name": ["target"] , "hdrs": ["analysed_target.hpp"] + , "srcs": ["analysed_target.cpp"] , "deps": [ ["src/buildtool/build_engine/expression", "expression"] , ["src/buildtool/common", "action_description"] + , ["src/buildtool/common", "artifact_description"] , ["src/buildtool/common", "tree"] ] , "stage": ["src", "buildtool", "build_engine", "analysed_target"] 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; +} diff --git a/src/buildtool/build_engine/analysed_target/analysed_target.hpp b/src/buildtool/build_engine/analysed_target/analysed_target.hpp index 16f96071..31375eb9 100644 --- a/src/buildtool/build_engine/analysed_target/analysed_target.hpp +++ b/src/buildtool/build_engine/analysed_target/analysed_target.hpp @@ -11,6 +11,7 @@ #include "src/buildtool/build_engine/expression/expression_ptr.hpp" #include "src/buildtool/build_engine/expression/target_result.hpp" #include "src/buildtool/common/action_description.hpp" +#include "src/buildtool/common/artifact_description.hpp" #include "src/buildtool/common/tree.hpp" class AnalysedTarget { @@ -88,6 +89,9 @@ class AnalysedTarget { [[nodiscard]] auto Result() && noexcept -> TargetResult { return std::move(result_); } + // Obtain a set of all non-known artifacts from artifacts/runfiles/provides. + [[nodiscard]] auto ContainedNonKnownArtifacts() const + -> std::vector<ArtifactDescription>; private: TargetResult result_; |