summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/build_engine/analysed_target/analysed_target.hpp18
-rw-r--r--src/buildtool/build_engine/base_maps/source_map.cpp4
-rw-r--r--src/buildtool/build_engine/target_map/built_in_rules.cpp14
-rw-r--r--src/buildtool/build_engine/target_map/export.cpp4
-rw-r--r--src/buildtool/build_engine/target_map/result_map.hpp39
-rw-r--r--src/buildtool/build_engine/target_map/target_map.cpp10
-rw-r--r--src/buildtool/build_engine/target_map/utils.cpp22
-rw-r--r--src/buildtool/build_engine/target_map/utils.hpp6
-rw-r--r--src/buildtool/common/action_description.hpp8
-rw-r--r--src/buildtool/common/tree.hpp12
-rw-r--r--src/buildtool/execution_engine/dag/dag.cpp10
-rw-r--r--src/buildtool/execution_engine/dag/dag.hpp3
-rw-r--r--src/buildtool/graph_traverser/graph_traverser.hpp16
-rw-r--r--src/buildtool/main/main.cpp11
14 files changed, 99 insertions, 78 deletions
diff --git a/src/buildtool/build_engine/analysed_target/analysed_target.hpp b/src/buildtool/build_engine/analysed_target/analysed_target.hpp
index af92b0bc..16f96071 100644
--- a/src/buildtool/build_engine/analysed_target/analysed_target.hpp
+++ b/src/buildtool/build_engine/analysed_target/analysed_target.hpp
@@ -16,9 +16,9 @@
class AnalysedTarget {
public:
AnalysedTarget(TargetResult result,
- std::vector<ActionDescription> actions,
+ std::vector<ActionDescription::Ptr> actions,
std::vector<std::string> blobs,
- std::vector<Tree> trees,
+ std::vector<Tree::Ptr> trees,
std::unordered_set<std::string> vars,
std::set<std::string> tainted)
: result_{std::move(result)},
@@ -29,10 +29,11 @@ class AnalysedTarget {
tainted_{std::move(tainted)} {}
[[nodiscard]] auto Actions() const& noexcept
- -> std::vector<ActionDescription> const& {
+ -> std::vector<ActionDescription::Ptr> const& {
return actions_;
}
- [[nodiscard]] auto Actions() && noexcept -> std::vector<ActionDescription> {
+ [[nodiscard]] auto Actions() && noexcept
+ -> std::vector<ActionDescription::Ptr> {
return std::move(actions_);
}
[[nodiscard]] auto Artifacts() const& noexcept -> ExpressionPtr const& {
@@ -57,10 +58,11 @@ class AnalysedTarget {
-> std::vector<std::string> const& {
return blobs_;
}
- [[nodiscard]] auto Trees() && noexcept -> std::vector<Tree> {
+ [[nodiscard]] auto Trees() && noexcept -> std::vector<Tree::Ptr> {
return std::move(trees_);
}
- [[nodiscard]] auto Trees() const& noexcept -> std::vector<Tree> const& {
+ [[nodiscard]] auto Trees() const& noexcept
+ -> std::vector<Tree::Ptr> const& {
return trees_;
}
[[nodiscard]] auto Blobs() && noexcept -> std::vector<std::string> {
@@ -89,9 +91,9 @@ class AnalysedTarget {
private:
TargetResult result_;
- std::vector<ActionDescription> actions_;
+ std::vector<ActionDescription::Ptr> actions_;
std::vector<std::string> blobs_;
- std::vector<Tree> trees_;
+ std::vector<Tree::Ptr> trees_;
std::unordered_set<std::string> vars_;
std::set<std::string> tainted_;
};
diff --git a/src/buildtool/build_engine/base_maps/source_map.cpp b/src/buildtool/build_engine/base_maps/source_map.cpp
index 5c2a79d0..6a6d49c0 100644
--- a/src/buildtool/build_engine/base_maps/source_map.cpp
+++ b/src/buildtool/build_engine/base_maps/source_map.cpp
@@ -17,9 +17,9 @@ auto as_target(const BuildMaps::Base::EntityName& key, ExpressionPtr artifact)
ExpressionPtr{Expression::map_t{key.name, std::move(artifact)}};
return std::make_shared<AnalysedTarget>(
TargetResult{stage, Expression::kEmptyMap, stage},
- std::vector<ActionDescription>{},
+ std::vector<ActionDescription::Ptr>{},
std::vector<std::string>{},
- std::vector<Tree>{},
+ std::vector<Tree::Ptr>{},
std::unordered_set<std::string>{},
std::set<std::string>{});
}
diff --git a/src/buildtool/build_engine/target_map/built_in_rules.cpp b/src/buildtool/build_engine/target_map/built_in_rules.cpp
index b98484b6..b5256158 100644
--- a/src/buildtool/build_engine/target_map/built_in_rules.cpp
+++ b/src/buildtool/build_engine/target_map/built_in_rules.cpp
@@ -147,9 +147,9 @@ void FileGenRuleWithDeps(
vars_set.insert(param_vars->begin(), param_vars->end());
auto analysis_result = std::make_shared<AnalysedTarget>(
TargetResult{stage, ExpressionPtr{Expression::map_t{}}, stage},
- std::vector<ActionDescription>{},
+ std::vector<ActionDescription::Ptr>{},
std::vector<std::string>{data_val->String()},
- std::vector<Tree>{},
+ std::vector<Tree::Ptr>{},
std::move(vars_set),
std::move(tainted));
analysis_result =
@@ -344,9 +344,9 @@ void InstallRuleWithDeps(
auto const& empty_map = Expression::kEmptyMap;
auto result =
std::make_shared<AnalysedTarget>(TargetResult{stage, empty_map, stage},
- std::vector<ActionDescription>{},
+ std::vector<ActionDescription::Ptr>{},
std::vector<std::string>{},
- std::vector<Tree>{},
+ std::vector<Tree::Ptr>{},
std::move(effective_vars),
std::move(tainted));
@@ -708,7 +708,7 @@ void GenericRuleWithDeps(
std::nullopt,
false,
inputs);
- auto action_identifier = action.Id();
+ auto action_identifier = action->Id();
Expression::map_t::underlying_map_t artifacts;
for (auto const& path : outs) {
artifacts.emplace(path,
@@ -720,9 +720,9 @@ void GenericRuleWithDeps(
auto result = std::make_shared<AnalysedTarget>(
TargetResult{
ExpressionPtr{Expression::map_t{artifacts}}, empty_map, empty_map},
- std::vector<ActionDescription>{action},
+ std::vector<ActionDescription::Ptr>{action},
std::vector<std::string>{},
- std::vector<Tree>{},
+ std::vector<Tree::Ptr>{},
std::move(effective_vars),
std::move(tainted));
diff --git a/src/buildtool/build_engine/target_map/export.cpp b/src/buildtool/build_engine/target_map/export.cpp
index cea76d36..73fcbb08 100644
--- a/src/buildtool/build_engine/target_map/export.cpp
+++ b/src/buildtool/build_engine/target_map/export.cpp
@@ -40,9 +40,9 @@ void FinalizeExport(
// action
auto analysis_result = std::make_shared<AnalysedTarget>(
TargetResult{(*value)->Artifacts(), provides, (*value)->RunFiles()},
- std::vector<ActionDescription>{},
+ std::vector<ActionDescription::Ptr>{},
std::vector<std::string>{},
- std::vector<Tree>{},
+ std::vector<Tree::Ptr>{},
std::move(vars_set),
std::set<std::string>{});
analysis_result =
diff --git a/src/buildtool/build_engine/target_map/result_map.hpp b/src/buildtool/build_engine/target_map/result_map.hpp
index 09304631..97d2bcf7 100644
--- a/src/buildtool/build_engine/target_map/result_map.hpp
+++ b/src/buildtool/build_engine/target_map/result_map.hpp
@@ -25,22 +25,22 @@ namespace BuildMaps::Target {
class ResultTargetMap {
public:
struct ActionWithOrigin {
- ActionDescription desc;
+ ActionDescription::Ptr desc;
nlohmann::json origin;
};
template <bool kIncludeOrigins = false>
struct ResultType {
- std::vector<ActionDescription> actions{};
+ std::vector<ActionDescription::Ptr> actions{};
std::vector<std::string> blobs{};
- std::vector<Tree> trees{};
+ std::vector<Tree::Ptr> trees{};
};
template <>
struct ResultType</*kIncludeOrigins=*/true> {
std::vector<ActionWithOrigin> actions{};
std::vector<std::string> blobs{};
- std::vector<Tree> trees{};
+ std::vector<Tree::Ptr> trees{};
};
explicit ResultTargetMap(std::size_t jobs) : width_{ComputeWidth(jobs)} {}
@@ -122,7 +122,7 @@ class ResultTargetMap {
[&origin_map, &pos, &el](auto const& action) {
std::pair<ConfiguredTarget, std::size_t> origin{
el.first, pos++};
- auto id = action.Id();
+ auto id = action->Id();
if (origin_map.contains(id)) {
origin_map[id].push_back(origin);
}
@@ -161,7 +161,7 @@ class ResultTargetMap {
[&result, &origin_map](auto const& action) {
auto origins = nlohmann::json::array();
for (auto const& [ct, count] :
- origin_map[action.Id()]) {
+ origin_map[action->Id()]) {
origins.push_back(nlohmann::json{
{"target", ct.target.ToJson()},
{"subtask", count},
@@ -191,23 +191,24 @@ class ResultTargetMap {
auto lastblob = std::unique(result.blobs.begin(), result.blobs.end());
result.blobs.erase(lastblob, result.blobs.end());
- std::sort(result.trees.begin(),
- result.trees.end(),
- [](auto left, auto right) { return left.Id() < right.Id(); });
+ std::sort(
+ result.trees.begin(),
+ result.trees.end(),
+ [](auto left, auto right) { return left->Id() < right->Id(); });
auto lasttree = std::unique(
result.trees.begin(),
result.trees.end(),
- [](auto left, auto right) { return left.Id() == right.Id(); });
+ [](auto left, auto right) { return left->Id() == right->Id(); });
result.trees.erase(lasttree, result.trees.end());
std::sort(result.actions.begin(),
result.actions.end(),
[](auto left, auto right) {
if constexpr (kIncludeOrigins) {
- return left.desc.Id() < right.desc.Id();
+ return left.desc->Id() < right.desc->Id();
}
else {
- return left.Id() < right.Id();
+ return left->Id() < right->Id();
}
});
auto lastaction =
@@ -215,10 +216,10 @@ class ResultTargetMap {
result.actions.end(),
[](auto left, auto right) {
if constexpr (kIncludeOrigins) {
- return left.desc.Id() == right.desc.Id();
+ return left.desc->Id() == right.desc->Id();
}
else {
- return left.Id() == right.Id();
+ return left->Id() == right->Id();
}
});
result.actions.erase(lastaction, result.actions.end());
@@ -235,19 +236,19 @@ class ResultTargetMap {
result.actions.end(),
[&actions](auto const& action) {
if constexpr (kIncludeOrigins) {
- auto const& id = action.desc.GraphAction().Id();
- actions[id] = action.desc.ToJson();
+ auto const& id = action.desc->GraphAction().Id();
+ actions[id] = action.desc->ToJson();
actions[id]["origins"] = action.origin;
}
else {
- auto const& id = action.GraphAction().Id();
- actions[id] = action.ToJson();
+ auto const& id = action->GraphAction().Id();
+ actions[id] = action->ToJson();
}
});
std::for_each(
result.trees.begin(),
result.trees.end(),
- [&trees](auto const& tree) { trees[tree.Id()] = tree.ToJson(); });
+ [&trees](auto const& tree) { trees[tree->Id()] = tree->ToJson(); });
return nlohmann::json{
{"actions", actions}, {"blobs", result.blobs}, {"trees", trees}};
}
diff --git a/src/buildtool/build_engine/target_map/target_map.cpp b/src/buildtool/build_engine/target_map/target_map.cpp
index 327dbe02..159669b7 100644
--- a/src/buildtool/build_engine/target_map/target_map.cpp
+++ b/src/buildtool/build_engine/target_map/target_map.cpp
@@ -302,9 +302,9 @@ void withDependencies(
// Evaluate main expression
auto expression_config = key.config.Prune(config_vars);
- std::vector<ActionDescription> actions{};
+ std::vector<ActionDescription::Ptr> actions{};
std::vector<std::string> blobs{};
- std::vector<Tree> trees{};
+ std::vector<Tree::Ptr> trees{};
auto main_exp_fcts = FunctionMap::MakePtr(
{{"FIELD",
[&params](auto&& eval, auto const& expr, auto const& env) {
@@ -496,7 +496,7 @@ void withDependencies(
may_fail,
no_cache,
inputs_exp);
- auto action_id = action.Id();
+ auto action_id = action->Id();
actions.emplace_back(std::move(action));
for (auto const& out : outputs) {
result.emplace(out,
@@ -566,8 +566,8 @@ void withDependencies(
throw Evaluator::EvaluationError{
fmt::format("TREE conflicts on subtree {}", *conflict)};
}
- auto tree = Tree{std::move(artifacts)};
- auto tree_id = tree.Id();
+ auto tree = std::make_shared<Tree>(std::move(artifacts));
+ auto tree_id = tree->Id();
trees.emplace_back(std::move(tree));
return ExpressionPtr{ArtifactDescription{tree_id}};
}},
diff --git a/src/buildtool/build_engine/target_map/utils.cpp b/src/buildtool/build_engine/target_map/utils.cpp
index 8c5353ce..e84634da 100644
--- a/src/buildtool/build_engine/target_map/utils.cpp
+++ b/src/buildtool/build_engine/target_map/utils.cpp
@@ -152,13 +152,13 @@ auto hash_vector(std::vector<std::string> const& vec) -> std::string {
} // namespace
auto BuildMaps::Target::Utils::createAction(
- ActionDescription::outputs_t output_files,
- ActionDescription::outputs_t output_dirs,
+ const ActionDescription::outputs_t& output_files,
+ const ActionDescription::outputs_t& output_dirs,
std::vector<std::string> command,
const ExpressionPtr& env,
std::optional<std::string> may_fail,
bool no_cache,
- const ExpressionPtr& inputs_exp) -> ActionDescription {
+ const ExpressionPtr& inputs_exp) -> ActionDescription::Ptr {
auto hasher = HashGenerator{BuildMaps::Target::Utils::kActionHash}
.IncrementalHasher();
hasher.Update(hash_vector(output_files));
@@ -186,12 +186,12 @@ auto BuildMaps::Target::Utils::createAction(
for (auto const& [input_path, artifact] : inputs_exp->Map()) {
inputs.emplace(input_path, artifact->Artifact());
}
- return ActionDescription{std::move(output_files),
- std::move(output_dirs),
- Action{std::move(action_id),
- std::move(command),
- std::move(env_vars),
- std::move(may_fail),
- no_cache},
- std::move(inputs)};
+ return std::make_shared<ActionDescription>(output_files,
+ output_dirs,
+ Action{std::move(action_id),
+ std::move(command),
+ std::move(env_vars),
+ std::move(may_fail),
+ no_cache},
+ std::move(inputs));
}
diff --git a/src/buildtool/build_engine/target_map/utils.hpp b/src/buildtool/build_engine/target_map/utils.hpp
index e92e6281..f805cde3 100644
--- a/src/buildtool/build_engine/target_map/utils.hpp
+++ b/src/buildtool/build_engine/target_map/utils.hpp
@@ -43,13 +43,13 @@ auto getTainted(std::set<std::string>* tainted,
const ExpressionPtr& tainted_exp,
const BuildMaps::Target::TargetMap::LoggerPtr& logger) -> bool;
-auto createAction(ActionDescription::outputs_t output_files,
- ActionDescription::outputs_t output_dirs,
+auto createAction(const ActionDescription::outputs_t& output_files,
+ const ActionDescription::outputs_t& output_dirs,
std::vector<std::string> command,
const ExpressionPtr& env,
std::optional<std::string> may_fail,
bool no_cache,
- const ExpressionPtr& inputs_exp) -> ActionDescription;
+ const ExpressionPtr& inputs_exp) -> ActionDescription::Ptr;
} // namespace BuildMaps::Target::Utils
#endif
diff --git a/src/buildtool/common/action_description.hpp b/src/buildtool/common/action_description.hpp
index 9b3469c1..f830eb82 100644
--- a/src/buildtool/common/action_description.hpp
+++ b/src/buildtool/common/action_description.hpp
@@ -2,6 +2,7 @@
#define INCLUDED_SRC_BUILDTOOL_COMMON_ACTION_DESCRIPTION_HPP
#include <map>
+#include <memory>
#include <optional>
#include <string>
#include <unordered_map>
@@ -15,6 +16,7 @@ class ActionDescription {
public:
using outputs_t = std::vector<std::string>;
using inputs_t = std::unordered_map<std::string, ArtifactDescription>;
+ using Ptr = std::shared_ptr<ActionDescription>;
ActionDescription(outputs_t output_files,
outputs_t output_dirs,
@@ -27,7 +29,7 @@ class ActionDescription {
[[nodiscard]] static auto FromJson(std::string const& id,
nlohmann::json const& desc) noexcept
- -> std::optional<ActionDescription> {
+ -> std::optional<ActionDescription::Ptr> {
try {
auto outputs =
ExtractValueAs<std::vector<std::string>>(desc, "output");
@@ -113,11 +115,11 @@ class ActionDescription {
no_cache = *no_cache_it;
}
- return ActionDescription{
+ return std::make_shared<ActionDescription>(
std::move(*outputs),
std::move(*output_dirs),
Action{id, std::move(*command), env, may_fail, no_cache},
- inputs};
+ inputs);
} catch (std::exception const& ex) {
Logger::Log(
LogLevel::Error,
diff --git a/src/buildtool/common/tree.hpp b/src/buildtool/common/tree.hpp
index 512eda86..6b76f8f1 100644
--- a/src/buildtool/common/tree.hpp
+++ b/src/buildtool/common/tree.hpp
@@ -1,6 +1,7 @@
#ifndef INCLUDED_SRC_BUILDTOOL_COMMON_TREE_HPP
#define INCLUDED_SRC_BUILDTOOL_COMMON_TREE_HPP
+#include <memory>
#include <string>
#include <unordered_map>
@@ -13,6 +14,7 @@ class Tree {
using inputs_t = ActionDescription::inputs_t;
public:
+ using Ptr = std::shared_ptr<Tree>;
explicit Tree(inputs_t&& inputs)
: id_{ComputeId(inputs)}, inputs_{std::move(inputs)} {}
@@ -36,7 +38,7 @@ class Tree {
[[nodiscard]] static auto FromJson(std::string const& id,
nlohmann::json const& json)
- -> std::optional<Tree> {
+ -> std::optional<Tree::Ptr> {
auto inputs = inputs_t{};
inputs.reserve(json.size());
for (auto const& [path, artifact] : json.items()) {
@@ -46,16 +48,16 @@ class Tree {
}
inputs.emplace(path, std::move(*artifact_desc));
}
- return Tree{id, std::move(inputs)};
+ return std::make_shared<Tree>(id, std::move(inputs));
}
+ Tree(std::string id, inputs_t&& inputs)
+ : id_{std::move(id)}, inputs_{std::move(inputs)} {}
+
private:
std::string id_;
inputs_t inputs_;
- Tree(std::string id, inputs_t&& inputs)
- : id_{std::move(id)}, inputs_{std::move(inputs)} {}
-
static auto ComputeDescription(inputs_t const& inputs) -> nlohmann::json {
auto json = nlohmann::json::object();
for (auto const& [path, artifact] : inputs) {
diff --git a/src/buildtool/execution_engine/dag/dag.cpp b/src/buildtool/execution_engine/dag/dag.cpp
index 96a74650..5d60dd01 100644
--- a/src/buildtool/execution_engine/dag/dag.cpp
+++ b/src/buildtool/execution_engine/dag/dag.cpp
@@ -104,6 +104,16 @@ auto DependencyGraph::Add(std::vector<ActionDescription> const& actions)
return true;
}
+auto DependencyGraph::Add(std::vector<ActionDescription::Ptr> const& actions)
+ -> bool {
+ for (auto const& action : actions) {
+ if (not AddAction(*action)) {
+ return false;
+ }
+ }
+ return true;
+}
+
auto DependencyGraph::AddArtifact(ArtifactDescription const& description)
-> ArtifactIdentifier {
auto artifact = description.ToArtifact();
diff --git a/src/buildtool/execution_engine/dag/dag.hpp b/src/buildtool/execution_engine/dag/dag.hpp
index 4f29d79a..ff055413 100644
--- a/src/buildtool/execution_engine/dag/dag.hpp
+++ b/src/buildtool/execution_engine/dag/dag.hpp
@@ -524,6 +524,9 @@ class DependencyGraph : DirectedAcyclicGraph {
[[nodiscard]] auto Add(std::vector<ActionDescription> const& actions)
-> bool;
+ [[nodiscard]] auto Add(std::vector<ActionDescription::Ptr> const& actions)
+ -> bool;
+
[[nodiscard]] auto AddAction(ActionDescription const& description) -> bool;
[[nodiscard]] auto AddArtifact(ArtifactDescription const& description)
diff --git a/src/buildtool/graph_traverser/graph_traverser.hpp b/src/buildtool/graph_traverser/graph_traverser.hpp
index 7a078ecd..62077d83 100644
--- a/src/buildtool/graph_traverser/graph_traverser.hpp
+++ b/src/buildtool/graph_traverser/graph_traverser.hpp
@@ -48,9 +48,9 @@ class GraphTraverser {
[[nodiscard]] auto BuildAndStage(
std::map<std::string, ArtifactDescription> const& artifact_descriptions,
std::map<std::string, ArtifactDescription> const& runfile_descriptions,
- std::vector<ActionDescription> const& action_descriptions,
+ std::vector<ActionDescription::Ptr> const& action_descriptions,
std::vector<std::string> const& blobs,
- std::vector<Tree> const& trees) const
+ std::vector<Tree::Ptr> const& trees) const
-> std::optional<std::pair<std::vector<std::filesystem::path>, bool>> {
DependencyGraph graph; // must outlive artifact_nodes
auto artifacts = BuildArtifacts(&graph,
@@ -110,7 +110,7 @@ class GraphTraverser {
}
auto const [blobs, tree_descs, actions] = *desc;
- std::vector<ActionDescription> action_descriptions{};
+ std::vector<ActionDescription::Ptr> action_descriptions{};
action_descriptions.reserve(actions.size());
for (auto const& [id, description] : actions.items()) {
auto action = ActionDescription::FromJson(id, description);
@@ -120,7 +120,7 @@ class GraphTraverser {
action_descriptions.emplace_back(std::move(*action));
}
- std::vector<Tree> trees{};
+ std::vector<Tree::Ptr> trees{};
for (auto const& [id, description] : tree_descs.items()) {
auto tree = Tree::FromJson(id, description);
if (not tree) {
@@ -372,8 +372,8 @@ class GraphTraverser {
gsl::not_null<DependencyGraph*> const& graph,
std::map<std::string, ArtifactDescription> const& artifacts,
std::map<std::string, ArtifactDescription> const& runfiles,
- std::vector<ActionDescription> const& actions,
- std::vector<Tree> const& trees,
+ std::vector<ActionDescription::Ptr> const& actions,
+ std::vector<Tree::Ptr> const& trees,
std::vector<std::string> const& blobs) const
-> std::optional<
std::pair<std::vector<std::filesystem::path>,
@@ -392,14 +392,14 @@ class GraphTraverser {
std::vector<ActionDescription> tree_actions{};
tree_actions.reserve(trees.size());
for (auto const& tree : trees) {
- tree_actions.emplace_back(tree.Action());
+ tree_actions.emplace_back(tree->Action());
}
if (not graph->Add(actions) or not graph->Add(tree_actions)) {
Logger::Log(LogLevel::Error, [&actions]() {
auto json = nlohmann::json::array();
for (auto const& desc : actions) {
- json.push_back(desc.ToJson());
+ json.push_back(desc->ToJson());
}
return fmt::format(
"could not build the dependency graph from the actions "
diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp
index d1343ad5..eb555a8c 100644
--- a/src/buildtool/main/main.cpp
+++ b/src/buildtool/main/main.cpp
@@ -694,10 +694,11 @@ struct AnalysisResult {
[[nodiscard]] auto TargetActionsToJson(AnalysedTargetPtr const& target)
-> nlohmann::json {
auto actions = nlohmann::json::array();
- std::for_each(
- target->Actions().begin(),
- target->Actions().end(),
- [&actions](auto const& action) { actions.push_back(action.ToJson()); });
+ std::for_each(target->Actions().begin(),
+ target->Actions().end(),
+ [&actions](auto const& action) {
+ actions.push_back(action->ToJson());
+ });
return actions;
}
@@ -707,7 +708,7 @@ struct AnalysisResult {
std::for_each(
target->Trees().begin(),
target->Trees().end(),
- [&trees](auto const& tree) { trees[tree.Id()] = tree.ToJson(); });
+ [&trees](auto const& tree) { trees[tree->Id()] = tree->ToJson(); });
return trees;
}