Skip to content

[sourcekitd-test] A few minor enhancements to support timing requests #16036

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions test/SourceKit/Misc/Inputs/version_request.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
key.request: source.request.protocol_version
}
5 changes: 5 additions & 0 deletions test/SourceKit/Misc/print-response.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// RUN: %sourcekitd-test -req=version | not %FileCheck %s
// RUN: %sourcekitd-test -json-request-path %S/Inputs/version_request.json | not %FileCheck %s
// RUN: %sourcekitd-test -req=version -dont-print-response | %FileCheck %s -allow-empty
// RUN: %sourcekitd-test -json-request-path %S/Inputs/version_request.json -dont-print-response | %FileCheck %s -allow-empty
// CHECK-NOT: key.version_major
12 changes: 12 additions & 0 deletions test/SourceKit/Misc/repeat-request.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// RUN: %sourcekitd-test -repeat-request=5 -req=version | %FileCheck %s
// RUN: %sourcekitd-test -repeat-request=5 -json-request-path %S/Inputs/version_request.json | %FileCheck %s
// CHECK: key.version_major
// CHECK: key.version_major
// CHECK: key.version_major
// CHECK: key.version_major
// CHECK: key.version_major
// CHECK-NOT: key.version_major

// RUN: not %sourcekitd-test -repeat-request=0 -req=version 2>&1 | %FileCheck %s -check-prefix=ERROR
// RUN: not %sourcekitd-test -repeat-request="asdf" -req=version 2>&1 | %FileCheck %s -check-prefix=ERROR
// ERROR: error:
4 changes: 4 additions & 0 deletions test/SourceKit/Misc/time-request.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// RUN: %sourcekitd-test -time-request -req=version 2>&1 | %FileCheck %s
// RUN: %sourcekitd-test -time-request -json-request-path %S/Inputs/version_request.json 2>&1 | %FileCheck %s
// CHECK-DAG: key.version_major
// CHECK-DAG: request time: {{.*}} ms
10 changes: 10 additions & 0 deletions tools/SourceKit/tools/sourcekitd-test/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ def print_response_as_json : Flag<["-"], "print-response-as-json">,
def print_raw_response : Flag<["-"], "print-raw-response">,
HelpText<"Dump the response to stdout">;

def dont_print_response : Flag<["-"], "dont-print-response">,
HelpText<"Do not print the response">;

def group_name : Separate<["-"], "group-name">,
HelpText<"Module group name to print">;

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

def time_request : Flag<["-"], "time-request">,
HelpText<"Print the time taken to process the request">;

def repeat_request : Separate<["-"], "repeat-request">,
HelpText<"Repeat the request n times">, MetaVarName<"<n>">;
def repeat_request_EQ : Joined<["-"], "repeat-request=">, Alias<repeat_request>;

def help : Flag<["-", "--"], "help">,
HelpText<"Display available options">;

