diff options
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_; |