3 #include <forward_list>
9 #include "diagnostics/Location.h"
11 namespace diagnostics {
26 : argIndex{1}, arguments_{loc} {}
28 void addArgument(std::string_view arg) {
29 assert(argIndex < MaxArguments &&
"too many arguments");
30 arguments_[argIndex++] = arg;
33 void addArgument(uint64_t arg) {
34 assert(argIndex < MaxArguments &&
"too many arguments");
35 arguments_[argIndex++] = arg;
39 assert(argIndex < MaxArguments &&
"too many ranges");
40 arguments_[argIndex++] = range;
43 auto args()
const {
return std::views::counted(arguments_, argIndex); }
45 std::ostream& emit(std::ostream& os)
const {
46 for(
auto& arg : arguments_) {
47 if(std::holds_alternative<std::string_view>(arg)) {
48 os << std::get<std::string_view>(arg);
49 }
else if(std::holds_alternative<SourceRange>(arg)) {
51 std::get<SourceRange>(arg).print(os);
53 os << std::get<uint64_t>(arg);
61 static constexpr int MaxArguments = 15;
62 std::variant<std::string_view, uint64_t,
SourceRange> arguments_[MaxArguments];
81 explicit DiagnosticStream(std::ostream& stream) : stream_{stream} {}
82 std::ostream& get() {
return buffer; }
84 auto str = buffer.str();
87 if(!str.ends_with(
'\n')) stream_ << std::endl;
91 std::ostream& stream_;
92 std::ostringstream buffer;
107 explicit DiagnosticEngine(
int verbose = 0) : verbose_{verbose} {}
109 errors_.emplace_after(errors_.before_begin(), loc);
110 return DiagnosticBuilder{errors_.front()};
113 warnings_.emplace_after(warnings_.before_begin(), loc);
114 return DiagnosticBuilder{warnings_.front()};
118 "Debug messages not available. Did you forget to check for Verbose?");
122 void setVerbose(
int verbose) { verbose_ = verbose; }
123 bool hasErrors()
const {
return !errors_.empty(); }
124 auto errors()
const {
return std::views::all(errors_); }
125 bool hasWarnings()
const {
return !warnings_.empty(); }
126 auto warnings()
const {
return std::views::all(warnings_); }
129 bool Verbose(
int level = 1)
const {
return verbose_ >= level; }
133 std::forward_list<DiagnosticStorage> errors_;
134 std::forward_list<DiagnosticStorage> warnings_;
142 std::string_view str) {
143 builder.storage.addArgument(str);
149 builder.storage.addArgument(std::string_view{str});
155 builder.storage.addRange(range);
159 template <
typename T>