aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_proc_macro/src/process.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_proc_macro/src/process.rs')
-rw-r--r--crates/ra_proc_macro/src/process.rs74
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 @@
3use crossbeam_channel::{bounded, Receiver, Sender}; 3use crossbeam_channel::{bounded, Receiver, Sender};
4use ra_tt::Subtree; 4use ra_tt::Subtree;
5 5
6use crate::msg::{ErrorCode, Message, Request, Response, ResponseError}; 6use crate::msg::{ErrorCode, Request, Response, ResponseError, Message};
7use crate::rpc::{ExpansionResult, ExpansionTask, ListMacrosResult, ListMacrosTask, ProcMacroKind}; 7use crate::rpc::{ExpansionResult, ExpansionTask, ListMacrosResult, ListMacrosTask, ProcMacroKind};
8 8
9use io::{BufRead, BufReader}; 9use io::{BufRead, BufReader};
10use std::{ 10use 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
28enum Task { 29enum 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
225fn send_message( 205fn 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}