33
44mod handlers;
55mod subscriptions;
6- pub ( crate ) mod req_queue ;
6+ pub ( crate ) mod request_metrics ;
77
88use std:: {
99 borrow:: Cow ,
@@ -17,11 +17,13 @@ use std::{
1717} ;
1818
1919use 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+ } ;
2123use 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 ,
2527} ;
2628use ra_flycheck:: { CheckTask , Status } ;
2729use ra_ide:: { Canceled , FileId , LineIndex } ;
@@ -37,10 +39,9 @@ use crate::{
3739 from_proto,
3840 global_state:: { file_id_to_url, GlobalState , GlobalStateSnapshot } ,
3941 lsp_ext,
40- main_loop:: subscriptions:: Subscriptions ,
42+ main_loop:: { request_metrics :: RequestMetrics , subscriptions:: Subscriptions } ,
4143 Result ,
4244} ;
43- use req_queue:: ReqQueue ;
4445
4546#[ derive( Debug ) ]
4647pub struct LspError {
@@ -150,10 +151,11 @@ pub fn main_loop(config: Config, connection: Connection) -> Result<()> {
150151 register_options : Some ( serde_json:: to_value ( registration_options) . unwrap ( ) ) ,
151152 } ;
152153 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+ ) ;
157159 connection. sender . send ( request. into ( ) ) . unwrap ( ) ;
158160 }
159161
@@ -261,9 +263,13 @@ impl fmt::Debug for Event {
261263 }
262264}
263265
266+ type ReqHandler = fn ( & mut GlobalState , Response ) ;
267+ const DO_NOTHING : ReqHandler = |_, _| ( ) ;
268+ type Incoming = lsp_server:: Incoming < ( & ' static str , Instant ) > ;
269+
264270#[ derive( Default ) ]
265271struct LoopState {
266- req_queue : ReqQueue < fn ( & mut GlobalState , lsp_server :: Response ) > ,
272+ req_queue : ReqQueue < ( & ' static str , Instant ) , ReqHandler > ,
267273 subscriptions : Subscriptions ,
268274 workspace_loaded : bool ,
269275 roots_progress_reported : Option < usize > ,
@@ -367,14 +373,19 @@ fn loop_turn(
367373fn on_task (
368374 task : Task ,
369375 msg_sender : & Sender < Message > ,
370- incoming_requests : & mut req_queue :: Incoming ,
376+ incoming_requests : & mut Incoming ,
371377 state : & mut GlobalState ,
372378) {
373379 match task {
374380 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+ } ) ;
378389 msg_sender. send ( response. into ( ) ) . unwrap ( ) ;
379390 }
380391 }
@@ -387,7 +398,7 @@ fn on_task(
387398
388399fn on_request (
389400 global_state : & mut GlobalState ,
390- incoming_requests : & mut req_queue :: Incoming ,
401+ incoming_requests : & mut Incoming ,
391402 pool : & ThreadPool ,
392403 task_sender : & Sender < Task > ,
393404 msg_sender : & Sender < Message > ,
@@ -527,37 +538,35 @@ fn on_notification(
527538 Ok ( _) => {
528539 // As stated in https://github.com/microsoft/language-server-protocol/issues/676,
529540 // 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) ;
554562 }
555- ( None , None ) => log:: error!(
556- "received empty server settings response from the client"
557- ) ,
558563 }
559- } ,
560- ) ;
564+ ( None , None ) => {
565+ log:: error!( "received empty server settings response from the client" )
566+ }
567+ }
568+ } ,
569+ ) ;
561570 msg_sender. send ( request. into ( ) ) ?;
562571
563572 return Ok ( ( ) ) ;
@@ -727,15 +736,13 @@ fn send_startup_progress(sender: &Sender<Message>, loop_state: &mut LoopState) {
727736
728737 match ( prev, loop_state. workspace_loaded ) {
729738 ( 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+ ) ;
739746 sender. send ( request. into ( ) ) . unwrap ( ) ;
740747 send_startup_progress_notif (
741748 sender,
@@ -778,7 +785,7 @@ struct PoolDispatcher<'a> {
778785 req : Option < Request > ,
779786 pool : & ' a ThreadPool ,
780787 global_state : & ' a mut GlobalState ,
781- incoming_requests : & ' a mut req_queue :: Incoming ,
788+ incoming_requests : & ' a mut Incoming ,
782789 msg_sender : & ' a Sender < Message > ,
783790 task_sender : & ' a Sender < Task > ,
784791 request_received : Instant ,
@@ -854,11 +861,7 @@ impl<'a> PoolDispatcher<'a> {
854861 return None ;
855862 }
856863 } ;
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 ) ) ;
862865 Some ( ( id, params) )
863866 }
864867
0 commit comments