Expand Down
18 changes: 18 additions & 0 deletions tools/SourceKit/tools/sourcekitd-test/TestOptions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,10 @@ bool TestOptions::parseArgs(llvm::ArrayRef<const char *> Args) {
PrintRawResponse = true;
break;

case OPT_dont_print_response:
PrintResponse = false;
break;

case OPT_INPUT:
SourceFile = InputArg->getValue();
SourceText = llvm::None;
Expand Down Expand Up @@ -331,6 +335,20 @@ bool TestOptions::parseArgs(llvm::ArrayRef<const char *> Args) {
CancelOnSubsequentRequest = Cancel;
break;

case OPT_time_request:
timeRequest = true;
break;

case OPT_repeat_request:
if (StringRef(InputArg->getValue()).getAsInteger(10, repeatRequest)) {
llvm::errs() << "error: expected integer for 'cancel-on-subsequent-request'\n";
return true;
} else if (repeatRequest < 1) {
llvm::errs() << "error: repeat-request must be >= 1\n";
return true;
}
break;

case OPT_UNKNOWN:
llvm::errs() << "error: unknown argument: "
<< InputArg->getAsString(ParsedArgs) << '\n'
Expand Down
3 changes: 3 additions & 0 deletions tools/SourceKit/tools/sourcekitd-test/TestOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,10 +99,13 @@ struct TestOptions {
bool PrintRequest = true;
bool PrintResponseAsJSON = false;
bool PrintRawResponse = false;
bool PrintResponse = true;
bool SimplifiedDemangling = false;
bool SynthesizedExtensions = false;
bool CollectActionables = false;
bool isAsyncRequest = false;
bool timeRequest = false;
unsigned repeatRequest = 1;
llvm::Optional<bool> CancelOnSubsequentRequest;
bool parseArgs(llvm::ArrayRef<const char *> Args);
void printHelp(bool ShowHidden) const;
Expand Down
73 changes: 60 additions & 13 deletions tools/SourceKit/tools/sourcekitd-test/sourcekitd-test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Signals.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/FormatVariadic.h"
#include <fstream>
#include <unistd.h>
#include <sys/param.h>
Expand Down Expand Up @@ -274,7 +275,35 @@ static bool readPopularAPIList(StringRef filename,
return false;
}

static int handleJsonRequestPath(StringRef QueryPath) {
namespace {
class PrintingTimer {
std::string desc;
llvm::sys::TimePoint<> start;
llvm::raw_ostream &OS;
public:
PrintingTimer(std::string desc, llvm::raw_ostream &OS = llvm::errs())
: desc(std::move(desc)), start(std::chrono::system_clock::now()), OS(OS) {
}
~PrintingTimer() {
std::chrono::duration<float, std::milli> delta(
std::chrono::system_clock::now() - start);
OS << desc << ": " << llvm::formatv("{0:ms+f3}", delta) << "\n";
}
};
}

/// Wrapper for sourcekitd_send_request_sync that handles printing options.
static sourcekitd_response_t sendRequestSync(sourcekitd_object_t req,
const TestOptions &opts) {
if (opts.PrintRequest)
sourcekitd_request_description_dump(req);
Optional<PrintingTimer> timer;
if (opts.timeRequest)
timer.emplace("request time");
return sourcekitd_send_request_sync(req);
}

static int handleJsonRequestPath(StringRef QueryPath, const TestOptions &Opts) {
auto Buffer = getBufferForFilename(QueryPath)->getBuffer();
char *Err = nullptr;
auto Req = sourcekitd_request_create_from_yaml(Buffer.data(), &Err);
Expand All @@ -284,13 +313,17 @@ static int handleJsonRequestPath(StringRef QueryPath) {
free(Err);
return 1;
}
sourcekitd_request_description_dump(Req);
sourcekitd_response_t Resp = sourcekitd_send_request_sync(Req);

sourcekitd_response_t Resp = sendRequestSync(Req, Opts);
auto Error = sourcekitd_response_is_error(Resp);
sourcekitd_response_description_dump_filedesc(Resp, STDOUT_FILENO);
if (Opts.PrintResponse) {
sourcekitd_response_description_dump_filedesc(Resp, STDOUT_FILENO);
}
return Error ? 1 : 0;
}

static int handleTestInvocation(TestOptions Opts, TestOptions &InitOpts);

static int handleTestInvocation(ArrayRef<const char *> Args,
TestOptions &InitOpts) {

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

if (!Opts.JsonRequestPath.empty())
return handleJsonRequestPath(Opts.JsonRequestPath);

if (Optargc < Args.size())
Opts.CompilerArgs = Args.slice(Optargc+1);

assert(Opts.repeatRequest >= 1);
for (unsigned i = 0; i < Opts.repeatRequest; ++i) {
if (int ret = handleTestInvocation(Opts, InitOpts)) {
return ret;
}
}
return 0;
}

static int handleTestInvocation(TestOptions Opts, TestOptions &InitOpts) {

if (!Opts.JsonRequestPath.empty())
return handleJsonRequestPath(Opts.JsonRequestPath, Opts);

if (Opts.Request == SourceKitRequest::DemangleNames ||
Opts.Request == SourceKitRequest::MangleSimpleClasses)
Opts.SourceFile.clear();
Expand Down Expand Up @@ -526,7 +570,7 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
}
StringRef AllArgs = Text.substr(ArgStart + 1, ArgEnd - ArgStart - 1);
AllArgs.split(ArgPieces, ':');
if (!Args.empty()) {
if (!ArgPieces.empty()) {
if (!ArgPieces.back().empty()) {
llvm::errs() << "Swift name is malformed.\n";
return 1;
Expand Down Expand Up @@ -804,11 +848,9 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
}
}

if (Opts.PrintRequest)
sourcekitd_request_description_dump(Req);

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

if (Opts.PrintRequest)
sourcekitd_request_description_dump(Req);

sourcekitd_send_request(Req, nullptr, ^(sourcekitd_response_t resp) {
auto &info = asyncResponses[respIndex];
info.response = resp;
Expand All @@ -848,6 +893,8 @@ static bool handleResponse(sourcekitd_response_t Resp, const TestOptions &Opts,
if (IsError) {
sourcekitd_response_description_dump(Resp);

} else if (!Opts.PrintResponse) {
// Nothing.
} else if (Opts.PrintResponseAsJSON) {
sourcekitd_variant_t Info = sourcekitd_response_get_value(Resp);
char *json = sourcekitd_variant_json_description_copy(Info);
Expand Down Expand Up @@ -988,7 +1035,7 @@ static bool handleResponse(sourcekitd_response_t Resp, const TestOptions &Opts,
sourcekitd_request_dictionary_set_int64(EdReq, KeySyntacticOnly,
!Opts.UsedSema);

sourcekitd_response_t EdResp = sourcekitd_send_request_sync(EdReq);
sourcekitd_response_t EdResp = sendRequestSync(EdReq, Opts);
sourcekitd_response_description_dump_filedesc(EdResp, STDOUT_FILENO);
sourcekitd_response_dispose(EdResp);
sourcekitd_request_release(EdReq);
Expand Down Expand Up @@ -1023,7 +1070,7 @@ static bool handleResponse(sourcekitd_response_t Resp, const TestOptions &Opts,
sourcekitd_request_release(FO);
}

sourcekitd_response_t FmtResp = sourcekitd_send_request_sync(Fmt);
sourcekitd_response_t FmtResp = sendRequestSync(Fmt, Opts);
sourcekitd_response_description_dump_filedesc(FmtResp, STDOUT_FILENO);
sourcekitd_response_dispose(FmtResp);
sourcekitd_request_release(Fmt);
Expand Down