@@ -512,8 +512,26 @@ SwiftInvocationRef
512512SwiftASTManager::getInvocation (ArrayRef<const char *> OrigArgs,
513513 StringRef PrimaryFile,
514514 std::string &Error) {
515+
516+ DiagnosticEngine Diags (Impl.SourceMgr );
517+ EditorDiagConsumer CollectDiagConsumer;
518+ Diags.addConsumer (CollectDiagConsumer);
519+
515520 CompilerInvocation CompInvok;
516- if (initCompilerInvocation (CompInvok, OrigArgs, PrimaryFile, Error)) {
521+ if (initCompilerInvocation (CompInvok, OrigArgs, Diags, PrimaryFile, Error)) {
522+ // We create a traced operation here to represent the failure to parse
523+ // arguments since we cannot reach `createAST` where that would normally
524+ // happen.
525+ trace::TracedOperation TracedOp (trace::OperationKind::PerformSema);
526+ if (TracedOp.enabled ()) {
527+ trace::SwiftInvocation TraceInfo;
528+ trace::initTraceInfo (TraceInfo, PrimaryFile, OrigArgs);
529+ TracedOp.setDiagnosticProvider (
530+ [&CollectDiagConsumer](SmallVectorImpl<DiagnosticEntryInfo> &diags) {
531+ CollectDiagConsumer.getAllDiagnostics (diags);
532+ });
533+ TracedOp.start (TraceInfo);
534+ }
517535 return nullptr ;
518536 }
519537
@@ -794,24 +812,27 @@ ASTUnitRef ASTProducer::createASTUnit(SwiftASTManager::Implementation &MgrImpl,
794812 for (auto &Content : Contents)
795813 Stamps.push_back (Content.Stamp );
796814
797- trace::TracedOperation TracedOp (trace::OperationKind::PerformSema);
798- trace::SwiftInvocation TraceInfo;
799- if (TracedOp.enabled ()) {
800- trace::initTraceInfo (TraceInfo, InvokRef->Impl .Opts .PrimaryFile ,
801- InvokRef->Impl .Opts .Args );
802- }
803-
804815 ASTUnitRef ASTRef = new ASTUnit (++ASTUnitGeneration, MgrImpl.Stats );
805816 for (auto &Content : Contents) {
806817 if (Content.Snapshot )
807818 ASTRef->Impl .Snapshots .push_back (Content.Snapshot );
808819 }
809820 auto &CompIns = ASTRef->Impl .CompInst ;
810821 auto &Consumer = ASTRef->Impl .CollectDiagConsumer ;
811-
812822 // Display diagnostics to stderr.
813823 CompIns.addDiagnosticConsumer (&Consumer);
814824
825+ trace::TracedOperation TracedOp (trace::OperationKind::PerformSema);
826+ trace::SwiftInvocation TraceInfo;
827+ if (TracedOp.enabled ()) {
828+ trace::initTraceInfo (TraceInfo, InvokRef->Impl .Opts .PrimaryFile ,
829+ InvokRef->Impl .Opts .Args );
830+ TracedOp.setDiagnosticProvider (
831+ [&Consumer](SmallVectorImpl<DiagnosticEntryInfo> &diags) {
832+ Consumer.getAllDiagnostics (diags);
833+ });
834+ }
835+
815836 CompilerInvocation Invocation;
816837 InvokRef->Impl .Opts .applyToSubstitutingInputs (
817838 Invocation, convertFileContentsToInputs (Contents));
@@ -875,12 +896,6 @@ ASTUnitRef ASTProducer::createASTUnit(SwiftASTManager::Implementation &MgrImpl,
875896 // TypeResolver is set before.
876897 ASTRef->Impl .TypeResolver = createLazyResolver (CompIns.getASTContext ());
877898
878- if (TracedOp.enabled ()) {
879- SmallVector<DiagnosticEntryInfo, 8 > Diagnostics;
880- Consumer.getAllDiagnostics (Diagnostics);
881- TracedOp.finish (Diagnostics);
882- }
883-
884899 return ASTRef;
885900}
886901
0 commit comments