14#ifndef LLVM_CLANG_ANALYSIS_SCALABLE_SUPPORT_ERRORBUILDER_H
15#define LLVM_CLANG_ANALYSIS_SCALABLE_SUPPORT_ERRORBUILDER_H
17#include "llvm/Support/Error.h"
18#include "llvm/Support/FormatVariadic.h"
21#include <system_error>
42 std::vector<std::string> ContextStack;
44 explicit ErrorBuilder(std::error_code EC) : Code(EC) {}
46 void pushContext(std::string Msg) {
48 ContextStack.push_back(std::move(Msg));
52 template <
typename... Args>
53 static std::string formatErrorMessage(
const char *Fmt, Args &&...ArgVals) {
54 return llvm::formatv(Fmt, std::forward<Args>(ArgVals)...).str();
57 template <
typename... Args>
58 void addFormattedContext(
const char *Fmt, Args &&...ArgVals) {
59 pushContext(formatErrorMessage(Fmt, std::forward<Args>(ArgVals)...));
76 template <
typename... Args>
77 static ErrorBuilder
create(std::error_code EC,
const char *Fmt,
79 ErrorBuilder Builder(EC);
80 Builder.addFormattedContext(Fmt, std::forward<Args>(ArgVals)...);
90 template <
typename... Args>
91 static ErrorBuilder
create(std::errc EC,
const char *Fmt, Args &&...ArgVals) {
92 return create(std::make_error_code(EC), Fmt,
93 std::forward<Args>(ArgVals)...);
149 template <
typename... Args>
150 ErrorBuilder &
context(
const char *Fmt, Args &&...ArgVals) {
151 addFormattedContext(Fmt, std::forward<Args>(ArgVals)...);
180 llvm::Error
build()
const;
200 template <
typename... Args>
201 [[
noreturn]]
static void fatal(
const char *Fmt, Args &&...ArgVals) {
202 llvm::report_fatal_error(llvm::StringRef(
203 formatErrorMessage(Fmt, std::forward<Args>(ArgVals)...)));
Fluent API for constructing contextual errors.
static ErrorBuilder create(std::error_code EC, const char *Fmt, Args &&...ArgVals)
Create an ErrorBuilder with an error code and formatted message.
static void fatal(const char *Fmt, Args &&...ArgVals)
Report a fatal error with formatted message and terminate execution.
static ErrorBuilder create(std::errc EC, const char *Fmt, Args &&...ArgVals)
Convenience overload that accepts std::errc instead of std::error_code.
ErrorBuilder & context(const char *Fmt, Args &&...ArgVals)
Add context information with formatted string.
ErrorBuilder & context(const char *Msg)
Add context information as a plain string.
llvm::Error build() const
Build and return the final error.
static ErrorBuilder wrap(llvm::Error E)
Wrap an existing error and optionally add context.