Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/proc-macro-api/src/bidirectional_protocol.rs61
-rw-r--r--crates/proc-macro-api/src/bidirectional_protocol/msg.rs18
-rw-r--r--crates/proc-macro-api/src/process.rs46
-rw-r--r--crates/proc-macro-srv-cli/src/main.rs6
-rw-r--r--crates/proc-macro-srv-cli/src/main_loop.rs102
5 files changed, 94 insertions, 139 deletions
diff --git a/crates/proc-macro-api/src/bidirectional_protocol.rs b/crates/proc-macro-api/src/bidirectional_protocol.rs
index c7caccb96f..4cb6a1d90f 100644
--- a/crates/proc-macro-api/src/bidirectional_protocol.rs
+++ b/crates/proc-macro-api/src/bidirectional_protocol.rs
@@ -12,8 +12,8 @@ use span::{FileId, Span};
use crate::{
Codec, ProcMacro, ProcMacroKind, ServerError,
bidirectional_protocol::msg::{
- Envelope, ExpandMacro, ExpandMacroData, ExpnGlobals, Kind, Payload, Request,
- Response, SubRequest, SubResponse,
+ BidirectionalMessage, ExpandMacro, ExpandMacroData, ExpnGlobals, Request, Response,
+ SubRequest, SubResponse,
},
legacy_protocol::{
SpanMode,
@@ -37,10 +37,9 @@ pub fn run_conversation<C: Codec>(
writer: &mut dyn Write,
reader: &mut dyn BufRead,
buf: &mut C::Buf,
- initial: Payload,
+ msg: BidirectionalMessage,
callbacks: &mut dyn ClientCallbacks,
-) -> Result<Payload, ServerError> {
- let msg = Envelope { kind: Kind::Request, payload: initial };
+) -> Result<BidirectionalMessage, ServerError> {
let encoded = C::encode(&msg).map_err(wrap_encode)?;
C::write(writer, &encoded).map_err(wrap_io("failed to write initial request"))?;
@@ -53,25 +52,21 @@ pub fn run_conversation<C: Codec>(
});
};
- let msg: Envelope = C::decode(b).map_err(wrap_decode)?;
+ let msg: BidirectionalMessage = C::decode(b).map_err(wrap_decode)?;
- match (msg.kind, msg.payload) {
- (Kind::SubRequest, Payload::SubRequest(sr)) => {
+ match msg {
+ BidirectionalMessage::Response(response) => {
+ return Ok(BidirectionalMessage::Response(response));
+ }
+ BidirectionalMessage::SubRequest(sr) => {
let resp = callbacks.handle_sub_request(sr)?;
- let reply =
- Envelope { kind: Kind::SubResponse, payload: Payload::SubResponse(resp) };
+ let reply = BidirectionalMessage::SubResponse(resp);
let encoded = C::encode(&reply).map_err(wrap_encode)?;
C::write(writer, &encoded).map_err(wrap_io("failed to write sub-response"))?;
}
- (Kind::Response, payload) => {
- return Ok(payload);
- }
- (kind, payload) => {
+ _ => {
return Err(ServerError {
- message: format!(
- "unexpected message kind {:?} with payload {:?}",
- kind, payload
- ),
+ message: format!("unexpected message {:?}", msg),
io: None,
});
}
@@ -92,7 +87,7 @@ fn wrap_decode(err: io::Error) -> ServerError {
}
pub(crate) fn version_check(srv: &ProcMacroServerProcess) -> Result<u32, ServerError> {
- let request = Payload::Request(Request::ApiVersionCheck {});
+ let request = BidirectionalMessage::Request(Request::ApiVersionCheck {});
struct NoCallbacks;
impl ClientCallbacks for NoCallbacks {
@@ -106,7 +101,7 @@ pub(crate) fn version_check(srv: &ProcMacroServerProcess) -> Result<u32, ServerE
let response_payload = run_request(srv, request, &mut callbacks)?;
match response_payload {
- Payload::Response(Response::ApiVersionCheck(version)) => Ok(version),
+ BidirectionalMessage::Response(Response::ApiVersionCheck(version)) => Ok(version),
other => {
Err(ServerError { message: format!("unexpected response: {:?}", other), io: None })
}
@@ -117,8 +112,9 @@ pub(crate) fn version_check(srv: &ProcMacroServerProcess) -> Result<u32, ServerE
pub(crate) fn enable_rust_analyzer_spans(
srv: &ProcMacroServerProcess,
) -> Result<SpanMode, ServerError> {
- let request =
- Payload::Request(Request::SetConfig(ServerConfig { span_mode: SpanMode::RustAnalyzer }));
+ let request = BidirectionalMessage::Request(Request::SetConfig(ServerConfig {
+ span_mode: SpanMode::RustAnalyzer,
+ }));
struct NoCallbacks;
impl ClientCallbacks for NoCallbacks {
@@ -132,7 +128,9 @@ pub(crate) fn enable_rust_analyzer_spans(
let response_payload = run_request(srv, request, &mut callbacks)?;
match response_payload {
- Payload::Response(Response::SetConfig(ServerConfig { span_mode })) => Ok(span_mode),
+ BidirectionalMessage::Response(Response::SetConfig(ServerConfig { span_mode })) => {
+ Ok(span_mode)
+ }
_ => Err(ServerError { message: "unexpected response".to_owned(), io: None }),
}
}
@@ -142,8 +140,9 @@ pub(crate) fn find_proc_macros(
srv: &ProcMacroServerProcess,
dylib_path: &AbsPath,
) -> Result<Result<Vec<(String, ProcMacroKind)>, String>, ServerError> {
- let request =
- Payload::Request(Request::ListMacros { dylib_path: dylib_path.to_path_buf().into() });
+ let request = BidirectionalMessage::Request(Request::ListMacros {
+ dylib_path: dylib_path.to_path_buf().into(),
+ });
struct NoCallbacks;
impl ClientCallbacks for NoCallbacks {
@@ -157,7 +156,7 @@ pub(crate) fn find_proc_macros(
let response_payload = run_request(srv, request, &mut callbacks)?;
match response_payload {
- Payload::Response(Response::ListMacros(it)) => Ok(it),
+ BidirectionalMessage::Response(Response::ListMacros(it)) => Ok(it),
_ => Err(ServerError { message: "unexpected response".to_owned(), io: None }),
}
}
@@ -179,7 +178,7 @@ pub(crate) fn expand(
let def_site = span_data_table.insert_full(def_site).0;
let call_site = span_data_table.insert_full(call_site).0;
let mixed_site = span_data_table.insert_full(mixed_site).0;
- let task = Payload::Request(Request::ExpandMacro(Box::new(ExpandMacro {
+ let task = BidirectionalMessage::Request(Request::ExpandMacro(Box::new(ExpandMacro {
data: ExpandMacroData {
macro_body: FlatTree::from_subtree(subtree, version, &mut span_data_table),
macro_name: proc_macro.name.to_string(),
@@ -225,7 +224,7 @@ pub(crate) fn expand(
let response_payload = run_request(&proc_macro.process, task, &mut callbacks)?;
match response_payload {
- Payload::Response(Response::ExpandMacro(it)) => Ok(it
+ BidirectionalMessage::Response(Response::ExpandMacro(it)) => Ok(it
.map(|tree| {
let mut expanded = FlatTree::to_subtree_resolved(tree, version, &span_data_table);
if proc_macro.needs_fixup_change() {
@@ -234,7 +233,7 @@ pub(crate) fn expand(
expanded
})
.map_err(|msg| msg.0)),
- Payload::Response(Response::ExpandMacroExtended(it)) => Ok(it
+ BidirectionalMessage::Response(Response::ExpandMacroExtended(it)) => Ok(it
.map(|resp| {
let mut expanded = FlatTree::to_subtree_resolved(
resp.tree,
@@ -253,9 +252,9 @@ pub(crate) fn expand(
fn run_request(
srv: &ProcMacroServerProcess,
- msg: Payload,
+ msg: BidirectionalMessage,
callbacks: &mut dyn ClientCallbacks,
-) -> Result<Payload, ServerError> {
+) -> Result<BidirectionalMessage, ServerError> {
if let Some(server_error) = srv.exited() {
return Err(server_error.clone());
}
diff --git a/crates/proc-macro-api/src/bidirectional_protocol/msg.rs b/crates/proc-macro-api/src/bidirectional_protocol/msg.rs
index 4f81ef4ae6..cf8becd922 100644
--- a/crates/proc-macro-api/src/bidirectional_protocol/msg.rs
+++ b/crates/proc-macro-api/src/bidirectional_protocol/msg.rs
@@ -9,20 +9,6 @@ use crate::{
};
#[derive(Debug, Serialize, Deserialize)]
-pub struct Envelope {
- pub kind: Kind,
- pub payload: Payload,
-}
-
-#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
-pub enum Kind {
- Request,
- Response,
- SubRequest,
- SubResponse,
-}
-
-#[derive(Debug, Serialize, Deserialize)]
pub enum SubRequest {
SourceText { file_id: u32, start: u32, end: u32 },
}
@@ -33,7 +19,7 @@ pub enum SubResponse {
}
#[derive(Debug, Serialize, Deserialize)]
-pub enum Payload {
+pub enum BidirectionalMessage {
Request(Request),
Response(Response),
SubRequest(SubRequest),
@@ -102,4 +88,4 @@ impl ExpnGlobals {
}
}
-impl Message for Envelope {}
+impl Message for BidirectionalMessage {}
diff --git a/crates/proc-macro-api/src/process.rs b/crates/proc-macro-api/src/process.rs
index 1c1709e5fa..6d40250012 100644
--- a/crates/proc-macro-api/src/process.rs
+++ b/crates/proc-macro-api/src/process.rs
@@ -4,9 +4,7 @@ use std::{
io::{self, BufRead, BufReader, Read, Write},
panic::AssertUnwindSafe,
process::{Child, ChildStdin, ChildStdout, Command, Stdio},
- sync::{
- Arc, Mutex, OnceLock,
- },
+ sync::{Arc, Mutex, OnceLock},
};
use base_db::SourceDatabase;
@@ -17,10 +15,7 @@ use stdx::JodChild;
use crate::{
Codec, ProcMacro, ProcMacroKind, ServerError,
- bidirectional_protocol::{
- self, ClientCallbacks,
- msg::Payload,
- },
+ bidirectional_protocol::{self, ClientCallbacks, msg::BidirectionalMessage},
legacy_protocol::{self, SpanMode},
version,
};
@@ -71,7 +66,10 @@ impl ProcMacroServerProcess {
&& has_working_format_flag
{
&[
- (Some("postcard-new"), Protocol::BidirectionalPostcardPrototype { mode: SpanMode::Id }),
+ (
+ Some("postcard-new"),
+ Protocol::BidirectionalPostcardPrototype { mode: SpanMode::Id },
+ ),
(Some("postcard-legacy"), Protocol::LegacyPostcard { mode: SpanMode::Id }),
(Some("json-legacy"), Protocol::LegacyJson { mode: SpanMode::Id }),
]
@@ -222,19 +220,17 @@ impl ProcMacroServerProcess {
current_dir,
)
}
- Protocol::BidirectionalPostcardPrototype { .. } => {
- bidirectional_protocol::expand(
- proc_macro,
- db,
- subtree,
- attr,
- env,
- def_site,
- call_site,
- mixed_site,
- current_dir,
- )
- }
+ Protocol::BidirectionalPostcardPrototype { .. } => bidirectional_protocol::expand(
+ proc_macro,
+ db,
+ subtree,
+ attr,
+ env,
+ def_site,
+ call_site,
+ mixed_site,
+ current_dir,
+ ),
}
}
@@ -300,13 +296,11 @@ impl ProcMacroServerProcess {
pub(crate) fn run_bidirectional<C: Codec>(
&self,
- initial: Payload,
+ initial: BidirectionalMessage,
callbacks: &mut dyn ClientCallbacks,
- ) -> Result<Payload, ServerError> {
+ ) -> Result<BidirectionalMessage, ServerError> {
self.with_locked_io::<C, _>(|writer, reader, buf| {
- bidirectional_protocol::run_conversation::<C>(
- writer, reader, buf, initial, callbacks,
- )
+ bidirectional_protocol::run_conversation::<C>(writer, reader, buf, initial, callbacks)
})
}
}
diff --git a/crates/proc-macro-srv-cli/src/main.rs b/crates/proc-macro-srv-cli/src/main.rs
index 53302dd579..01b261dab7 100644
--- a/crates/proc-macro-srv-cli/src/main.rs
+++ b/crates/proc-macro-srv-cli/src/main.rs
@@ -57,11 +57,7 @@ enum ProtocolFormat {
impl ValueEnum for ProtocolFormat {
fn value_variants<'a>() -> &'a [Self] {
- &[
- ProtocolFormat::JsonLegacy,
- ProtocolFormat::PostcardLegacy,
- ProtocolFormat::PostcardNew,
- ]
+ &[ProtocolFormat::JsonLegacy, ProtocolFormat::PostcardLegacy, ProtocolFormat::PostcardNew]
}
fn to_possible_value(&self) -> Option<clap::builder::PossibleValue> {
diff --git a/crates/proc-macro-srv-cli/src/main_loop.rs b/crates/proc-macro-srv-cli/src/main_loop.rs
index ee9b208811..9c66a308b1 100644
--- a/crates/proc-macro-srv-cli/src/main_loop.rs
+++ b/crates/proc-macro-srv-cli/src/main_loop.rs
@@ -63,54 +63,46 @@ fn run_new<C: Codec>() -> io::Result<()> {
let mut span_mode = legacy::SpanMode::Id;
'outer: loop {
- let req_opt = bidirectional::Envelope::read::<_, C>(&mut stdin, &mut buf)?;
+ let req_opt = bidirectional::BidirectionalMessage::read::<_, C>(&mut stdin, &mut buf)?;
let Some(req) = req_opt else {
break 'outer;
};
- match (req.kind, req.payload) {
- (bidirectional::Kind::Request, bidirectional::Payload::Request(request)) => {
- match request {
- bidirectional::Request::ListMacros { dylib_path } => {
- let res = srv.list_macros(&dylib_path).map(|macros| {
- macros
- .into_iter()
- .map(|(name, kind)| (name, macro_kind_to_api(kind)))
- .collect()
- });
+ match req {
+ bidirectional::BidirectionalMessage::Request(request) => match request {
+ bidirectional::Request::ListMacros { dylib_path } => {
+ let res = srv.list_macros(&dylib_path).map(|macros| {
+ macros
+ .into_iter()
+ .map(|(name, kind)| (name, macro_kind_to_api(kind)))
+ .collect()
+ });
+
+ send_response::<_, C>(&mut stdout, bidirectional::Response::ListMacros(res))?;
+ }
- send_response::<_, C>(
- &mut stdout,
- bidirectional::Response::ListMacros(res),
- )?;
- }
-
- bidirectional::Request::ApiVersionCheck {} => {
- send_response::<_, C>(
- &mut stdout,
- bidirectional::Response::ApiVersionCheck(CURRENT_API_VERSION),
- )?;
- }
-
- bidirectional::Request::SetConfig(config) => {
- span_mode = config.span_mode;
- send_response::<_, C>(
- &mut stdout,
- bidirectional::Response::SetConfig(config),
- )?;
- }
- bidirectional::Request::ExpandMacro(task) => {
- handle_expand::<_, _, C>(
- &srv,
- &mut stdin,
- &mut stdout,
- &mut buf,
- span_mode,
- *task,
- )?;
- }
+ bidirectional::Request::ApiVersionCheck {} => {
+ send_response::<_, C>(
+ &mut stdout,
+ bidirectional::Response::ApiVersionCheck(CURRENT_API_VERSION),
+ )?;
}
- }
+
+ bidirectional::Request::SetConfig(config) => {
+ span_mode = config.span_mode;
+ send_response::<_, C>(&mut stdout, bidirectional::Response::SetConfig(config))?;
+ }
+ bidirectional::Request::ExpandMacro(task) => {
+ handle_expand::<_, _, C>(
+ &srv,
+ &mut stdin,
+ &mut stdout,
+ &mut buf,
+ span_mode,
+ *task,
+ )?;
+ }
+ },
_ => continue,
}
}
@@ -265,11 +257,8 @@ fn handle_expand_ra<W: std::io::Write, R: std::io::BufRead, C: Codec>(
loop {
if let Ok(res) = result_rx.try_recv() {
- send_response::<_, C>(
- stdout,
- bidirectional::Response::ExpandMacroExtended(res),
- )
- .unwrap();
+ send_response::<_, C>(stdout, bidirectional::Response::ExpandMacroExtended(res))
+ .unwrap();
break;
}
@@ -282,7 +271,7 @@ fn handle_expand_ra<W: std::io::Write, R: std::io::BufRead, C: Codec>(
send_subrequest::<_, C>(stdout, from_srv_req(subreq)).unwrap();
- let resp_opt = bidirectional::Envelope::read::<_, C>(stdin, buf).unwrap();
+ let resp_opt = bidirectional::BidirectionalMessage::read::<_, C>(stdin, buf).unwrap();
let resp = match resp_opt {
Some(env) => env,
None => {
@@ -290,11 +279,8 @@ fn handle_expand_ra<W: std::io::Write, R: std::io::BufRead, C: Codec>(
}
};
- match (resp.kind, resp.payload) {
- (
- bidirectional::Kind::SubResponse,
- bidirectional::Payload::SubResponse(subresp),
- ) => {
+ match resp {
+ bidirectional::BidirectionalMessage::SubResponse(subresp) => {
let _ = subresp_tx.send(from_client_res(subresp));
}
_ => {
@@ -466,10 +452,7 @@ fn send_response<W: std::io::Write, C: Codec>(
stdout: &mut W,
resp: bidirectional::Response,
) -> io::Result<()> {
- let resp = bidirectional::Envelope {
- kind: bidirectional::Kind::Response,
- payload: bidirectional::Payload::Response(resp),
- };
+ let resp = bidirectional::BidirectionalMessage::Response(resp);
resp.write::<W, C>(stdout)
}
@@ -477,9 +460,6 @@ fn send_subrequest<W: std::io::Write, C: Codec>(
stdout: &mut W,
resp: bidirectional::SubRequest,
) -> io::Result<()> {
- let resp = bidirectional::Envelope {
- kind: bidirectional::Kind::SubRequest,
- payload: bidirectional::Payload::SubRequest(resp),
- };
+ let resp = bidirectional::BidirectionalMessage::SubRequest(resp);
resp.write::<W, C>(stdout)
}