diff options
Diffstat (limited to 'crates/ra_proc_macro/src/process.rs')
-rw-r--r-- | crates/ra_proc_macro/src/process.rs | 74 |
1 files changed, 27 insertions, 47 deletions
diff --git a/crates/ra_proc_macro/src/process.rs b/crates/ra_proc_macro/src/process.rs index daae9a7e0..2b1f8535a 100644 --- a/crates/ra_proc_macro/src/process.rs +++ b/crates/ra_proc_macro/src/process.rs | |||
@@ -3,11 +3,12 @@ | |||
3 | use crossbeam_channel::{bounded, Receiver, Sender}; | 3 | use crossbeam_channel::{bounded, Receiver, Sender}; |
4 | use ra_tt::Subtree; | 4 | use ra_tt::Subtree; |
5 | 5 | ||
6 | use crate::msg::{ErrorCode, Message, Request, Response, ResponseError}; | 6 | use crate::msg::{ErrorCode, Request, Response, ResponseError, Message}; |
7 | use crate::rpc::{ExpansionResult, ExpansionTask, ListMacrosResult, ListMacrosTask, ProcMacroKind}; | 7 | use crate::rpc::{ExpansionResult, ExpansionTask, ListMacrosResult, ListMacrosTask, ProcMacroKind}; |
8 | 8 | ||
9 | use io::{BufRead, BufReader}; | 9 | use io::{BufRead, BufReader}; |
10 | use std::{ | 10 | use std::{ |
11 | convert::{TryFrom, TryInto}, | ||
11 | io::{self, Write}, | 12 | io::{self, Write}, |
12 | path::{Path, PathBuf}, | 13 | path::{Path, PathBuf}, |
13 | process::{Child, Command, Stdio}, | 14 | process::{Child, Command, Stdio}, |
@@ -26,7 +27,7 @@ pub(crate) struct ProcMacroProcessThread { | |||
26 | } | 27 | } |
27 | 28 | ||
28 | enum Task { | 29 | enum Task { |
29 | Request { req: Message, result_tx: Sender<Message> }, | 30 | Request { req: Request, result_tx: Sender<Response> }, |
30 | Close, | 31 | Close, |
31 | } | 32 | } |
32 | 33 | ||
@@ -96,7 +97,7 @@ impl ProcMacroProcessSrv { | |||
96 | ) -> Result<Vec<(String, ProcMacroKind)>, ra_tt::ExpansionError> { | 97 | ) -> Result<Vec<(String, ProcMacroKind)>, ra_tt::ExpansionError> { |
97 | let task = ListMacrosTask { lib: dylib_path.to_path_buf() }; | 98 | let task = ListMacrosTask { lib: dylib_path.to_path_buf() }; |
98 | 99 | ||
99 | let result: ListMacrosResult = self.send_task("list_macros", task)?; | 100 | let result: ListMacrosResult = self.send_task(Request::ListMacro(task))?; |
100 | Ok(result.macros) | 101 | Ok(result.macros) |
101 | } | 102 | } |
102 | 103 | ||
@@ -113,26 +114,19 @@ impl ProcMacroProcessSrv { | |||
113 | lib: dylib_path.to_path_buf(), | 114 | lib: dylib_path.to_path_buf(), |
114 | }; | 115 | }; |
115 | 116 | ||
116 | let result: ExpansionResult = self.send_task("custom_derive", task)?; | 117 | let result: ExpansionResult = self.send_task(Request::ExpansionMacro(task))?; |
117 | Ok(result.expansion) | 118 | Ok(result.expansion) |
118 | } | 119 | } |
119 | 120 | ||
120 | pub fn send_task<'a, T, R>(&self, method: &str, task: T) -> Result<R, ra_tt::ExpansionError> | 121 | pub fn send_task<R>(&self, req: Request) -> Result<R, ra_tt::ExpansionError> |
121 | where | 122 | where |
122 | T: serde::Serialize, | 123 | R: TryFrom<Response, Error = &'static str>, |
123 | R: serde::de::DeserializeOwned + Default, | ||
124 | { | 124 | { |
125 | let sender = match &self.inner { | 125 | let sender = match &self.inner { |
126 | None => return Err(ra_tt::ExpansionError::Unknown("No sender is found.".to_string())), | 126 | None => return Err(ra_tt::ExpansionError::Unknown("No sender is found.".to_string())), |
127 | Some(it) => it, | 127 | Some(it) => it, |
128 | }; | 128 | }; |
129 | 129 | ||
130 | let msg = serde_json::to_value(task).unwrap(); | ||
131 | |||
132 | // FIXME: use a proper request id | ||
133 | let id = 0; | ||
134 | let req = Request { id: id.into(), method: method.into(), params: msg }; | ||
135 | |||
136 | let (result_tx, result_rx) = bounded(0); | 130 | let (result_tx, result_rx) = bounded(0); |
137 | 131 | ||
138 | sender.send(Task::Request { req: req.into(), result_tx }).map_err(|err| { | 132 | sender.send(Task::Request { req: req.into(), result_tx }).map_err(|err| { |
@@ -141,27 +135,18 @@ impl ProcMacroProcessSrv { | |||
141 | err | 135 | err |
142 | )) | 136 | )) |
143 | })?; | 137 | })?; |
144 | let response = result_rx.recv().unwrap(); | ||
145 | 138 | ||
146 | match response { | 139 | let res = result_rx.recv().unwrap(); |
147 | Message::Request(_) => { | 140 | match res { |
148 | return Err(ra_tt::ExpansionError::Unknown( | 141 | Response::Error(err) => { |
149 | "Return request from ra_proc_srv".into(), | 142 | return Err(ra_tt::ExpansionError::ExpansionError(err.message)); |
150 | )) | ||
151 | } | ||
152 | Message::Response(res) => { | ||
153 | if let Some(err) = res.error { | ||
154 | return Err(ra_tt::ExpansionError::ExpansionError(err.message)); | ||
155 | } | ||
156 | match res.result { | ||
157 | None => Ok(R::default()), | ||
158 | Some(res) => { | ||
159 | let result: R = serde_json::from_value(res) | ||
160 | .map_err(|err| ra_tt::ExpansionError::JsonError(err.to_string()))?; | ||
161 | Ok(result) | ||
162 | } | ||
163 | } | ||
164 | } | 143 | } |
144 | _ => Ok(res.try_into().map_err(|err| { | ||
145 | ra_tt::ExpansionError::Unknown(format!( | ||
146 | "Fail to get response, reason : {:#?} ", | ||
147 | err | ||
148 | )) | ||
149 | })?), | ||
165 | } | 150 | } |
166 | } | 151 | } |
167 | } | 152 | } |
@@ -183,18 +168,13 @@ fn client_loop(task_rx: Receiver<Task>, mut process: Process) { | |||
183 | Task::Close => break, | 168 | Task::Close => break, |
184 | }; | 169 | }; |
185 | 170 | ||
186 | let res = match send_message(&mut stdin, &mut stdout, req) { | 171 | let res = match send_request(&mut stdin, &mut stdout, req) { |
187 | Ok(res) => res, | 172 | Ok(res) => res, |
188 | Err(_err) => { | 173 | Err(_err) => { |
189 | let res = Response { | 174 | let res = Response::Error(ResponseError { |
190 | id: 0.into(), | 175 | code: ErrorCode::ServerErrorEnd, |
191 | result: None, | 176 | message: "Server closed".into(), |
192 | error: Some(ResponseError { | 177 | }); |
193 | code: ErrorCode::ServerErrorEnd as i32, | ||
194 | message: "Server closed".into(), | ||
195 | data: None, | ||
196 | }), | ||
197 | }; | ||
198 | if result_tx.send(res.into()).is_err() { | 178 | if result_tx.send(res.into()).is_err() { |
199 | break; | 179 | break; |
200 | } | 180 | } |
@@ -222,11 +202,11 @@ fn client_loop(task_rx: Receiver<Task>, mut process: Process) { | |||
222 | let _ = process.child.kill(); | 202 | let _ = process.child.kill(); |
223 | } | 203 | } |
224 | 204 | ||
225 | fn send_message( | 205 | fn send_request( |
226 | mut writer: &mut impl Write, | 206 | mut writer: &mut impl Write, |
227 | mut reader: &mut impl BufRead, | 207 | mut reader: &mut impl BufRead, |
228 | msg: Message, | 208 | req: Request, |
229 | ) -> Result<Option<Message>, io::Error> { | 209 | ) -> Result<Option<Response>, io::Error> { |
230 | msg.write(&mut writer)?; | 210 | req.write(&mut writer)?; |
231 | Ok(Message::read(&mut reader)?) | 211 | Ok(Response::read(&mut reader)?) |
232 | } | 212 | } |