Skip to content

Commit d4e6479

Browse files
committed
Add a new ForwardingDiagnosticConsumer type.
1 parent 1113bde commit d4e6479

File tree

3 files changed

+37
-0
lines changed

3 files changed

+37
-0
lines changed

include/swift/AST/DiagnosticConsumer.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
namespace swift {
2727
class DiagnosticArgument;
28+
class DiagnosticEngine;
2829
class SourceManager;
2930
enum class DiagID : uint32_t;
3031

@@ -122,6 +123,19 @@ class NullDiagnosticConsumer : public DiagnosticConsumer {
122123
const DiagnosticInfo &Info) override;
123124
};
124125

126+
/// \brief DiagnosticConsumer that forwards diagnostics to the consumers of
127+
// another DiagnosticEngine.
128+
class ForwardingDiagnosticConsumer : public DiagnosticConsumer {
129+
DiagnosticEngine &TargetEngine;
130+
public:
131+
ForwardingDiagnosticConsumer(DiagnosticEngine &Target);
132+
void handleDiagnostic(SourceManager &SM, SourceLoc Loc,
133+
DiagnosticKind Kind,
134+
StringRef FormatString,
135+
ArrayRef<DiagnosticArgument> FormatArgs,
136+
const DiagnosticInfo &Info) override;
137+
};
138+
125139
/// \brief DiagnosticConsumer that funnels diagnostics in certain files to
126140
/// particular sub-consumers.
127141
///

include/swift/AST/DiagnosticEngine.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,11 @@ namespace swift {
604604
return Result;
605605
}
606606

607+
/// \brief Return all \c DiagnosticConsumers.
608+
ArrayRef<DiagnosticConsumer *> getConsumers() {
609+
return Consumers;
610+
}
611+
607612
/// \brief Emit a diagnostic using a preformatted array of diagnostic
608613
/// arguments.
609614
///

lib/AST/DiagnosticConsumer.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,3 +222,21 @@ void NullDiagnosticConsumer::handleDiagnostic(
222222
llvm::dbgs() << "\n";
223223
});
224224
}
225+
226+
ForwardingDiagnosticConsumer::ForwardingDiagnosticConsumer(DiagnosticEngine &Target)
227+
: TargetEngine(Target) {}
228+
229+
void ForwardingDiagnosticConsumer::handleDiagnostic(
230+
SourceManager &SM, SourceLoc Loc, DiagnosticKind Kind,
231+
StringRef FormatString, ArrayRef<DiagnosticArgument> FormatArgs,
232+
const DiagnosticInfo &Info) {
233+
LLVM_DEBUG({
234+
llvm::dbgs() << "ForwardingDiagnosticConsumer received diagnostic: ";
235+
DiagnosticEngine::formatDiagnosticText(llvm::dbgs(), FormatString,
236+
FormatArgs);
237+
llvm::dbgs() << "\n";
238+
});
239+
for (auto *C : TargetEngine.getConsumers()) {
240+
C->handleDiagnostic(SM, Loc, Kind, FormatString, FormatArgs, Info);
241+
}
242+
}

0 commit comments

Comments
 (0)