Skip to content

Commit 0fe7740

Browse files
authored
Merge pull request github#14052 from github/sashabu/swift-logging-compiler
Swift: Route compiler diagnostics through our log.
2 parents 6573b1f + 7e05551 commit 0fe7740

File tree

3 files changed

+64
-5
lines changed

3 files changed

+64
-5
lines changed

swift/extractor/invocation/SwiftDiagnosticsConsumer.cpp

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#include "swift/extractor/invocation/SwiftDiagnosticsConsumer.h"
2-
#include "swift/extractor/trap/generated/TrapEntries.h"
2+
#include "swift/extractor/trap/generated/TrapClasses.h"
33
#include "swift/extractor/trap/TrapDomain.h"
44
#include "swift/extractor/infra/SwiftDiagnosticKind.h"
55

@@ -11,15 +11,37 @@
1111

1212
using namespace codeql;
1313

14+
namespace {
15+
struct DisplayLoc {
16+
llvm::StringRef file;
17+
unsigned line;
18+
unsigned column;
19+
20+
static DisplayLoc from(swift::SourceManager& sourceManager, swift::SourceLoc loc) {
21+
if (loc.isInvalid()) {
22+
return {"<invalid loc>", 0, 0};
23+
}
24+
auto file = sourceManager.getDisplayNameForLoc(loc);
25+
auto [line, column] = sourceManager.getLineAndColumnInBuffer(loc);
26+
return {file, line, column};
27+
}
28+
};
29+
30+
} // namespace
31+
1432
void SwiftDiagnosticsConsumer::handleDiagnostic(swift::SourceManager& sourceManager,
1533
const swift::DiagnosticInfo& diagInfo) {
16-
auto message = getDiagMessage(sourceManager, diagInfo);
17-
DiagnosticsTrap diag{};
18-
diag.id = trap.createTypedLabel<DiagnosticsTag>();
34+
if (diagInfo.IsChildNote) return;
35+
Diagnostics diag{trap.createTypedLabel<DiagnosticsTag>()};
1936
diag.kind = translateDiagnosticsKind(diagInfo.Kind);
20-
diag.text = message;
37+
diag.text = getDiagMessage(sourceManager, diagInfo);
2138
trap.emit(diag);
2239
locationExtractor.attachLocation(sourceManager, diagInfo, diag.id);
40+
41+
forwardToLog(sourceManager, diagInfo, diag.text);
42+
for (const auto& child : diagInfo.ChildDiagnosticInfo) {
43+
forwardToLog(sourceManager, *child);
44+
}
2345
}
2446

2547
std::string SwiftDiagnosticsConsumer::getDiagMessage(swift::SourceManager& sourceManager,
@@ -29,3 +51,28 @@ std::string SwiftDiagnosticsConsumer::getDiagMessage(swift::SourceManager& sourc
2951
swift::DiagnosticEngine::formatDiagnosticText(out, diagInfo.FormatString, diagInfo.FormatArgs);
3052
return text.str().str();
3153
}
54+
55+
void SwiftDiagnosticsConsumer::forwardToLog(swift::SourceManager& sourceManager,
56+
const swift::DiagnosticInfo& diagInfo,
57+
const std::string& message) {
58+
auto [file, line, column] = DisplayLoc::from(sourceManager, diagInfo.Loc);
59+
using Kind = swift::DiagnosticKind;
60+
switch (diagInfo.Kind) {
61+
case Kind::Error:
62+
LOG_ERROR("{}:{}:{} {}", file, line, column, message);
63+
break;
64+
case Kind::Warning:
65+
LOG_WARNING("{}:{}:{} {}", file, line, column, message);
66+
break;
67+
case Kind::Remark:
68+
LOG_INFO("{}:{}:{} {}", file, line, column, message);
69+
break;
70+
case Kind::Note:
71+
LOG_DEBUG("{}:{}:{} {}", file, line, column, message);
72+
break;
73+
default:
74+
LOG_ERROR("unknown diagnostic kind {}, {}:{}:{} {}", diagInfo.Kind, file, line, column,
75+
message);
76+
break;
77+
}
78+
}

swift/extractor/invocation/SwiftDiagnosticsConsumer.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <swift/AST/DiagnosticConsumer.h>
44
#include "swift/extractor/infra/SwiftLocationExtractor.h"
5+
#include "swift/logging/SwiftLogging.h"
56

67
namespace codeql {
78

@@ -17,8 +18,17 @@ class SwiftDiagnosticsConsumer : public swift::DiagnosticConsumer {
1718
private:
1819
static std::string getDiagMessage(swift::SourceManager& sourceManager,
1920
const swift::DiagnosticInfo& diagInfo);
21+
void forwardToLog(swift::SourceManager& sourceManager,
22+
const swift::DiagnosticInfo& diagInfo,
23+
const std::string& message);
24+
25+
void forwardToLog(swift::SourceManager& sourceManager, const swift::DiagnosticInfo& diagInfo) {
26+
forwardToLog(sourceManager, diagInfo, getDiagMessage(sourceManager, diagInfo));
27+
}
28+
2029
TrapDomain& trap;
2130
SwiftLocationExtractor locationExtractor;
31+
Logger logger{"compiler"};
2232
};
2333

2434
} // namespace codeql

swift/extractor/main.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ class Observer : public swift::FrontendObserver {
9191
}
9292

9393
void configuredCompiler(swift::CompilerInstance& instance) override {
94+
// remove default consumers to avoid double messaging
95+
instance.getDiags().takeConsumers();
9496
instance.addDiagnosticConsumer(&diagConsumer);
9597
}
9698

0 commit comments

Comments
 (0)