Swift: add visibility customization to diagnostics

This commit is contained in:
Paolo Tranquilli
2023-05-12 09:03:14 +02:00
parent dedbd9ab63
commit cce9352272
2 changed files with 34 additions and 6 deletions

View File

@@ -19,9 +19,9 @@ nlohmann::json SwiftDiagnostic::json(const std::chrono::system_clock::time_point
}},
{"visibility",
{
{"statusPage", true},
{"cliSummaryTable", true},
{"telemetry", true},
{"statusPage", has(Visibility::statusPage)},
{"cliSummaryTable", has(Visibility::cliSummaryTable)},
{"telemetry", has(Visibility::telemetry)},
}},
{"severity", "error"},
{"helpLinks", std::vector<std::string_view>(absl::StrSplit(helpLinks, ' '))},
@@ -41,6 +41,10 @@ std::string SwiftDiagnostic::abbreviation() const {
return std::string{id};
}
bool SwiftDiagnostic::has(SwiftDiagnostic::Visibility v) const {
return (visibility & v) != Visibility::none;
}
nlohmann::json SwiftDiagnosticsLocation::json() const {
nlohmann::json ret{{"file", file}};
if (startLine) ret["startLine"] = startLine;

View File

@@ -26,7 +26,6 @@ struct SwiftDiagnosticsLocation {
unsigned endColumn;
nlohmann::json json() const;
std::string str() const;
};
@@ -34,6 +33,14 @@ struct SwiftDiagnosticsLocation {
// These are internally stored into a map on id's. A specific error log can use binlog's category
// as id, which will then be used to recover the diagnostic source while dumping.
struct SwiftDiagnostic {
enum class Visibility : unsigned char {
none = 0b000,
statusPage = 0b001,
cliSummaryTable = 0b010,
telemetry = 0b100,
all = 0b111,
};
std::string_view id;
std::string_view name;
static constexpr std::string_view extractorName = "swift";
@@ -41,10 +48,12 @@ struct SwiftDiagnostic {
// space separated if more than 1. Not a vector to allow constexpr
// TODO(C++20) with vector going constexpr this can be turned to `std::vector<std::string_view>`
std::string_view helpLinks;
std::optional<SwiftDiagnosticsLocation> location;
// for the moment, we only output errors, so no need to store the severity
Visibility visibility{Visibility::all};
std::optional<SwiftDiagnosticsLocation> location{};
// create a JSON diagnostics for this source with the given timestamp and message to out
// A plaintextMessage is used that includes both the message and the action to take. Dots are
// appended to both. The id is used to construct the source id in the form
@@ -64,8 +73,23 @@ struct SwiftDiagnostic {
ret.location = SwiftDiagnosticsLocation{file, startLine, startColumn, endLine, endColumn};
return ret;
}
private:
bool has(Visibility v) const;
};
inline constexpr SwiftDiagnostic::Visibility operator|(SwiftDiagnostic::Visibility lhs,
SwiftDiagnostic::Visibility rhs) {
return static_cast<SwiftDiagnostic::Visibility>(static_cast<unsigned char>(lhs) |
static_cast<unsigned char>(rhs));
}
inline constexpr SwiftDiagnostic::Visibility operator&(SwiftDiagnostic::Visibility lhs,
SwiftDiagnostic::Visibility rhs) {
return static_cast<SwiftDiagnostic::Visibility>(static_cast<unsigned char>(lhs) &
static_cast<unsigned char>(rhs));
}
constexpr SwiftDiagnostic internalError{
"internal-error",
"Internal error",