Unnamed repository; edit this file 'description' to name the repository.
add bidirectional flow for local file method
bit-aloo 4 months ago
parent c734ae1 · commit 03d58fe
-rw-r--r--crates/load-cargo/src/lib.rs14
-rw-r--r--crates/proc-macro-api/src/bidirectional_protocol/msg.rs2
-rw-r--r--crates/proc-macro-srv-cli/src/main_loop.rs25
-rw-r--r--crates/proc-macro-srv/src/lib.rs1
4 files changed, 42 insertions, 0 deletions
diff --git a/crates/load-cargo/src/lib.rs b/crates/load-cargo/src/lib.rs
index c8a157e88e..dc75abe7ad 100644
--- a/crates/load-cargo/src/lib.rs
+++ b/crates/load-cargo/src/lib.rs
@@ -540,6 +540,20 @@ impl ProcMacroExpander for Expander {
current_dir: String,
) -> Result<tt::TopSubtree, ProcMacroExpansionError> {
let mut cb = |req| match req {
+ SubRequest::LocalFileName { file_id } => {
+ let file = FileId::from_raw(file_id);
+ let source_root_id = db.file_source_root(file).source_root_id(db);
+ let source_root = db.source_root(source_root_id).source_root(db);
+
+ let name = source_root
+ .path_for_file(&file)
+ .and_then(|path| path.clone().into_abs_path())
+ .and_then(|path| {
+ path.as_path().file_name().map(|filename| filename.to_owned())
+ });
+
+ Ok(SubResponse::LocalFileNameResult { name })
+ }
SubRequest::SourceText { file_id, start, end } => {
let file = FileId::from_raw(file_id);
let text = db.file_text(file).text(db);
diff --git a/crates/proc-macro-api/src/bidirectional_protocol/msg.rs b/crates/proc-macro-api/src/bidirectional_protocol/msg.rs
index 7edd9062d9..2819a92fe3 100644
--- a/crates/proc-macro-api/src/bidirectional_protocol/msg.rs
+++ b/crates/proc-macro-api/src/bidirectional_protocol/msg.rs
@@ -12,12 +12,14 @@ use crate::{
pub enum SubRequest {
FileName { file_id: u32 },
SourceText { file_id: u32, start: u32, end: u32 },
+ LocalFileName { file_id: u32 },
}
#[derive(Debug, Serialize, Deserialize)]
pub enum SubResponse {
FileNameResult { name: String },
SourceTextResult { text: Option<String> },
+ LocalFileNameResult { name: Option<String> },
}
#[derive(Debug, Serialize, Deserialize)]
diff --git a/crates/proc-macro-srv-cli/src/main_loop.rs b/crates/proc-macro-srv-cli/src/main_loop.rs
index 279eab06c0..76119b27a8 100644
--- a/crates/proc-macro-srv-cli/src/main_loop.rs
+++ b/crates/proc-macro-srv-cli/src/main_loop.rs
@@ -217,6 +217,31 @@ impl<C: Codec> proc_macro_srv::ProcMacroClientInterface for ProcMacroClientHandl
_ => None,
}
}
+
+ fn local_file(&mut self, file_id: u32) -> Option<String> {
+ let req = bidirectional::BidirectionalMessage::SubRequest(
+ bidirectional::SubRequest::LocalFileName { file_id },
+ );
+
+ if req.write::<_, C>(&mut self.stdout.lock()).is_err() {
+ return Some(String::new());
+ }
+
+ let msg = match bidirectional::BidirectionalMessage::read::<_, C>(
+ &mut self.stdin.lock(),
+ self.buf,
+ ) {
+ Ok(msg) => msg,
+ _ => return None,
+ };
+
+ match msg {
+ Some(bidirectional::BidirectionalMessage::SubResponse(
+ bidirectional::SubResponse::LocalFileNameResult { name },
+ )) => Some(name.unwrap_or_default()),
+ _ => None,
+ }
+ }
}
fn handle_expand_ra<C: Codec>(
diff --git a/crates/proc-macro-srv/src/lib.rs b/crates/proc-macro-srv/src/lib.rs
index 1804238a32..8de712dbd3 100644
--- a/crates/proc-macro-srv/src/lib.rs
+++ b/crates/proc-macro-srv/src/lib.rs
@@ -96,6 +96,7 @@ pub type ProcMacroClientHandle<'a> = &'a mut (dyn ProcMacroClientInterface + Syn
pub trait ProcMacroClientInterface {
fn file(&mut self, file_id: u32) -> String;
fn source_text(&mut self, file_id: u32, start: u32, end: u32) -> Option<String>;
+ fn local_file(&mut self, file_id: u32) -> Option<String>;
}
const EXPANDER_STACK_SIZE: usize = 8 * 1024 * 1024;