Skip to content

Commit db0e273

Browse files
authored
Merge pull request swiftlang#21605 from DavidGoldman/sourcekit_invocation_error
[SourceKit] Use diagnostics for arg parsing
2 parents e922e9e + c2d0b4d commit db0e273

File tree

2 files changed

+17
-15
lines changed

2 files changed

+17
-15
lines changed

include/swift/AST/DiagnosticEngine.h

+6
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,12 @@ namespace swift {
596596
Consumers.push_back(&Consumer);
597597
}
598598

599+
/// Remove a specific DiagnosticConsumer.
600+
void removeConsumer(DiagnosticConsumer &Consumer) {
601+
Consumers.erase(
602+
std::remove(Consumers.begin(), Consumers.end(), &Consumer));
603+
}
604+
599605
/// Remove and return all \c DiagnosticConsumers.
600606
std::vector<DiagnosticConsumer *> takeConsumers() {
601607
auto Result = std::vector<DiagnosticConsumer*>(Consumers.begin(),

tools/SourceKit/lib/SwiftLang/SwiftASTManager.cpp

+11-15
Original file line numberDiff line numberDiff line change
@@ -438,14 +438,21 @@ bool SwiftASTManager::initCompilerInvocation(CompilerInvocation &Invocation,
438438
Args.push_back(Impl.RuntimeResourcePath.c_str());
439439
Args.append(OrigArgs.begin(), OrigArgs.end());
440440

441+
SmallString<32> ErrStr;
442+
llvm::raw_svector_ostream ErrOS(ErrStr);
443+
StreamDiagConsumer DiagConsumer(ErrOS);
444+
Diags.addConsumer(DiagConsumer);
445+
441446
bool HadError = driver::getSingleFrontendInvocationFromDriverArguments(
442447
Args, Diags, [&](ArrayRef<const char *> FrontendArgs) {
443448
return Invocation.parseArgs(FrontendArgs, Diags);
444449
});
445450

451+
// Remove the StreamDiagConsumer as it's no longer needed.
452+
Diags.removeConsumer(DiagConsumer);
453+
446454
if (HadError) {
447-
// FIXME: Get the actual diagnostic.
448-
Error = "error when parsing the compiler arguments";
455+
Error = ErrOS.str();
449456
return true;
450457
}
451458

@@ -493,20 +500,9 @@ bool SwiftASTManager::initCompilerInvocation(CompilerInvocation &CompInvok,
493500
ArrayRef<const char *> OrigArgs,
494501
StringRef PrimaryFile,
495502
std::string &Error) {
496-
497-
SmallString<32> ErrStr;
498-
llvm::raw_svector_ostream ErrOS(ErrStr);
499503
DiagnosticEngine Diagnostics(Impl.SourceMgr);
500-
StreamDiagConsumer DiagConsumer(ErrOS);
501-
Diagnostics.addConsumer(DiagConsumer);
502-
503-
if (initCompilerInvocation(CompInvok, OrigArgs, Diagnostics, PrimaryFile,
504-
Error)) {
505-
if (!ErrOS.str().empty())
506-
Error = ErrOS.str();
507-
return true;
508-
}
509-
return false;
504+
return initCompilerInvocation(CompInvok, OrigArgs, Diagnostics, PrimaryFile,
505+
Error);
510506
}
511507

512508
bool SwiftASTManager::initCompilerInvocationNoInputs(

0 commit comments

Comments
 (0)