diff options
author | Aleksey Kladov <[email protected]> | 2019-05-29 13:42:14 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-05-29 13:47:46 +0100 |
commit | 2c9a1cb3dd941b3f2f608a0633f620478bce0c68 (patch) | |
tree | 130e5984e2a40f467815f9feb49c989beaa7ca97 /crates/ra_lsp_server/src/server_world.rs | |
parent | e45c350a3b0ec5b25c23c334e09eba2901adbcd4 (diff) |
add latest requests to status page
Diffstat (limited to 'crates/ra_lsp_server/src/server_world.rs')
-rw-r--r-- | crates/ra_lsp_server/src/server_world.rs | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/crates/ra_lsp_server/src/server_world.rs b/crates/ra_lsp_server/src/server_world.rs index b2808b817..b63927a4f 100644 --- a/crates/ra_lsp_server/src/server_world.rs +++ b/crates/ra_lsp_server/src/server_world.rs | |||
@@ -1,6 +1,7 @@ | |||
1 | use std::{ | 1 | use std::{ |
2 | path::{Path, PathBuf}, | 2 | path::{Path, PathBuf}, |
3 | sync::Arc, | 3 | sync::Arc, |
4 | time::Duration, | ||
4 | }; | 5 | }; |
5 | 6 | ||
6 | use lsp_types::Url; | 7 | use lsp_types::Url; |
@@ -28,12 +29,26 @@ pub struct ServerWorldState { | |||
28 | pub workspaces: Arc<Vec<ProjectWorkspace>>, | 29 | pub workspaces: Arc<Vec<ProjectWorkspace>>, |
29 | pub analysis_host: AnalysisHost, | 30 | pub analysis_host: AnalysisHost, |
30 | pub vfs: Arc<RwLock<Vfs>>, | 31 | pub vfs: Arc<RwLock<Vfs>>, |
32 | // hand-rolling VecDeque here to print things in a nicer way | ||
33 | pub latest_completed_requests: Arc<RwLock<[CompletedRequest; N_COMPLETED_REQUESTS]>>, | ||
34 | pub request_idx: usize, | ||
31 | } | 35 | } |
32 | 36 | ||
37 | const N_COMPLETED_REQUESTS: usize = 10; | ||
38 | |||
33 | pub struct ServerWorld { | 39 | pub struct ServerWorld { |
34 | pub workspaces: Arc<Vec<ProjectWorkspace>>, | 40 | pub workspaces: Arc<Vec<ProjectWorkspace>>, |
35 | pub analysis: Analysis, | 41 | pub analysis: Analysis, |
36 | pub vfs: Arc<RwLock<Vfs>>, | 42 | pub vfs: Arc<RwLock<Vfs>>, |
43 | pub latest_completed_requests: Arc<RwLock<[CompletedRequest; N_COMPLETED_REQUESTS]>>, | ||
44 | pub request_idx: usize, | ||
45 | } | ||
46 | |||
47 | #[derive(Debug, Default)] | ||
48 | pub struct CompletedRequest { | ||
49 | pub id: u64, | ||
50 | pub method: String, | ||
51 | pub duration: Duration, | ||
37 | } | 52 | } |
38 | 53 | ||
39 | impl ServerWorldState { | 54 | impl ServerWorldState { |
@@ -73,6 +88,8 @@ impl ServerWorldState { | |||
73 | workspaces: Arc::new(workspaces), | 88 | workspaces: Arc::new(workspaces), |
74 | analysis_host, | 89 | analysis_host, |
75 | vfs: Arc::new(RwLock::new(vfs)), | 90 | vfs: Arc::new(RwLock::new(vfs)), |
91 | latest_completed_requests: Default::default(), | ||
92 | request_idx: 0, | ||
76 | } | 93 | } |
77 | } | 94 | } |
78 | 95 | ||
@@ -137,6 +154,8 @@ impl ServerWorldState { | |||
137 | workspaces: Arc::clone(&self.workspaces), | 154 | workspaces: Arc::clone(&self.workspaces), |
138 | analysis: self.analysis_host.analysis(), | 155 | analysis: self.analysis_host.analysis(), |
139 | vfs: Arc::clone(&self.vfs), | 156 | vfs: Arc::clone(&self.vfs), |
157 | latest_completed_requests: Arc::clone(&self.latest_completed_requests), | ||
158 | request_idx: self.request_idx.checked_sub(1).unwrap_or(N_COMPLETED_REQUESTS - 1), | ||
140 | } | 159 | } |
141 | } | 160 | } |
142 | 161 | ||
@@ -147,6 +166,16 @@ impl ServerWorldState { | |||
147 | pub fn collect_garbage(&mut self) { | 166 | pub fn collect_garbage(&mut self) { |
148 | self.analysis_host.collect_garbage() | 167 | self.analysis_host.collect_garbage() |
149 | } | 168 | } |
169 | |||
170 | pub fn complete_request(&mut self, request: CompletedRequest) { | ||
171 | // special case: don't track status request itself | ||
172 | if request.method == "rust-analyzer/analyzerStatus" { | ||
173 | return; | ||
174 | } | ||
175 | let idx = self.request_idx; | ||
176 | self.latest_completed_requests.write()[idx] = request; | ||
177 | self.request_idx = (idx + 1) % N_COMPLETED_REQUESTS; | ||
178 | } | ||
150 | } | 179 | } |
151 | 180 | ||
152 | impl ServerWorld { | 181 | impl ServerWorld { |