1616
1717#include " swift/Frontend/DiagnosticHelper.h"
1818#include " swift/AST/DiagnosticEngine.h"
19+ #include " swift/AST/DiagnosticsFrontend.h"
1920#include " swift/Basic/Edit.h"
2021#include " swift/Basic/ParseableOutput.h"
2122#include " swift/Basic/SourceManager.h"
2425#include " swift/Frontend/PrintingDiagnosticConsumer.h"
2526#include " swift/Frontend/SerializedDiagnosticConsumer.h"
2627#include " swift/Migrator/FixitFilter.h"
28+ #include " llvm/Support/raw_ostream.h"
2729
2830#if __has_include(<unistd.h>)
2931#include < unistd.h>
@@ -38,7 +40,8 @@ class LLVM_LIBRARY_VISIBILITY DiagnosticHelper::Implementation {
3840 friend class DiagnosticHelper ;
3941
4042public:
41- Implementation (CompilerInstance &instance, bool useQuasiPID);
43+ Implementation (CompilerInstance &instance, llvm::raw_pwrite_stream &OS,
44+ bool useQuasiPID);
4245
4346 void initDiagConsumers (CompilerInvocation &invocation);
4447
@@ -59,6 +62,7 @@ class LLVM_LIBRARY_VISIBILITY DiagnosticHelper::Implementation {
5962 const sys::TaskProcessInformation procInfo;
6063
6164 CompilerInstance &instance;
65+ llvm::raw_pwrite_stream &errOS;
6266
6367 // potentially created diagnostic consumers.
6468 PrintingDiagnosticConsumer PDC;
@@ -226,9 +230,10 @@ createJSONFixItDiagnosticConsumerIfNeeded(
226230}
227231
228232DiagnosticHelper::Implementation::Implementation (CompilerInstance &instance,
233+ llvm::raw_pwrite_stream &OS,
229234 bool useQuasiPID)
230235 : OSPid(useQuasiPID ? QUASI_PID_START : getpid()), procInfo(OSPid),
231- instance(instance) {
236+ instance(instance), errOS(OS), PDC(OS) {
232237 instance.addDiagnosticConsumer (&PDC);
233238}
234239
@@ -396,7 +401,7 @@ void DiagnosticHelper::Implementation::beginMessage(
396401 [&](const InputFile &Input, unsigned idx) -> bool {
397402 ArrayRef<InputFile> Inputs (Input);
398403 emitBeganMessage (
399- llvm::errs () , mapFrontendInvocationToAction (invocation),
404+ errOS , mapFrontendInvocationToAction (invocation),
400405 constructDetailedTaskDescription (invocation, Inputs, args),
401406 pid - idx, procInfo);
402407 return false ;
@@ -405,7 +410,7 @@ void DiagnosticHelper::Implementation::beginMessage(
405410 // If no primary inputs are present, we are in WMO or EmitModule.
406411 bool isEmitModule = invocation.getFrontendOptions ().RequestedAction ==
407412 FrontendOptions::ActionType::EmitModuleOnly;
408- emitBeganMessage (llvm::errs () , mapFrontendInvocationToAction (invocation),
413+ emitBeganMessage (errOS , mapFrontendInvocationToAction (invocation),
409414 constructDetailedTaskDescription (
410415 invocation, IO.getAllInputs (), args, isEmitModule),
411416 OSPid, procInfo);
@@ -438,7 +443,7 @@ void DiagnosticHelper::Implementation::endMessage(int retCode) {
438443 std::copy (PrimaryDiags.begin (), PrimaryDiags.end (),
439444 std::ostream_iterator<std::string>(JoinedDiags, Delim));
440445
441- emitFinishedMessage (llvm::errs () ,
446+ emitFinishedMessage (errOS ,
442447 mapFrontendInvocationToAction (invocation),
443448 JoinedDiags.str (), retCode, pid - idx, procInfo);
444449 return false ;
@@ -455,7 +460,7 @@ void DiagnosticHelper::Implementation::endMessage(int retCode) {
455460 std::ostringstream JoinedDiags;
456461 std::copy (AllDiagnostics.begin (), AllDiagnostics.end (),
457462 std::ostream_iterator<std::string>(JoinedDiags, Delim));
458- emitFinishedMessage (llvm::errs () , mapFrontendInvocationToAction (invocation),
463+ emitFinishedMessage (errOS , mapFrontendInvocationToAction (invocation),
459464 JoinedDiags.str (), retCode, OSPid, procInfo);
460465 }
461466
@@ -492,12 +497,15 @@ void DiagnosticHelper::Implementation::diagnoseFatalError(const char *reason,
492497}
493498
494499DiagnosticHelper DiagnosticHelper::create (CompilerInstance &instance,
500+ llvm::raw_pwrite_stream &OS,
495501 bool useQuasiPID) {
496- return DiagnosticHelper (instance, useQuasiPID);
502+ return DiagnosticHelper (instance, OS, useQuasiPID);
497503}
498504
499- DiagnosticHelper::DiagnosticHelper (CompilerInstance &instance, bool useQuasiPID)
500- : Impl(*new Implementation(instance, useQuasiPID)) {}
505+ DiagnosticHelper::DiagnosticHelper (CompilerInstance &instance,
506+ llvm::raw_pwrite_stream &OS,
507+ bool useQuasiPID)
508+ : Impl(*new Implementation(instance, OS, useQuasiPID)) {}
501509
502510DiagnosticHelper::~DiagnosticHelper () { delete &Impl; }
503511
0 commit comments