Skip to content

Commit ad442e9

Browse files
authored
Merge pull request #16895 from benlangmuir/notify-parse-args
[sourcekit] Send compile notifications when argument parsing files
2 parents 7c4aaef + c3e5d63 commit ad442e9

File tree

5 files changed

+108
-45
lines changed

5 files changed

+108
-45
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// RUN: not %sourcekitd-test -req=track-compiles == -req=complete %s -offset=0 -- %s -no-such-arg | %FileCheck %s -check-prefix=ARG_PARSE_1
2+
// RUN: %sourcekitd-test -req=track-compiles == -req=sema %s -print-raw-response -- %s -no-such-arg | %FileCheck %s -check-prefix=ARG_PARSE_1
3+
// RUN: %sourcekitd-test -req=track-compiles == -req=cursor -offset=0 %s -- %s -no-such-arg | %FileCheck %s -check-prefix=ARG_PARSE_1
4+
// ARG_PARSE_1: {
5+
// ARG_PARSE_1: key.notification: source.notification.compile-will-start
6+
// ARG_PARSE_1: key.compileid: [[CID1:".*"]]
7+
// ARG_PARSE_1: key.compilerargs-string: "{{.*}}.swift -no-such-arg"
8+
// ARG_PARSE_1: }
9+
// ARG_PARSE_1: {
10+
// ARG_PARSE_1: key.notification: source.notification.compile-did-finish
11+
// ARG_PARSE_1: key.diagnostics: [
12+
// ARG_PARSE_1: {
13+
// ARG_PARSE_1: key.filepath: "<unknown>",
14+
// ARG_PARSE_1: key.severity: source.diagnostic.severity.error,
15+
// ARG_PARSE_1: key.description: "unknown argument: '-no-such-arg'"
16+
// ARG_PARSE_1: }
17+
// ARG_PARSE_1: ]
18+
// ARG_PARSE_1: key.compileid: [[CID1]]
19+
// ARG_PARSE_1: }
20+
// ARG_PARSE_1-NOT: compile-will-start
21+
// ARG_PARSE_1-NOT: compile-did-finish
22+
23+
// RUN: not %sourcekitd-test -req=track-compiles == -req=complete %s -offset=0 | %FileCheck %s -check-prefix=ARG_PARSE_2
24+
// RUN: %sourcekitd-test -req=track-compiles == -req=sema %s -print-raw-response | %FileCheck %s -check-prefix=ARG_PARSE_2
25+
// ARG_PARSE_2: {
26+
// ARG_PARSE_2: key.notification: source.notification.compile-will-start
27+
// ARG_PARSE_2: key.compileid: [[CID1:".*"]]
28+
// ARG_PARSE_2: }
29+
// ARG_PARSE_2: {
30+
// ARG_PARSE_2: key.notification: source.notification.compile-did-finish
31+
// ARG_PARSE_2: key.diagnostics: [
32+
// ARG_PARSE_2: {
33+
// ARG_PARSE_2: key.filepath: "<unknown>",
34+
// ARG_PARSE_2: key.severity: source.diagnostic.severity.error,
35+
// ARG_PARSE_2: key.description: "no input files"
36+
// ARG_PARSE_2: }
37+
// ARG_PARSE_2: ]
38+
// ARG_PARSE_2: key.compileid: [[CID1]]
39+
// ARG_PARSE_2: }
40+
// ARG_PARSE_2-NOT: compile-will-start
41+
// ARG_PARSE_2-NOT: compile-did-finish

tools/SourceKit/include/SourceKit/Support/Tracing.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#define LLVM_SOURCEKIT_SUPPORT_TRACING_H
1515

1616
#include "SourceKit/Core/LLVM.h"
17+
#include "SourceKit/Core/LangSupport.h"
1718
#include "SourceKit/Support/UIdent.h"
1819
#include "swift/Basic/OptionSet.h"
1920
#include "llvm/ADT/ArrayRef.h"
@@ -91,8 +92,11 @@ void unregisterConsumer(TraceConsumer *Consumer);
9192

9293
// Class that utilizes the RAII idiom for the operations being traced
9394
class TracedOperation final {
95+
using DiagnosticProvider = std::function<void(SmallVectorImpl<DiagnosticEntryInfo> &)>;
96+
9497
OperationKind OpKind;
9598
llvm::Optional<uint64_t> OpId;
99+
llvm::Optional<DiagnosticProvider> DiagProvider;
96100
bool Enabled;
97101

98102
public:
@@ -116,13 +120,20 @@ class TracedOperation final {
116120
OpId = startOperation(OpKind, Inv, OpArgs);
117121
}
118122

119-
void finish(ArrayRef<DiagnosticEntryInfo> Diagnostics = llvm::None) {
123+
void finish() {
120124
if (OpId.hasValue()) {
125+
SmallVector<DiagnosticEntryInfo, 8> Diagnostics;
126+
if (DiagProvider.hasValue())
127+
(*DiagProvider)(Diagnostics);
121128
operationFinished(OpId.getValue(), OpKind, Diagnostics);
122129
OpId.reset();
123130
}
124131
}
125132

133+
void setDiagnosticProvider(DiagnosticProvider &&DiagProvider) {
134+
assert(!this->DiagProvider.hasValue());
135+
this->DiagProvider = std::move(DiagProvider);
136+
}
126137
};
127138

128139
} // namespace sourcekitd

tools/SourceKit/lib/SwiftLang/SwiftASTManager.cpp

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -512,8 +512,26 @@ SwiftInvocationRef
512512
SwiftASTManager::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

