From 51c5afff8b0cb2e870af16259812c070ccb30baf Mon Sep 17 00:00:00 2001 From: Calum Grant Date: Wed, 17 Jan 2024 14:23:18 +0000 Subject: [PATCH] Create shared/cpp library and move Diagnostics there --- shared/cpp/BUILD.bazel | 12 +++ .../cpp/Diagnostics.cpp | 6 +- shared/cpp/Diagnostics.h | 88 +++++++++++++++++++ swift/logging/BUILD.bazel | 1 + swift/logging/SwiftDiagnostics.h | 81 +---------------- 5 files changed, 106 insertions(+), 82 deletions(-) create mode 100644 shared/cpp/BUILD.bazel rename swift/logging/SwiftDiagnostics.cpp => shared/cpp/Diagnostics.cpp (96%) create mode 100644 shared/cpp/Diagnostics.h diff --git a/shared/cpp/BUILD.bazel b/shared/cpp/BUILD.bazel new file mode 100644 index 00000000000..eccc3273e8c --- /dev/null +++ b/shared/cpp/BUILD.bazel @@ -0,0 +1,12 @@ +cc_library( + name = "extractor_shared", + srcs = glob(["*.cpp"]), + hdrs = glob(["*.h"]), + visibility = ["//visibility:public"], + deps = [ + "@absl//absl/strings", + "@binlog", + "@fmt", + "@json", + ], +) diff --git a/swift/logging/SwiftDiagnostics.cpp b/shared/cpp/Diagnostics.cpp similarity index 96% rename from swift/logging/SwiftDiagnostics.cpp rename to shared/cpp/Diagnostics.cpp index 4e1663938db..7d2734c396c 100644 --- a/swift/logging/SwiftDiagnostics.cpp +++ b/shared/cpp/Diagnostics.cpp @@ -1,6 +1,8 @@ -#include "swift/logging/SwiftDiagnostics.h" +#include "Diagnostics.h" + +#include +#include -#include #include "absl/strings/str_join.h" #include "absl/strings/str_cat.h" diff --git a/shared/cpp/Diagnostics.h b/shared/cpp/Diagnostics.h new file mode 100644 index 00000000000..fd2ffc4322f --- /dev/null +++ b/shared/cpp/Diagnostics.h @@ -0,0 +1,88 @@ +#pragma once + +#include +#include + +#include + +namespace codeql { + +extern const std::string_view programName; +extern const std::string_view extractorName; + +struct DiagnosticsLocation { + std::string_view file; + unsigned startLine; + unsigned startColumn; + unsigned endLine; + unsigned endColumn; + + nlohmann::json json() const; + std::string str() const; +}; + +// Models a diagnostic source for Swift, holding static information that goes out into a diagnostic +// 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. +class Diagnostic { + public: + enum class Visibility : unsigned char { + none = 0b000, + statusPage = 0b001, + cliSummaryTable = 0b010, + telemetry = 0b100, + all = 0b111, + }; + + // Notice that Tool Status Page severity is not necessarily the same as log severity, as the + // scope is different: TSP's scope is the whole analysis, log's scope is a single run + enum class Severity { + note, + warning, + error, + }; + + std::string_view id; + std::string_view name; + std::string_view action; + + Visibility visibility{Visibility::all}; + Severity severity{Severity::error}; + + std::optional location{}; + + // create a JSON diagnostics for this source with the given `timestamp` and Markdown `message` + // A markdownMessage is emitted that includes both the message and the action to take. The id is + // used to construct the source id in the form `swift//` + nlohmann::json json(const std::chrono::system_clock::time_point& timestamp, + std::string_view message) const; + + // returns or @ if a location is present + std::string abbreviation() const; + + Diagnostic withLocation(std::string_view file, + unsigned startLine = 0, + unsigned startColumn = 0, + unsigned endLine = 0, + unsigned endColumn = 0) const { + auto ret = *this; + ret.location = DiagnosticsLocation{file, startLine, startColumn, endLine, endColumn}; + return ret; + } + + private: + bool has(Visibility v) const; +}; + +inline constexpr Diagnostic::Visibility operator|(Diagnostic::Visibility lhs, + Diagnostic::Visibility rhs) { + return static_cast(static_cast(lhs) | + static_cast(rhs)); +} + +inline constexpr Diagnostic::Visibility operator&(Diagnostic::Visibility lhs, + Diagnostic::Visibility rhs) { + return static_cast(static_cast(lhs) & + static_cast(rhs)); +} +} diff --git a/swift/logging/BUILD.bazel b/swift/logging/BUILD.bazel index e38447e785d..cd2f3344166 100644 --- a/swift/logging/BUILD.bazel +++ b/swift/logging/BUILD.bazel @@ -8,5 +8,6 @@ cc_library( "@binlog", "@fmt", "@json", + "//shared/cpp:extractor_shared", ], ) diff --git a/swift/logging/SwiftDiagnostics.h b/swift/logging/SwiftDiagnostics.h index 9055f51bb9a..6d037e85ba5 100644 --- a/swift/logging/SwiftDiagnostics.h +++ b/swift/logging/SwiftDiagnostics.h @@ -12,91 +12,12 @@ #include #include #include -#include #include "swift/logging/Formatters.h" +#include "shared/cpp/Diagnostics.h" namespace codeql { -extern const std::string_view programName; -extern const std::string_view extractorName; - -struct DiagnosticsLocation { - std::string_view file; - unsigned startLine; - unsigned startColumn; - unsigned endLine; - unsigned endColumn; - - nlohmann::json json() const; - std::string str() const; -}; - -// Models a diagnostic source for Swift, holding static information that goes out into a diagnostic -// 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. -class Diagnostic { - public: - enum class Visibility : unsigned char { - none = 0b000, - statusPage = 0b001, - cliSummaryTable = 0b010, - telemetry = 0b100, - all = 0b111, - }; - - // Notice that Tool Status Page severity is not necessarily the same as log severity, as the - // scope is different: TSP's scope is the whole analysis, log's scope is a single run - enum class Severity { - note, - warning, - error, - }; - - std::string_view id; - std::string_view name; - std::string_view action; - - Visibility visibility{Visibility::all}; - Severity severity{Severity::error}; - - std::optional location{}; - - // create a JSON diagnostics for this source with the given `timestamp` and Markdown `message` - // A markdownMessage is emitted that includes both the message and the action to take. The id is - // used to construct the source id in the form `swift//` - nlohmann::json json(const std::chrono::system_clock::time_point& timestamp, - std::string_view message) const; - - // returns or @ if a location is present - std::string abbreviation() const; - - Diagnostic withLocation(std::string_view file, - unsigned startLine = 0, - unsigned startColumn = 0, - unsigned endLine = 0, - unsigned endColumn = 0) const { - auto ret = *this; - ret.location = DiagnosticsLocation{file, startLine, startColumn, endLine, endColumn}; - return ret; - } - - private: - bool has(Visibility v) const; -}; - -inline constexpr Diagnostic::Visibility operator|(Diagnostic::Visibility lhs, - Diagnostic::Visibility rhs) { - return static_cast(static_cast(lhs) | - static_cast(rhs)); -} - -inline constexpr Diagnostic::Visibility operator&(Diagnostic::Visibility lhs, - Diagnostic::Visibility rhs) { - return static_cast(static_cast(lhs) & - static_cast(rhs)); -} - constexpr Diagnostic internalError{ .id = "internal-error", .name = "Internal error",