summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildtool/build_engine/analysed_target/TARGETS2
-rw-r--r--src/buildtool/build_engine/analysed_target/analysed_target.cpp44
-rw-r--r--src/buildtool/build_engine/analysed_target/analysed_target.hpp4
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_;