From 427b6e4e83486858b1ab160c75e2754ba173eebe Mon Sep 17 00:00:00 2001 From: Klaus Aehlig Date: Thu, 4 Apr 2024 10:13:17 +0200 Subject: Evaluator: Add infrastructure to annotate relevant objects ... which are, in particular, artifacts involved in staging conflicts. While there, also make disjoint union honor the expression log limit. --- .../build_engine/expression/evaluator.hpp | 25 ++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) (limited to 'src/buildtool/build_engine/expression/evaluator.hpp') diff --git a/src/buildtool/build_engine/expression/evaluator.hpp b/src/buildtool/build_engine/expression/evaluator.hpp index efcbeaca..598b36d4 100644 --- a/src/buildtool/build_engine/expression/evaluator.hpp +++ b/src/buildtool/build_engine/expression/evaluator.hpp @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include "src/buildtool/build_engine/expression/expression.hpp" #include "src/buildtool/build_engine/expression/function_map.hpp" @@ -36,17 +38,24 @@ class Evaluator { Config().expression_log_limit = width; } + static auto GetExpressionLogLimit() -> std::size_t { + return Config().expression_log_limit; + } + class EvaluationError : public std::exception { public: explicit EvaluationError(std::string const& msg, bool while_eval = false, - bool user_context = false) noexcept + bool user_context = false, + std::vector involved_objetcs = + std::vector{}) noexcept : msg_{(while_eval ? "" : (user_context ? "UserError: " : "EvaluationError: ")) + msg}, while_eval_{while_eval}, - user_context_{user_context} {} + user_context_{user_context}, + involved_objects_{std::move(std::move(involved_objetcs))} {} [[nodiscard]] auto what() const noexcept -> char const* final { return msg_.c_str(); } @@ -57,6 +66,15 @@ class Evaluator { [[nodiscard]] auto UserContext() const -> bool { return user_context_; } + [[nodiscard]] auto InvolvedObjects() const& noexcept + -> std::vector const& { + return involved_objects_; + } + + [[nodiscard]] auto InvolvedObjects() && -> std::vector { + return involved_objects_; + } + [[nodiscard]] static auto WhileEvaluating(ExpressionPtr const& expr, Configuration const& env, std::exception const& ex) @@ -79,6 +97,7 @@ class Evaluator { std::string msg_; bool while_eval_; bool user_context_; + std::vector involved_objects_; }; // Exception-free evaluation of expression @@ -87,6 +106,8 @@ class Evaluator { Configuration const& env, FunctionMapPtr const& provider_functions, std::function const& logger, + std::function const& annotate_object = + [](auto const& /*unused*/) { return std::string{}; }, std::function const& note_user_context = []() {}) noexcept -> ExpressionPtr; -- cgit v1.2.3