Skip to content

Commit fc7db4d

Browse files
authored
Merge pull request #16036 from benlangmuir/sourcekitd-test-enhancements
[sourcekitd-test] A few minor enhancements to support timing requests
2 parents a155b75 + b78daf5 commit fc7db4d

File tree

8 files changed

+115
-13
lines changed

8 files changed

+115
-13
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
key.request: source.request.protocol_version
3+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// RUN: %sourcekitd-test -req=version | not %FileCheck %s
2+
// RUN: %sourcekitd-test -json-request-path %S/Inputs/version_request.json | not %FileCheck %s
3+
// RUN: %sourcekitd-test -req=version -dont-print-response | %FileCheck %s -allow-empty
4+
// RUN: %sourcekitd-test -json-request-path %S/Inputs/version_request.json -dont-print-response | %FileCheck %s -allow-empty
5+
// CHECK-NOT: key.version_major
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: %sourcekitd-test -repeat-request=5 -req=version | %FileCheck %s
2+
// RUN: %sourcekitd-test -repeat-request=5 -json-request-path %S/Inputs/version_request.json | %FileCheck %s
3+
// CHECK: key.version_major
4+
// CHECK: key.version_major
5+
// CHECK: key.version_major
6+
// CHECK: key.version_major
7+
// CHECK: key.version_major
8+
// CHECK-NOT: key.version_major
9+
10+
// RUN: not %sourcekitd-test -repeat-request=0 -req=version 2>&1 | %FileCheck %s -check-prefix=ERROR
11+
// RUN: not %sourcekitd-test -repeat-request="asdf" -req=version 2>&1 | %FileCheck %s -check-prefix=ERROR
12+
// ERROR: error:
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// RUN: %sourcekitd-test -time-request -req=version 2>&1 | %FileCheck %s
2+
// RUN: %sourcekitd-test -time-request -json-request-path %S/Inputs/version_request.json 2>&1 | %FileCheck %s
3+
// CHECK-DAG: key.version_major
4+
// CHECK-DAG: request time: {{.*}} ms

tools/SourceKit/tools/sourcekitd-test/Options.td

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ def print_response_as_json : Flag<["-"], "print-response-as-json">,
8080
def print_raw_response : Flag<["-"], "print-raw-response">,
8181
HelpText<"Dump the response to stdout">;
8282

83+
def dont_print_response : Flag<["-"], "dont-print-response">,
84+
HelpText<"Do not print the response">;
85+
8386
def group_name : Separate<["-"], "group-name">,
8487
HelpText<"Module group name to print">;
8588

@@ -124,6 +127,13 @@ def cancel_on_subsequent_request : Separate<["-"], "cancel-on-subsequent-request
124127
def cancel_on_subsequent_request_EQ : Joined<["-"], "cancel-on-subsequent-request=">,
125128
Alias<cancel_on_subsequent_request>;
126129