tools/SourceKit/lib/SwiftLang/SwiftCompletion.cpp

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,12 @@ static bool swiftCodeCompleteImpl(SwiftLangSupport &Lang,
119119
UnresolvedInputFile->getBuffer(),
120120
Lang.resolvePathSymlinks(UnresolvedInputFile->getBufferIdentifier()));
121121

122+
auto origBuffSize = InputFile->getBufferSize();
123+
unsigned CodeCompletionOffset = Offset;
124+
if (CodeCompletionOffset > origBuffSize) {
125+
CodeCompletionOffset = origBuffSize;
126+
}
127+
122128
CompilerInstance CI;
123129
// Display diagnostics to stderr.
124130
PrintingDiagnosticConsumer PrintDiags;
@@ -128,6 +134,16 @@ static bool swiftCodeCompleteImpl(SwiftLangSupport &Lang,
128134
trace::TracedOperation TracedOp(trace::OperationKind::CodeCompletion);
129135
if (TracedOp.enabled()) {
130136
CI.addDiagnosticConsumer(&TraceDiags);
137+
trace::SwiftInvocation SwiftArgs;
138+
trace::initTraceInfo(SwiftArgs, InputFile->getBufferIdentifier(), Args);
139+
TracedOp.setDiagnosticProvider(
140+
[&TraceDiags](SmallVectorImpl<DiagnosticEntryInfo> &diags) {
141+
TraceDiags.getAllDiagnostics(diags);
142+
});
143+
TracedOp.start(SwiftArgs,
144+
{std::make_pair("OriginalOffset", std::to_string(Offset)),
145+
std::make_pair("Offset",
146+
std::to_string(CodeCompletionOffset))});
131147
}
132148

133149
CompilerInvocation Invocation;
@@ -141,12 +157,6 @@ static bool swiftCodeCompleteImpl(SwiftLangSupport &Lang,
141157
return false;
142158
}
143159

144-
auto origBuffSize = InputFile->getBufferSize();
145-
unsigned CodeCompletionOffset = Offset;
146-
if (CodeCompletionOffset > origBuffSize) {
147-
CodeCompletionOffset = origBuffSize;
148-
}
149-
150160
const char *Position = InputFile->getBufferStart() + CodeCompletionOffset;
151161
std::unique_ptr<llvm::WritableMemoryBuffer> NewBuffer =
152162
llvm::WritableMemoryBuffer::getNewUninitMemBuffer(
@@ -178,28 +188,13 @@ static bool swiftCodeCompleteImpl(SwiftLangSupport &Lang,
178188
return true;
179189
}
180190

181-
if (TracedOp.enabled()) {
182-
trace::SwiftInvocation SwiftArgs;
183-
trace::initTraceInfo(SwiftArgs, InputFile->getBufferIdentifier(), Args);
184-
TracedOp.start(SwiftArgs,
185-
{std::make_pair("OriginalOffset", std::to_string(Offset)),
186-
std::make_pair("Offset",
187-
std::to_string(CodeCompletionOffset))});
188-
}
189-
190191
CloseClangModuleFiles scopedCloseFiles(
191192
*CI.getASTContext().getClangModuleLoader());
192193
SwiftConsumer.setContext(&CI.getASTContext(), &Invocation,
193194
&CompletionContext);
194195
CI.performSema();
195196
SwiftConsumer.clearContext();
196197

197-
if (TracedOp.enabled()) {
198-
SmallVector<DiagnosticEntryInfo, 8> Diagnostics;
199-
TraceDiags.getAllDiagnostics(Diagnostics);
200-
TracedOp.finish(Diagnostics);
201-
}
202-
203198
return true;
204199
}
205200

tools/SourceKit/tools/sourcekitd-test/sourcekitd-test.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,12 @@ struct NotificationBuffer {
139139
};
140140
static NotificationBuffer notificationBuffer;
141141

142+
static void printBufferedNotifications() {
143+
notificationBuffer.handleNotifications([](sourcekitd_response_t note) {
144+
sourcekitd_response_description_dump_filedesc(note, STDOUT_FILENO);
145+
});
146+
}
147+
142148
static int skt_main(int argc, const char **argv);
143149

144150
int main(int argc, const char **argv) {
@@ -173,12 +179,6 @@ static int skt_main(int argc, const char **argv) {
173179
#define REFACTORING(KIND, NAME, ID) Kind##Refactoring##KIND = sourcekitd_uid_get_from_cstr("source.refactoring.kind."#ID);
174180
#include "swift/IDE/RefactoringKinds.def"
175181

176-
auto printBufferedNotifications = []{
177-
notificationBuffer.handleNotifications([](sourcekitd_response_t note) {
178-
sourcekitd_response_description_dump_filedesc(note, STDOUT_FILENO);
179-
});
180-
};
181-
182182
// A test invocation may initialize the options to be used for subsequent
183183
// invocations.
184184
TestOptions InitOpts;
@@ -196,7 +196,6 @@ static int skt_main(int argc, const char **argv) {
196196
sourcekitd_shutdown();
197197
return ret;
198198
}
199-
printBufferedNotifications();
200199
Args = Args.slice(i+1);
201200
}
202201

@@ -343,7 +342,9 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
343342

344343
assert(Opts.repeatRequest >= 1);
345344
for (unsigned i = 0; i < Opts.repeatRequest; ++i) {
346-
if (int ret = handleTestInvocation(Opts, InitOpts)) {
345+
int ret = handleTestInvocation(Opts, InitOpts);
346+
printBufferedNotifications();
347+
if (ret) {
347348
return ret;
348349
}
349350
}

0 commit comments

Comments
 (0)