10 return std::optional{fmt::format(
"-W{}", templ.
name())};
13 return std::optional{fmt::format(
"-Werror={}", templ.
name())};
32 all_warnings_disabled_ =
true;
39 if (enabled_at_level_.contains(diag)) {
40 auto &set = enabled_at_level_.at(diag);
50 Panic(
"cannot change diagnostic enablement level for non-warning diagnostics");
55 Panic(fmt::format(
"cannot override diagnostic '{}' level to {}", diag,
LevelToStr(
override)));
58 if (enabled_at_level_.contains(diag.data())) {
59 auto &set = enabled_at_level_.at(diag.data());
62 enabled_at_level_.insert({std::string{diag}, std::set{
override}});
69 Panic(
"cannot change diagnostic enablement level for non-warning diagnostics");
74 Panic(fmt::format(
"cannot override diagnostic '{}' level to {}", diag,
LevelToStr(
override)));
77 if (enabled_at_level_.contains(diag.data())) {
78 auto &set = enabled_at_level_.at(diag.data());
81 enabled_at_level_.erase(diag.data());
87 if (!enabled_at_level_.contains(diag.data())) {
91 fmt::format(
"enabled_at_level_[{}] - set was empty!", diag.data()));
93 return *enabled_at_level_.at(diag.data()).rbegin();
101 const auto diag_str = std::string{diag};
102 if (!diag_counts_.contains(diag_str)) {
105 return diag_counts_.at(diag_str);
113DiagLevel DiagEngine::ComputeLevel(std::string_view diag)
const {
114 const auto &templ =
DiagFor(diag);
118 return templ.
level();
122 if (
auto diag_str = std::string{diag}; enabled_at_level_.contains(diag_str)) {
124 fmt::format(
"enabled_at_level_[{}] - set was empty!", diag_str));
126 return *enabled_at_level_.at(diag_str).rbegin();
130 return templ.
level();
133[[nodiscard]]
bool DiagEngine::IsEnabled(std::string_view diag)
const {
149 if (all_warnings_disabled_) {
156 if (
const auto diag_str = std::string{diag}; enabled_at_level_.contains(diag_str)) {
164std::string DiagEngine::ConstructMsgStr(
const DiagLevel in_flight_level,
const DiagTempl &templ,
165 const std::vector<std::string> &msg)
const {
166 std::stringstream ss{};
168 auto level_prefix = fmt::format(
"{}: ",
LevelToStr(in_flight_level));
169 const auto style = fmt::emphasis::bold | fg(
ColorForLevel(in_flight_level));
172 if (consumer_->IsATty()) {
173 level_prefix = fmt::format(
"{}", styled(level_prefix, style));
177 ss << level_prefix << msg.at(0);
183 if (
const auto flag = construct_flag(in_flight_level, templ); flag.has_value()) {
185 const auto styled_flag = fmt::format(
"{}", styled(flag.value(), style));
186 consumer_->IsATty() ? ss << styled_flag : ss << flag.value();
194 for (
const auto msg_view = msg | std::views::drop(1);
const auto &line : msg_view) {
195 ss << line << std::endl;
A customizable consumer for diagnostic messages.
std::uint64_t InFlightCountForLevel(DiagLevel level) const
void DisableAllWarnings()
void DisableAtLevel(std::string_view diag, DiagLevel override)
void EnableAtLevel(std::string_view diag, DiagLevel override)
std::uint64_t InFlightCountFor(std::string_view diag) const
void UpgradeEnabledWarningsToErr()
DiagLevel EnabledAt(std::string_view diag) const
const DiagConsumer & consumer() const
Defines a reusable template for standardized diagnostic reporting.
DiagLevel level() const
Gets the default diagnostic level of the template.
std::string_view name() const
DiagLevel level() const noexcept
void Panic(const StringViewSourceLoc &s) noexcept
void AssertOrPanic(const bool condition, const StringViewSourceLoc &s)
DiagTempl DiagFor(std::string_view name)
Retrieves the DiagTempl corresponding to a given diagnostic name.
std::vector< const char * > AllDiagNames()
Gets an iterable view of all DiagTempl names in the internal table.
std::string LevelToStr(DiagLevel level)
fmt::terminal_color ColorForLevel(DiagLevel level)