Skip to content

Commit e3d6b3e

Browse files
redsun82sashabu
authored andcommitted
Swift: route compiler diagnostics through our log
(cherry picked from commit b8c5561)
1 parent 7af1e96 commit e3d6b3e

File tree

3 files changed

+47
-5
lines changed

3 files changed

+47
-5
lines changed

swift/extractor/invocation/SwiftDiagnosticsConsumer.cpp

Lines changed: 35 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

@@ -13,13 +13,17 @@ using namespace codeql;
1313

1414
void SwiftDiagnosticsConsumer::handleDiagnostic(swift::SourceManager& sourceManager,
1515
const swift::DiagnosticInfo& diagInfo) {
16-
auto message = getDiagMessage(sourceManager, diagInfo);
17-
DiagnosticsTrap diag{};
18-
diag.id = trap.createTypedLabel<DiagnosticsTag>();
16+
if (diagInfo.IsChildNote) return;
17+
Diagnostics diag{trap.createTypedLabel<DiagnosticsTag>()};
1918
diag.kind = translateDiagnosticsKind(diagInfo.Kind);
20-
diag.text = message;
19+
diag.text = getDiagMessage(sourceManager, diagInfo);
2120
trap.emit(diag);
2221
locationExtractor.attachLocation(sourceManager, diagInfo, diag.id);
22+
23+
forwardToLog(sourceManager, diagInfo, diag.text);
24+
for (const auto& child : diagInfo.ChildDiagnosticInfo) {
25+
forwardToLog(sourceManager, *child);
26+
}
2327
}
2428

2529
std::string SwiftDiagnosticsConsumer::getDiagMessage(swift::SourceManager& sourceManager,
@@ -29,3 +33,29 @@ std::string SwiftDiagnosticsConsumer::getDiagMessage(swift::SourceManager& sourc
2933
swift::DiagnosticEngine::formatDiagnosticText(out, diagInfo.FormatString, diagInfo.FormatArgs);
3034
return text.str().str();
3135
}
36+
37+
void SwiftDiagnosticsConsumer::forwardToLog(swift::SourceManager& sourceManager,
38+
const swift::DiagnosticInfo& diagInfo,
39+
const std::string& message) {
40+
auto file = sourceManager.getDisplayNameForLoc(diagInfo.Loc);
41+
auto [line, column] = sourceManager.getLineAndColumnInBuffer(diagInfo.Loc);
42+
using Kind = swift::DiagnosticKind;
43+
switch (diagInfo.Kind) {
44+
case Kind::Error:
45+
LOG_ERROR("{}:{}:{} {}", file, line, column, message);
46+
break;
47+
case Kind::Warning:
48+
LOG_WARNING("{}:{}:{} {}", file, line, column, message);
49+
break;
50+
case Kind::Remark:
51+
LOG_INFO("{}:{}:{} {}", file, line, column, message);
52+
break;
53+
case Kind::Note:
54+
LOG_DEBUG("{}:{}:{} {}", file, line, column, message);
55+
break;
56+
default:
57+
LOG_ERROR("unknown diagnostic kind {}, {}:{}:{} {}", diagInfo.Kind, file, line, column,
58+
message);
59+
break;
60+
}
61+
}

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)