blob: 60d3ec4067245ba4e2ee44bd38aedf3b7dfc86f8 [file] [log] [blame] [edit]
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#include "cmDiagnostics.h"
#include <cassert>
#include <map>
#include <string>
#include <utility>
#include <cmext/string_view>
#include "cmStringAlgorithms.h"
namespace {
cm::optional<cmDiagnosticCategory> stringToCategory(cm::string_view input)
{
using Map = std::map<cm::string_view, cmDiagnosticCategory>;
static Map const mapping = {
#define CATEGORY_MAP(C) { #C ""_s, cmDiagnostics::C },
CM_FOR_EACH_DIAGNOSTIC_CATEGORY(CATEGORY_MAP)
#undef CATEGORY_MAP
};
assert(!input.empty());
if (input.size() >= 4 && cmHasLiteralPrefix(input, "CMD_")) {
auto const i = mapping.find(input);
if (i != mapping.end()) {
return i->second;
}
}
return cm::nullopt;
}
}
#if __cplusplus < 201703L
// Prior to C++17, the compiler is unhappy if this member doesn't have explicit
// storage... and clang-tidy is unhappy if it does.
// NOLINTNEXTLINE(*-redundant-declaration)
constexpr cmDiagnostics::DiagnosticCategoryInformation
cmDiagnostics::CategoryInfo[cmDiagnostics::CategoryCount];
#endif
cm::string_view cmDiagnostics::GetActionString(DiagnosticAction action)
{
switch (action) {
case Ignore:
return "IGNORE"_s;
case Warn:
return "WARN"_s;
case SendError:
return "SEND_ERROR"_s;
case FatalError:
return "FATAL_ERROR"_s;
default:
return {};
}
}
cm::string_view cmDiagnostics::GetCategoryString(DiagnosticCategory category)
{
static cm::string_view const names[CategoryCount] = {
{}, // CMD_NONE
#define CATEGORY_NAME(C) #C ""_s,
CM_FOR_EACH_DIAGNOSTIC_CATEGORY(CATEGORY_NAME)
#undef CATEGORY_MAP
};
if (category < CategoryCount) {
return names[category];
}
return {};
}
cm::optional<cmDiagnosticAction> cmDiagnostics::GetDiagnosticAction(
cm::string_view name)
{
if (name == "IGNORE"_s) {
return DiagnosticAction::Ignore;
}
if (name == "WARN"_s) {
return DiagnosticAction::Warn;
}
if (name == "SEND_ERROR"_s) {
return DiagnosticAction::SendError;
}
if (name == "FATAL_ERROR"_s) {
return DiagnosticAction::FatalError;
}
return cm::nullopt;
}
cm::optional<cmDiagnosticCategory> cmDiagnostics::GetDiagnosticCategory(
cm::string_view name)
{
return stringToCategory(name);
}