diff options
-rw-r--r-- | crates/ra_proc_macro/src/process.rs | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/crates/ra_proc_macro/src/process.rs b/crates/ra_proc_macro/src/process.rs index b44d6763c..df4d61682 100644 --- a/crates/ra_proc_macro/src/process.rs +++ b/crates/ra_proc_macro/src/process.rs | |||
@@ -29,7 +29,7 @@ pub(crate) struct ProcMacroProcessThread { | |||
29 | 29 | ||
30 | struct Task { | 30 | struct Task { |
31 | req: Request, | 31 | req: Request, |
32 | result_tx: Sender<Response>, | 32 | result_tx: Sender<Option<Response>>, |
33 | } | 33 | } |
34 | 34 | ||
35 | struct Process { | 35 | struct Process { |
@@ -131,18 +131,21 @@ impl ProcMacroProcessSrv { | |||
131 | Some(it) => it, | 131 | Some(it) => it, |
132 | }; | 132 | }; |
133 | sender.send(Task { req: req.into(), result_tx }).unwrap(); | 133 | sender.send(Task { req: req.into(), result_tx }).unwrap(); |
134 | let res = result_rx | ||
135 | .recv() | ||
136 | .map_err(|_| ra_tt::ExpansionError::Unknown("Proc macro thread is closed.".into()))?; | ||
134 | 137 | ||
135 | let res = result_rx.recv().unwrap(); | ||
136 | match res { | 138 | match res { |
137 | Response::Error(err) => { | 139 | Some(Response::Error(err)) => { |
138 | return Err(ra_tt::ExpansionError::ExpansionError(err.message)); | 140 | return Err(ra_tt::ExpansionError::ExpansionError(err.message)); |
139 | } | 141 | } |
140 | _ => Ok(res.try_into().map_err(|err| { | 142 | Some(res) => Ok(res.try_into().map_err(|err| { |
141 | ra_tt::ExpansionError::Unknown(format!( | 143 | ra_tt::ExpansionError::Unknown(format!( |
142 | "Fail to get response, reason : {:#?} ", | 144 | "Fail to get response, reason : {:#?} ", |
143 | err | 145 | err |
144 | )) | 146 | )) |
145 | })?), | 147 | })?), |
148 | None => Err(ra_tt::ExpansionError::Unknown("Empty result".into())), | ||
146 | } | 149 | } |
147 | } | 150 | } |
148 | } | 151 | } |
@@ -156,8 +159,8 @@ fn client_loop(task_rx: Receiver<Task>, mut process: Process) { | |||
156 | for task in task_rx { | 159 | for task in task_rx { |
157 | let Task { req, result_tx } = task; | 160 | let Task { req, result_tx } = task; |
158 | 161 | ||
159 | let res = match send_request(&mut stdin, &mut stdout, req) { | 162 | match send_request(&mut stdin, &mut stdout, req) { |
160 | Ok(res) => res, | 163 | Ok(res) => result_tx.send(res).unwrap(), |
161 | Err(_err) => { | 164 | Err(_err) => { |
162 | let res = Response::Error(ResponseError { | 165 | let res = Response::Error(ResponseError { |
163 | code: ErrorCode::ServerErrorEnd, | 166 | code: ErrorCode::ServerErrorEnd, |
@@ -174,12 +177,7 @@ fn client_loop(task_rx: Receiver<Task>, mut process: Process) { | |||
174 | }; | 177 | }; |
175 | stdin = stdio.0; | 178 | stdin = stdio.0; |
176 | stdout = stdio.1; | 179 | stdout = stdio.1; |
177 | continue; | ||
178 | } | 180 | } |
179 | }; | ||
180 | |||
181 | if let Some(res) = res { | ||
182 | result_tx.send(res).unwrap(); | ||
183 | } | 181 | } |
184 | } | 182 | } |
185 | } | 183 | } |