14
14
15
15
#include " llvm/ADT/ArrayRef.h"
16
16
#include " llvm/Support/CommandLine.h"
17
- #include " llvm/Support/raw_ostream.h"
18
- #include " llvm/Support/Signals.h"
19
- #include " llvm/Support/FileSystem.h"
20
- #include " llvm/Support/Process.h"
21
17
#include " llvm/Support/ConvertUTF.h"
18
+ #include " llvm/Support/FileSystem.h"
19
+ #include " llvm/Support/FormatVariadic.h"
22
20
#include " llvm/Support/Mutex.h"
23
- #include < unistd.h>
21
+ #include " llvm/Support/Process.h"
22
+ #include " llvm/Support/Signals.h"
23
+ #include " llvm/Support/raw_ostream.h"
24
24
#include < histedit.h>
25
+ #include < unistd.h>
25
26
using namespace llvm ;
26
27
27
28
@@ -605,11 +606,21 @@ static bool printResponse(sourcekitd_response_t Resp) {
605
606
606
607
static bool handleRequest (StringRef ReqStr, std::string &ErrorMessage) {
607
608
bool UseAsync = false ;
608
- ReqStr = ReqStr.ltrim ();
609
- if (ReqStr.startswith (" async" )) {
610
- UseAsync = true ;
611
- ReqStr = ReqStr.substr (strlen (" async" ));
612
- }
609
+ bool UseTimer = false ;
610
+ while (true ) {
611
+ ReqStr = ReqStr.ltrim ();
612
+ if (ReqStr.startswith (" async" )) {
613
+ UseAsync = true ;
614
+ ReqStr = ReqStr.substr (strlen (" async" ));
615
+ continue ;
616
+ }
617
+ if (ReqStr.startswith (" time" )) {
618
+ UseTimer = true ;
619
+ ReqStr = ReqStr.substr (strlen (" time" ));
620
+ continue ;
621
+ }
622
+ break ;
623
+ };
613
624
614
625
SmallString<64 > Str (ReqStr);
615
626
char *Err = nullptr ;
@@ -626,22 +637,33 @@ static bool handleRequest(StringRef ReqStr, std::string &ErrorMessage) {
626
637
627
638
bool IsError = false ;
628
639
640
+ auto startTime = std::chrono::steady_clock::now ();
641
+ auto printRequestTime = [UseTimer, startTime](llvm::raw_ostream &OS) {
642
+ if (!UseTimer)
643
+ return ;
644
+ std::chrono::duration<float , std::milli> delta (
645
+ std::chrono::steady_clock::now () - startTime);
646
+ OS << " request time: " << llvm::formatv (" {0:ms+f3}" , delta) << " \n " ;
647
+ };
648
+
649
+ llvm::raw_fd_ostream OS (STDOUT_FILENO, /* shouldClose=*/ false );
629
650
if (UseAsync) {
630
651
static unsigned AsyncReqCount = 0 ;
631
652
static llvm::sys::Mutex AsynRespPrintMtx;
632
653
633
654
unsigned CurrReqCount = ++AsyncReqCount;
634
- llvm::raw_fd_ostream OS (STDOUT_FILENO, /* shouldClose=*/ false );
635
655
OS << " send async request #" << CurrReqCount << ' \n ' ;
636
656
sourcekitd_send_request (Req, nullptr , ^(sourcekitd_response_t Resp) {
637
657
llvm::sys::ScopedLock L (AsynRespPrintMtx);
638
658
llvm::raw_fd_ostream OS (STDOUT_FILENO, /* shouldClose=*/ false );
639
659
OS << " received async response #" << CurrReqCount << ' \n ' ;
660
+ printRequestTime (OS);
640
661
printResponse (Resp);
641
662
});
642
663
643
664
} else {
644
665
sourcekitd_response_t Resp = sourcekitd_send_request_sync (Req);
666
+ printRequestTime (OS);
645
667
IsError = printResponse (Resp);
646
668
}
647
669
0 commit comments