From b8c55612e5e5c6eda3435b40760a87e9bf789c88 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 4 Apr 2023 17:21:53 +0200 Subject: [PATCH] Swift: route compiler diagnostics through our log --- .../invocation/SwiftDiagnosticsConsumer.cpp | 42 ++++++++++++++++--- .../invocation/SwiftDiagnosticsConsumer.h | 10 +++++ swift/extractor/main.cpp | 2 + 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/swift/extractor/invocation/SwiftDiagnosticsConsumer.cpp b/swift/extractor/invocation/SwiftDiagnosticsConsumer.cpp index 5ac875a1e1e9..028210b4f624 100644 --- a/swift/extractor/invocation/SwiftDiagnosticsConsumer.cpp +++ b/swift/extractor/invocation/SwiftDiagnosticsConsumer.cpp @@ -1,5 +1,5 @@ #include "swift/extractor/invocation/SwiftDiagnosticsConsumer.h" -#include "swift/extractor/trap/generated/TrapEntries.h" +#include "swift/extractor/trap/generated/TrapClasses.h" #include "swift/extractor/trap/TrapDomain.h" #include "swift/extractor/infra/SwiftDiagnosticKind.h" @@ -13,13 +13,17 @@ using namespace codeql; void SwiftDiagnosticsConsumer::handleDiagnostic(swift::SourceManager& sourceManager, const swift::DiagnosticInfo& diagInfo) { - auto message = getDiagMessage(sourceManager, diagInfo); - DiagnosticsTrap diag{}; - diag.id = trap.createLabel(); + if (diagInfo.IsChildNote) return; + Diagnostics diag{trap.createLabel()}; diag.kind = translateDiagnosticsKind(diagInfo.Kind); - diag.text = message; + diag.text = getDiagMessage(sourceManager, diagInfo); trap.emit(diag); - locationExtractor.attachLocation(sourceManager, diagInfo.Loc, diagInfo.Loc, diag.id); + locationExtractor.attachLocation(sourceManager, diagInfo.Loc, diag.id); + + forwardToLog(sourceManager, diagInfo, diag.text); + for (const auto& child : diagInfo.ChildDiagnosticInfo) { + forwardToLog(sourceManager, *child); + } } std::string SwiftDiagnosticsConsumer::getDiagMessage(swift::SourceManager& sourceManager, @@ -29,3 +33,29 @@ std::string SwiftDiagnosticsConsumer::getDiagMessage(swift::SourceManager& sourc swift::DiagnosticEngine::formatDiagnosticText(out, diagInfo.FormatString, diagInfo.FormatArgs); return text.str().str(); } + +void SwiftDiagnosticsConsumer::forwardToLog(swift::SourceManager& sourceManager, + const swift::DiagnosticInfo& diagInfo, + const std::string& message) { + auto file = sourceManager.getDisplayNameForLoc(diagInfo.Loc); + auto [line, column] = sourceManager.getLineAndColumnInBuffer(diagInfo.Loc); + using Kind = swift::DiagnosticKind; + switch (diagInfo.Kind) { + case Kind::Error: + LOG_ERROR("{}:{}:{} {}", file, line, column, message); + break; + case Kind::Warning: + LOG_WARNING("{}:{}:{} {}", file, line, column, message); + break; + case Kind::Remark: + LOG_INFO("{}:{}:{} {}", file, line, column, message); + break; + case Kind::Note: + LOG_DEBUG("{}:{}:{} {}", file, line, column, message); + break; + default: + LOG_ERROR("unknown diagnostic kind {}, {}:{}:{} {}", diagInfo.Kind, file, line, column, + message); + break; + } +} diff --git a/swift/extractor/invocation/SwiftDiagnosticsConsumer.h b/swift/extractor/invocation/SwiftDiagnosticsConsumer.h index c85233348fd6..c0bd6e3fc4fc 100644 --- a/swift/extractor/invocation/SwiftDiagnosticsConsumer.h +++ b/swift/extractor/invocation/SwiftDiagnosticsConsumer.h @@ -2,6 +2,7 @@ #include #include "swift/extractor/infra/SwiftLocationExtractor.h" +#include "swift/extractor/infra/log/SwiftLogging.h" namespace codeql { @@ -17,8 +18,17 @@ class SwiftDiagnosticsConsumer : public swift::DiagnosticConsumer { private: static std::string getDiagMessage(swift::SourceManager& sourceManager, const swift::DiagnosticInfo& diagInfo); + void forwardToLog(swift::SourceManager& sourceManager, + const swift::DiagnosticInfo& diagInfo, + const std::string& message); + + void forwardToLog(swift::SourceManager& sourceManager, const swift::DiagnosticInfo& diagInfo) { + forwardToLog(sourceManager, diagInfo, getDiagMessage(sourceManager, diagInfo)); + } + TrapDomain& trap; SwiftLocationExtractor locationExtractor; + Logger logger{"compiler"}; }; } // namespace codeql diff --git a/swift/extractor/main.cpp b/swift/extractor/main.cpp index 084f98b2c0fe..3eed4144700e 100644 --- a/swift/extractor/main.cpp +++ b/swift/extractor/main.cpp @@ -86,6 +86,8 @@ class Observer : public swift::FrontendObserver { } void configuredCompiler(swift::CompilerInstance& instance) override { + // remove default consumers to avoid double messaging + instance.getDiags().takeConsumers(); instance.addDiagnosticConsumer(&diagConsumer); }