Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/proc-macro-srv/src/lib.rs')
-rw-r--r--crates/proc-macro-srv/src/lib.rs54
1 files changed, 43 insertions, 11 deletions
diff --git a/crates/proc-macro-srv/src/lib.rs b/crates/proc-macro-srv/src/lib.rs
index 93319df824..920d58b4e9 100644
--- a/crates/proc-macro-srv/src/lib.rs
+++ b/crates/proc-macro-srv/src/lib.rs
@@ -22,9 +22,9 @@
)]
#![deny(deprecated_safe, clippy::undocumented_unsafe_blocks)]
-extern crate proc_macro;
#[cfg(feature = "in-rust-tree")]
extern crate rustc_driver as _;
+extern crate rustc_proc_macro;
#[cfg(not(feature = "in-rust-tree"))]
extern crate ra_ap_rustc_lexer as rustc_lexer;
@@ -52,7 +52,8 @@ use temp_dir::TempDir;
pub use crate::server_impl::token_id::SpanId;
-pub use proc_macro::Delimiter;
+pub use rustc_proc_macro::Delimiter;
+pub use span;
pub use crate::bridge::*;
pub use crate::server_impl::literal_from_str;
@@ -91,6 +92,14 @@ impl<'env> ProcMacroSrv<'env> {
}
}
+pub type ProcMacroClientHandle<'a> = &'a mut (dyn ProcMacroClientInterface + Sync + Send);
+
+pub trait ProcMacroClientInterface {
+ fn file(&mut self, file_id: span::FileId) -> String;
+ fn source_text(&mut self, span: Span) -> Option<String>;
+ fn local_file(&mut self, file_id: span::FileId) -> Option<String>;
+}
+
const EXPANDER_STACK_SIZE: usize = 8 * 1024 * 1024;
impl ProcMacroSrv<'_> {
@@ -105,6 +114,7 @@ impl ProcMacroSrv<'_> {
def_site: S,
call_site: S,
mixed_site: S,
+ callback: Option<ProcMacroClientHandle<'_>>,
) -> Result<token_stream::TokenStream<S>, PanicMessage> {
let snapped_env = self.env;
let expander = self.expander(lib.as_ref()).map_err(|err| PanicMessage {
@@ -120,8 +130,10 @@ impl ProcMacroSrv<'_> {
.stack_size(EXPANDER_STACK_SIZE)
.name(macro_name.to_owned())
.spawn_scoped(s, move || {
- expander
- .expand(macro_name, macro_body, attribute, def_site, call_site, mixed_site)
+ expander.expand(
+ macro_name, macro_body, attribute, def_site, call_site, mixed_site,
+ callback,
+ )
});
match thread.unwrap().join() {
Ok(res) => res,
@@ -169,30 +181,50 @@ impl ProcMacroSrv<'_> {
}
pub trait ProcMacroSrvSpan: Copy + Send + Sync {
- type Server: proc_macro::bridge::server::Server<TokenStream = crate::token_stream::TokenStream<Self>>;
- fn make_server(call_site: Self, def_site: Self, mixed_site: Self) -> Self::Server;
+ type Server<'a>: rustc_proc_macro::bridge::server::Server<
+ TokenStream = crate::token_stream::TokenStream<Self>,
+ >;
+ fn make_server<'a>(
+ call_site: Self,
+ def_site: Self,
+ mixed_site: Self,
+ callback: Option<ProcMacroClientHandle<'a>>,
+ ) -> Self::Server<'a>;
}
impl ProcMacroSrvSpan for SpanId {
- type Server = server_impl::token_id::SpanIdServer;
-
- fn make_server(call_site: Self, def_site: Self, mixed_site: Self) -> Self::Server {
+ type Server<'a> = server_impl::token_id::SpanIdServer<'a>;
+
+ fn make_server<'a>(
+ call_site: Self,
+ def_site: Self,
+ mixed_site: Self,
+ callback: Option<ProcMacroClientHandle<'a>>,
+ ) -> Self::Server<'a> {
Self::Server {
call_site,
def_site,
mixed_site,
+ callback,
tracked_env_vars: Default::default(),
tracked_paths: Default::default(),
}
}
}
+
impl ProcMacroSrvSpan for Span {
- type Server = server_impl::rust_analyzer_span::RaSpanServer;
- fn make_server(call_site: Self, def_site: Self, mixed_site: Self) -> Self::Server {
+ type Server<'a> = server_impl::rust_analyzer_span::RaSpanServer<'a>;
+ fn make_server<'a>(
+ call_site: Self,
+ def_site: Self,
+ mixed_site: Self,
+ callback: Option<ProcMacroClientHandle<'a>>,
+ ) -> Self::Server<'a> {
Self::Server {
call_site,
def_site,
mixed_site,
+ callback,
tracked_env_vars: Default::default(),
tracked_paths: Default::default(),
}