Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/proc-macro-srv-cli/src/main_loop.rs')
-rw-r--r--crates/proc-macro-srv-cli/src/main_loop.rs148
1 files changed, 9 insertions, 139 deletions
diff --git a/crates/proc-macro-srv-cli/src/main_loop.rs b/crates/proc-macro-srv-cli/src/main_loop.rs
index b0e7108d20..029ab6eca9 100644
--- a/crates/proc-macro-srv-cli/src/main_loop.rs
+++ b/crates/proc-macro-srv-cli/src/main_loop.rs
@@ -2,13 +2,14 @@
use std::io;
use proc_macro_api::{
+ Codec,
legacy_protocol::{
- json::{read_json, write_json},
+ json::JsonProtocol,
msg::{
self, ExpandMacroData, ExpnGlobals, Message, SpanMode, SpanTransformer,
deserialize_span_data_index_map, serialize_span_data_index_map,
},
- postcard::{read_postcard, write_postcard},
+ postcard::PostcardProtocol,
},
version::CURRENT_API_VERSION,
};
@@ -36,12 +37,12 @@ impl SpanTransformer for SpanTrans {
pub(crate) fn run(format: ProtocolFormat) -> io::Result<()> {
match format {
- ProtocolFormat::Json => run_json(),
- ProtocolFormat::Postcard => run_postcard(),
+ ProtocolFormat::Json => run_::<JsonProtocol>(),
+ ProtocolFormat::Postcard => run_::<PostcardProtocol>(),
}
}
-fn run_json() -> io::Result<()> {
+fn run_<C: Codec>() -> io::Result<()> {
fn macro_kind_to_api(kind: proc_macro_srv::ProcMacroKind) -> proc_macro_api::ProcMacroKind {
match kind {
proc_macro_srv::ProcMacroKind::CustomDerive => {
@@ -52,9 +53,9 @@ fn run_json() -> io::Result<()> {
}
}
- let mut buf = String::new();
- let mut read_request = || msg::Request::read(read_json, &mut io::stdin().lock(), &mut buf);
- let write_response = |msg: msg::Response| msg.write(write_json, &mut io::stdout().lock());
+ let mut buf = C::Buf::default();
+ let mut read_request = || msg::Request::read::<_, C>(&mut io::stdin().lock(), &mut buf);
+ let write_response = |msg: msg::Response| msg.write::<_, C>(&mut io::stdout().lock());
let env = EnvSnapshot::default();
let srv = proc_macro_srv::ProcMacroSrv::new(&env);
@@ -170,134 +171,3 @@ fn run_json() -> io::Result<()> {
Ok(())
}
-
-fn run_postcard() -> io::Result<()> {
- fn macro_kind_to_api(kind: proc_macro_srv::ProcMacroKind) -> proc_macro_api::ProcMacroKind {
- match kind {
- proc_macro_srv::ProcMacroKind::CustomDerive => {
- proc_macro_api::ProcMacroKind::CustomDerive
- }
- proc_macro_srv::ProcMacroKind::Bang => proc_macro_api::ProcMacroKind::Bang,
- proc_macro_srv::ProcMacroKind::Attr => proc_macro_api::ProcMacroKind::Attr,
- }
- }
-
- let mut buf = Vec::new();
- let mut read_request =
- || msg::Request::read_postcard(read_postcard, &mut io::stdin().lock(), &mut buf);
- let write_response =
- |msg: msg::Response| msg.write_postcard(write_postcard, &mut io::stdout().lock());
-
- let env = proc_macro_srv::EnvSnapshot::default();
- let srv = proc_macro_srv::ProcMacroSrv::new(&env);
-
- let mut span_mode = msg::SpanMode::Id;
-
- while let Some(req) = read_request()? {
- let res = match req {
- msg::Request::ListMacros { dylib_path } => {
- msg::Response::ListMacros(srv.list_macros(&dylib_path).map(|macros| {
- macros.into_iter().map(|(name, kind)| (name, macro_kind_to_api(kind))).collect()
- }))
- }
- msg::Request::ExpandMacro(task) => {
- let msg::ExpandMacro {
- lib,
- env,
- current_dir,
- data:
- msg::ExpandMacroData {
- macro_body,
- macro_name,
- attributes,
- has_global_spans:
- msg::ExpnGlobals { serialize: _, def_site, call_site, mixed_site },
- span_data_table,
- },
- } = *task;
- match span_mode {
- msg::SpanMode::Id => msg::Response::ExpandMacro({
- let def_site = proc_macro_srv::SpanId(def_site as u32);
- let call_site = proc_macro_srv::SpanId(call_site as u32);
- let mixed_site = proc_macro_srv::SpanId(mixed_site as u32);
-
- let macro_body =
- macro_body.to_subtree_unresolved::<SpanTrans>(CURRENT_API_VERSION);
- let attributes = attributes
- .map(|it| it.to_subtree_unresolved::<SpanTrans>(CURRENT_API_VERSION));
-
- srv.expand(
- lib,
- &env,
- current_dir,
- &macro_name,
- macro_body,
- attributes,
- def_site,
- call_site,
- mixed_site,
- )
- .map(|it| {
- msg::FlatTree::new_raw::<SpanTrans>(
- tt::SubtreeView::new(&it),
- CURRENT_API_VERSION,
- )
- })
- .map_err(|e| e.into_string().unwrap_or_default())
- .map_err(msg::PanicMessage)
- }),
- msg::SpanMode::RustAnalyzer => msg::Response::ExpandMacroExtended({
- let mut span_data_table =
- msg::deserialize_span_data_index_map(&span_data_table);
-
- let def_site = span_data_table[def_site];
- let call_site = span_data_table[call_site];
- let mixed_site = span_data_table[mixed_site];
-
- let macro_body =
- macro_body.to_subtree_resolved(CURRENT_API_VERSION, &span_data_table);
- let attributes = attributes.map(|it| {
- it.to_subtree_resolved(CURRENT_API_VERSION, &span_data_table)
- });
- srv.expand(
- lib,
- &env,
- current_dir,
- &macro_name,
- macro_body,
- attributes,
- def_site,
- call_site,
- mixed_site,
- )
- .map(|it| {
- (
- msg::FlatTree::new(
- tt::SubtreeView::new(&it),
- CURRENT_API_VERSION,
- &mut span_data_table,
- ),
- msg::serialize_span_data_index_map(&span_data_table),
- )
- })
- .map(|(tree, span_data_table)| msg::ExpandMacroExtended {
- tree,
- span_data_table,
- })
- .map_err(|e| e.into_string().unwrap_or_default())
- .map_err(msg::PanicMessage)
- }),
- }
- }
- msg::Request::ApiVersionCheck {} => msg::Response::ApiVersionCheck(CURRENT_API_VERSION),
- msg::Request::SetConfig(config) => {
- span_mode = config.span_mode;
- msg::Response::SetConfig(config)
- }
- };
-
- write_response(res)?;
- }
-
- Ok(())
-}