3
3
4
4
mod handlers;
5
5
mod subscriptions;
6
- pub ( crate ) mod req_queue ;
6
+ pub ( crate ) mod request_metrics ;
7
7
8
8
use std:: {
9
9
borrow:: Cow ,
@@ -17,11 +17,13 @@ use std::{
17
17
} ;
18
18
19
19
use crossbeam_channel:: { never, select, unbounded, RecvError , Sender } ;
20
- use lsp_server:: { Connection , ErrorCode , Message , Notification , Request , RequestId , Response } ;
20
+ use lsp_server:: {
21
+ Connection , ErrorCode , Message , Notification , ReqQueue , Request , RequestId , Response ,
22
+ } ;
21
23
use lsp_types:: {
22
- DidChangeTextDocumentParams , NumberOrString , TextDocumentContentChangeEvent , WorkDoneProgress ,
23
- WorkDoneProgressBegin , WorkDoneProgressCreateParams , WorkDoneProgressEnd ,
24
- WorkDoneProgressReport ,
24
+ request :: Request as _ , DidChangeTextDocumentParams , NumberOrString ,
25
+ TextDocumentContentChangeEvent , WorkDoneProgress , WorkDoneProgressBegin ,
26
+ WorkDoneProgressCreateParams , WorkDoneProgressEnd , WorkDoneProgressReport ,
25
27
} ;
26
28
use ra_flycheck:: { CheckTask , Status } ;
27
29
use ra_ide:: { Canceled , FileId , LineIndex } ;
@@ -37,10 +39,9 @@ use crate::{
37
39
from_proto,
38
40
global_state:: { file_id_to_url, GlobalState , GlobalStateSnapshot } ,
39
41
lsp_ext,
40
- main_loop:: subscriptions:: Subscriptions ,
42
+ main_loop:: { request_metrics :: RequestMetrics , subscriptions:: Subscriptions } ,
41
43
Result ,
42
44
} ;
43
- use req_queue:: ReqQueue ;
44
45
45
46
#[ derive( Debug ) ]
46
47
pub struct LspError {
@@ -150,10 +151,11 @@ pub fn main_loop(config: Config, connection: Connection) -> Result<()> {
150
151
register_options : Some ( serde_json:: to_value ( registration_options) . unwrap ( ) ) ,
151
152
} ;
152
153
let params = lsp_types:: RegistrationParams { registrations : vec ! [ registration] } ;
153
- let request = loop_state
154
- . req_queue
155
- . outgoing
156
- . register :: < lsp_types:: request:: RegisterCapability > ( params, |_, _| ( ) ) ;
154
+ let request = loop_state. req_queue . outgoing . register (
155
+ lsp_types:: request:: RegisterCapability :: METHOD . to_string ( ) ,
156
+ params,
157
+ DO_NOTHING ,
158
+ ) ;
157
159
connection. sender . send ( request. into ( ) ) . unwrap ( ) ;
158
160
}
159
161
@@ -261,9 +263,13 @@ impl fmt::Debug for Event {
261
263
}
262
264
}
263
265
266
+ type ReqHandler = fn ( & mut GlobalState , Response ) ;
267
+ const DO_NOTHING : ReqHandler = |_, _| ( ) ;
268
+ type Incoming = lsp_server:: Incoming < ( & ' static str , Instant ) > ;
269
+
264
270
#[ derive( Default ) ]
265
271
struct LoopState {
266
- req_queue : ReqQueue < fn ( & mut GlobalState , lsp_server :: Response ) > ,
272
+ req_queue : ReqQueue < ( & ' static str , Instant ) , ReqHandler > ,
267
273
subscriptions : Subscriptions ,
268
274
workspace_loaded : bool ,
269
275
roots_progress_reported : Option < usize > ,
@@ -367,14 +373,19 @@ fn loop_turn(
367
373
fn on_task (
368
374
task : Task ,
369
375
msg_sender : & Sender < Message > ,
370
- incoming_requests : & mut req_queue :: Incoming ,
376
+ incoming_requests : & mut Incoming ,
371
377
state : & mut GlobalState ,
372
378
) {
373
379
match task {
374
380
Task :: Respond ( response) => {
375
- if let Some ( completed) = incoming_requests. complete ( response. id . clone ( ) ) {
376
- log:: info!( "handled req#{} in {:?}" , completed. id, completed. duration) ;
377
- state. complete_request ( completed) ;
381
+ if let Some ( ( method, start) ) = incoming_requests. complete ( response. id . clone ( ) ) {
382
+ let duration = start. elapsed ( ) ;
383
+ log:: info!( "handled req#{} in {:?}" , response. id, duration) ;
384
+ state. complete_request ( RequestMetrics {
385
+ id : response. id . clone ( ) ,
386
+ method : method. to_string ( ) ,
387
+ duration,
388
+ } ) ;
378
389
msg_sender. send ( response. into ( ) ) . unwrap ( ) ;
379
390
}
380
391
}
@@ -387,7 +398,7 @@ fn on_task(
387
398
388
399
fn on_request (
389
400
global_state : & mut GlobalState ,
390
- incoming_requests : & mut req_queue :: Incoming ,
401
+ incoming_requests : & mut Incoming ,
391
402
pool : & ThreadPool ,
392
403
task_sender : & Sender < Task > ,
393
404
msg_sender : & Sender < Message > ,
@@ -527,37 +538,35 @@ fn on_notification(
527
538
Ok ( _) => {
528
539
// As stated in https://github.com/microsoft/language-server-protocol/issues/676,
529
540
// this notification's parameters should be ignored and the actual config queried separately.
530
- let request = loop_state
531
- . req_queue
532
- . outgoing
533
- . register :: < lsp_types:: request:: WorkspaceConfiguration > (
534
- lsp_types:: ConfigurationParams {
535
- items : vec ! [ lsp_types:: ConfigurationItem {
536
- scope_uri: None ,
537
- section: Some ( "rust-analyzer" . to_string( ) ) ,
538
- } ] ,
539
- } ,
540
- |global_state, resp| {
541
- log:: debug!( "config update response: '{:?}" , resp) ;
542
- let Response { error, result, .. } = resp;
543
-
544
- match ( error, result) {
545
- ( Some ( err) , _) => {
546
- log:: error!( "failed to fetch the server settings: {:?}" , err)
547
- }
548
- ( None , Some ( configs) ) => {
549
- if let Some ( new_config) = configs. get ( 0 ) {
550
- let mut config = global_state. config . clone ( ) ;
551
- config. update ( & new_config) ;
552
- global_state. update_configuration ( config) ;
553
- }
541
+ let request = loop_state. req_queue . outgoing . register (
542
+ lsp_types:: request:: WorkspaceConfiguration :: METHOD . to_string ( ) ,
543
+ lsp_types:: ConfigurationParams {
544
+ items : vec ! [ lsp_types:: ConfigurationItem {
545
+ scope_uri: None ,
546
+ section: Some ( "rust-analyzer" . to_string( ) ) ,
547
+ } ] ,
548
+ } ,
549
+ |global_state, resp| {
550
+ log:: debug!( "config update response: '{:?}" , resp) ;
551
+ let Response { error, result, .. } = resp;
552
+
553
+ match ( error, result) {
554
+ ( Some ( err) , _) => {
555
+ log:: error!( "failed to fetch the server settings: {:?}" , err)
556
+ }
557
+ ( None , Some ( configs) ) => {
558
+ if let Some ( new_config) = configs. get ( 0 ) {
559
+ let mut config = global_state. config . clone ( ) ;
560
+ config. update ( & new_config) ;
561
+ global_state. update_configuration ( config) ;
554
562
}
555
- ( None , None ) => log:: error!(
556
- "received empty server settings response from the client"
557
- ) ,
558
563
}
559
- } ,
560
- ) ;
564
+ ( None , None ) => {
565
+ log:: error!( "received empty server settings response from the client" )
566
+ }
567
+ }
568
+ } ,
569
+ ) ;
561
570
msg_sender. send ( request. into ( ) ) ?;
562
571
563
572
return Ok ( ( ) ) ;
@@ -727,15 +736,13 @@ fn send_startup_progress(sender: &Sender<Message>, loop_state: &mut LoopState) {
727
736
728
737
match ( prev, loop_state. workspace_loaded ) {
729
738
( None , false ) => {
730
- let request = loop_state
731
- . req_queue
732
- . outgoing
733
- . register :: < lsp_types:: request:: WorkDoneProgressCreate > (
734
- WorkDoneProgressCreateParams {
735
- token : lsp_types:: ProgressToken :: String ( "rustAnalyzer/startup" . into ( ) ) ,
736
- } ,
737
- |_, _| ( ) ,
738
- ) ;
739
+ let request = loop_state. req_queue . outgoing . register (
740
+ lsp_types:: request:: WorkDoneProgressCreate :: METHOD . to_string ( ) ,
741
+ WorkDoneProgressCreateParams {
742
+ token : lsp_types:: ProgressToken :: String ( "rustAnalyzer/startup" . into ( ) ) ,
743
+ } ,
744
+ DO_NOTHING ,
745
+ ) ;
739
746
sender. send ( request. into ( ) ) . unwrap ( ) ;
740
747
send_startup_progress_notif (
741
748
sender,
@@ -778,7 +785,7 @@ struct PoolDispatcher<'a> {
778
785
req : Option < Request > ,
779
786
pool : & ' a ThreadPool ,
780
787
global_state : & ' a mut GlobalState ,
781
- incoming_requests : & ' a mut req_queue :: Incoming ,
788
+ incoming_requests : & ' a mut Incoming ,
782
789
msg_sender : & ' a Sender < Message > ,
783
790
task_sender : & ' a Sender < Task > ,
784
791
request_received : Instant ,
@@ -854,11 +861,7 @@ impl<'a> PoolDispatcher<'a> {
854
861
return None ;
855
862
}
856
863
} ;
857
- self . incoming_requests . register ( req_queue:: PendingInRequest {
858
- id : id. clone ( ) ,
859
- method : R :: METHOD . to_string ( ) ,
860
- received : self . request_received ,
861
- } ) ;
864
+ self . incoming_requests . register ( id. clone ( ) , ( R :: METHOD , self . request_received ) ) ;
862
865
Some ( ( id, params) )
863
866
}
864
867
0 commit comments