aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_lsp_server/src/main_loop.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_lsp_server/src/main_loop.rs')
-rw-r--r--crates/ra_lsp_server/src/main_loop.rs49
1 files changed, 41 insertions, 8 deletions
diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs
index afe0fec89..84f88eeff 100644
--- a/crates/ra_lsp_server/src/main_loop.rs
+++ b/crates/ra_lsp_server/src/main_loop.rs
@@ -2,6 +2,7 @@ mod handlers;
2mod subscriptions; 2mod subscriptions;
3 3
4use std::{ 4use std::{
5 fmt,
5 path::PathBuf, 6 path::PathBuf,
6 sync::Arc, 7 sync::Arc,
7}; 8};
@@ -109,6 +110,43 @@ pub fn main_loop(
109 Ok(()) 110 Ok(())
110} 111}
111 112
113enum Event {
114 Msg(RawMessage),
115 Task(Task),
116 Vfs(VfsTask),
117 Lib(LibraryData),
118}
119
120impl fmt::Debug for Event {
121 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
122 let debug_verbose_not = |not: &RawNotification, f: &mut fmt::Formatter| {
123 f.debug_struct("RawNotification")
124 .field("method", &not.method)
125 .finish()
126 };
127
128 match self {
129 Event::Msg(RawMessage::Notification(not)) => {
130 if not.is::<req::DidOpenTextDocument>() || not.is::<req::DidChangeTextDocument>() {
131 return debug_verbose_not(not, f);
132 }
133 }
134 Event::Task(Task::Notify(not)) => {
135 if not.is::<req::PublishDecorations>() || not.is::<req::PublishDiagnostics>() {
136 return debug_verbose_not(not, f);
137 }
138 }
139 _ => (),
140 }
141 match self {
142 Event::Msg(it) => fmt::Debug::fmt(it, f),
143 Event::Task(it) => fmt::Debug::fmt(it, f),
144 Event::Vfs(it) => fmt::Debug::fmt(it, f),
145 Event::Lib(it) => fmt::Debug::fmt(it, f),
146 }
147 }
148}
149
112fn main_loop_inner( 150fn main_loop_inner(
113 internal_mode: bool, 151 internal_mode: bool,
114 publish_decorations: bool, 152 publish_decorations: bool,
@@ -123,13 +161,6 @@ fn main_loop_inner(
123) -> Result<()> { 161) -> Result<()> {
124 let (libdata_sender, libdata_receiver) = unbounded(); 162 let (libdata_sender, libdata_receiver) = unbounded();
125 loop { 163 loop {
126 #[derive(Debug)]
127 enum Event {
128 Msg(RawMessage),
129 Task(Task),
130 Vfs(VfsTask),
131 Lib(LibraryData),
132 }
133 log::trace!("selecting"); 164 log::trace!("selecting");
134 let event = select! { 165 let event = select! {
135 recv(msg_receiver, msg) => match msg { 166 recv(msg_receiver, msg) => match msg {
@@ -143,7 +174,8 @@ fn main_loop_inner(
143 } 174 }
144 recv(libdata_receiver, data) => Event::Lib(data.unwrap()) 175 recv(libdata_receiver, data) => Event::Lib(data.unwrap())
145 }; 176 };
146 log::info!("{:?}", event); 177 log::info!("loop_turn = {:?}", event);
178 let start = std::time::Instant::now();
147 let mut state_changed = false; 179 let mut state_changed = false;
148 match event { 180 match event {
149 Event::Task(task) => on_task(task, msg_sender, pending_requests), 181 Event::Task(task) => on_task(task, msg_sender, pending_requests),
@@ -206,6 +238,7 @@ fn main_loop_inner(
206 subs.subscriptions(), 238 subs.subscriptions(),
207 ) 239 )
208 } 240 }
241 log::info!("loop_turn = {:?}", start.elapsed());
209 } 242 }
210} 243}
211 244