130+
def time_request : Flag<["-"], "time-request">,
131+
HelpText<"Print the time taken to process the request">;
132+
133+
def repeat_request : Separate<["-"], "repeat-request">,
134+
HelpText<"Repeat the request n times">, MetaVarName<"<n>">;
135+
def repeat_request_EQ : Joined<["-"], "repeat-request=">, Alias<repeat_request>;
136+
127137
def help : Flag<["-", "--"], "help">,
128138
HelpText<"Display available options">;
129139

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,10 @@ bool TestOptions::parseArgs(llvm::ArrayRef<const char *> Args) {
276276
PrintRawResponse = true;
277277
break;
278278

279+
case OPT_dont_print_response:
280+
PrintResponse = false;
281+
break;
282+
279283
case OPT_INPUT:
280284
SourceFile = InputArg->getValue();
281285
SourceText = llvm::None;
@@ -331,6 +335,20 @@ bool TestOptions::parseArgs(llvm::ArrayRef<const char *> Args) {
331335
CancelOnSubsequentRequest = Cancel;
332336
break;
333337

338+
case OPT_time_request:
339+
timeRequest = true;
340+
break;
341+
342+
case OPT_repeat_request:
343+
if (StringRef(InputArg->getValue()).getAsInteger(10, repeatRequest)) {
344+
llvm::errs() << "error: expected integer for 'cancel-on-subsequent-request'\n";
345+
return true;
346+
} else if (repeatRequest < 1) {
347+
llvm::errs() << "error: repeat-request must be >= 1\n";
348+
return true;
349+
}
350+
break;
351+
334352
case OPT_UNKNOWN:
335353
llvm::errs() << "error: unknown argument: "
336354
<< InputArg->getAsString(ParsedArgs) << '\n'

tools/SourceKit/tools/sourcekitd-test/TestOptions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,13 @@ struct TestOptions {
9999
bool PrintRequest = true;
100100
bool PrintResponseAsJSON = false;
101101
bool PrintRawResponse = false;
102+
bool PrintResponse = true;
102103
bool SimplifiedDemangling = false;
103104
bool SynthesizedExtensions = false;
104105
bool CollectActionables = false;
105106
bool isAsyncRequest = false;
107+
bool timeRequest = false;
108+
unsigned repeatRequest = 1;
106109
llvm::Optional<bool> CancelOnSubsequentRequest;
107110
bool parseArgs(llvm::ArrayRef<const char *> Args);
108111
void printHelp(bool ShowHidden) const;

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

Lines changed: 60 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "llvm/Support/raw_ostream.h"
2626
#include "llvm/Support/Signals.h"
2727
#include "llvm/Support/FileSystem.h"
28+
#include "llvm/Support/FormatVariadic.h"
2829
#include <fstream>
2930
#include <unistd.h>
3031
#include <sys/param.h>
@@ -274,7 +275,35 @@ static bool readPopularAPIList(StringRef filename,
274275
return false;
275276
}
276277

277-
static int handleJsonRequestPath(StringRef QueryPath) {
278+
namespace {
279+
class PrintingTimer {
280+
std::string desc;
281+
llvm::sys::TimePoint<> start;
282+
llvm::raw_ostream &OS;
283+
public:
284+
PrintingTimer(std::string desc, llvm::raw_ostream &OS = llvm::errs())
285+
: desc(std::move(desc)), start(std::chrono::system_clock::now()), OS(OS) {
286+
}
287+
~PrintingTimer() {
288+
std::chrono::duration<float, std::milli> delta(
289+
std::chrono::system_clock::now() - start);
290+
OS << desc << ": " << llvm::formatv("{0:ms+f3}", delta) << "\n";
291+
}
292+
};
293+
}
294+
295+
/// Wrapper for sourcekitd_send_request_sync that handles printing options.
296+
static sourcekitd_response_t sendRequestSync(sourcekitd_object_t req,
297+
const TestOptions &opts) {
298+
if (opts.PrintRequest)
299+
sourcekitd_request_description_dump(req);
300+
Optional<PrintingTimer> timer;
301+
if (opts.timeRequest)
302+
timer.emplace("request time");
303+
return sourcekitd_send_request_sync(req);
304+
}
305+
306+
static int handleJsonRequestPath(StringRef QueryPath, const TestOptions &Opts) {
278307
auto Buffer = getBufferForFilename(QueryPath)->getBuffer();
279308
char *Err = nullptr;
280309
auto Req = sourcekitd_request_create_from_yaml(Buffer.data(), &Err);
@@ -284,13 +313,17 @@ static int handleJsonRequestPath(StringRef QueryPath) {
284313
free(Err);
285314
return 1;
286315
}
287-
sourcekitd_request_description_dump(Req);
288-
sourcekitd_response_t Resp = sourcekitd_send_request_sync(Req);
316+
317+
sourcekitd_response_t Resp = sendRequestSync(Req, Opts);
289318
auto Error = sourcekitd_response_is_error(Resp);
290-
sourcekitd_response_description_dump_filedesc(Resp, STDOUT_FILENO);
319+
if (Opts.PrintResponse) {
320+
sourcekitd_response_description_dump_filedesc(Resp, STDOUT_FILENO);
321+
}
291322
return Error ? 1 : 0;
292323
}
293324

325+
static int handleTestInvocation(TestOptions Opts, TestOptions &InitOpts);
326+
294327
static int handleTestInvocation(ArrayRef<const char *> Args,
295328
TestOptions &InitOpts) {
296329

@@ -305,12 +338,23 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
305338
if (Opts.parseArgs(Args.slice(0, Optargc)))
306339
return 1;
307340

308-
if (!Opts.JsonRequestPath.empty())
309-
return handleJsonRequestPath(Opts.JsonRequestPath);
310-
311341
if (Optargc < Args.size())
312342
Opts.CompilerArgs = Args.slice(Optargc+1);
313343

344+
assert(Opts.repeatRequest >= 1);
345+
for (unsigned i = 0; i < Opts.repeatRequest; ++i) {
346+
if (int ret = handleTestInvocation(Opts, InitOpts)) {
347+
return ret;
348+
}
349+
}
350+
return 0;
351+
}
352+
353+
static int handleTestInvocation(TestOptions Opts, TestOptions &InitOpts) {
354+
355+
if (!Opts.JsonRequestPath.empty())
356+
return handleJsonRequestPath(Opts.JsonRequestPath, Opts);
357+
314358
if (Opts.Request == SourceKitRequest::DemangleNames ||
315359
Opts.Request == SourceKitRequest::MangleSimpleClasses)
316360
Opts.SourceFile.clear();
@@ -526,7 +570,7 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
526570
}
527571
StringRef AllArgs = Text.substr(ArgStart + 1, ArgEnd - ArgStart - 1);
528572
AllArgs.split(ArgPieces, ':');
529-
if (!Args.empty()) {
573+
if (!ArgPieces.empty()) {
530574
if (!ArgPieces.back().empty()) {
531575
llvm::errs() << "Swift name is malformed.\n";
532576
return 1;
@@ -804,11 +848,9 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
804848
}
805849
}
806850

807-
if (Opts.PrintRequest)
808-
sourcekitd_request_description_dump(Req);
809851

810852
if (!Opts.isAsyncRequest) {
811-
sourcekitd_response_t Resp = sourcekitd_send_request_sync(Req);
853+
sourcekitd_response_t Resp = sendRequestSync(Req, Opts);
812854
sourcekitd_request_release(Req);
813855
return handleResponse(Resp, Opts, SourceFile, std::move(SourceBuf),
814856
&InitOpts)
@@ -823,6 +865,9 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
823865
unsigned respIndex = asyncResponses.size();
824866
asyncResponses.push_back(std::move(info));
825867

868+
if (Opts.PrintRequest)
869+
sourcekitd_request_description_dump(Req);
870+
826871
sourcekitd_send_request(Req, nullptr, ^(sourcekitd_response_t resp) {
827872
auto &info = asyncResponses[respIndex];
828873
info.response = resp;
@@ -848,6 +893,8 @@ static bool handleResponse(sourcekitd_response_t Resp, const TestOptions &Opts,
848893
if (IsError) {
849894
sourcekitd_response_description_dump(Resp);
850895

896+
} else if (!Opts.PrintResponse) {
897+
// Nothing.
851898
} else if (Opts.PrintResponseAsJSON) {
852899
sourcekitd_variant_t Info = sourcekitd_response_get_value(Resp);
853900
char *json = sourcekitd_variant_json_description_copy(Info);
@@ -988,7 +1035,7 @@ static bool handleResponse(sourcekitd_response_t Resp, const TestOptions &Opts,
9881035
sourcekitd_request_dictionary_set_int64(EdReq, KeySyntacticOnly,
9891036
!Opts.UsedSema);
9901037

991-
sourcekitd_response_t EdResp = sourcekitd_send_request_sync(EdReq);
1038+
sourcekitd_response_t EdResp = sendRequestSync(EdReq, Opts);
9921039
sourcekitd_response_description_dump_filedesc(EdResp, STDOUT_FILENO);
9931040
sourcekitd_response_dispose(EdResp);
9941041
sourcekitd_request_release(EdReq);
@@ -1023,7 +1070,7 @@ static bool handleResponse(sourcekitd_response_t Resp, const TestOptions &Opts,
10231070
sourcekitd_request_release(FO);
10241071
}
10251072

1026-
sourcekitd_response_t FmtResp = sourcekitd_send_request_sync(Fmt);
1073+
sourcekitd_response_t FmtResp = sendRequestSync(Fmt, Opts);
10271074
sourcekitd_response_description_dump_filedesc(FmtResp, STDOUT_FILENO);
10281075
sourcekitd_response_dispose(FmtResp);
10291076
sourcekitd_request_release(Fmt);

0 commit comments

Comments
 (0)