Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/proc-macro-api/src/lib.rs')
-rw-r--r--crates/proc-macro-api/src/lib.rs46
1 files changed, 19 insertions, 27 deletions
diff --git a/crates/proc-macro-api/src/lib.rs b/crates/proc-macro-api/src/lib.rs
index 85b250eddf..f5fcc99f14 100644
--- a/crates/proc-macro-api/src/lib.rs
+++ b/crates/proc-macro-api/src/lib.rs
@@ -16,18 +16,18 @@
#[cfg(feature = "in-rust-tree")]
extern crate rustc_driver as _;
-mod codec;
-mod framing;
+pub mod bidirectional_protocol;
pub mod legacy_protocol;
mod process;
+pub mod transport;
use paths::{AbsPath, AbsPathBuf};
use semver::Version;
use span::{ErasedFileAstId, FIXUP_ERASED_FILE_AST_ID_MARKER, Span};
use std::{fmt, io, sync::Arc, time::SystemTime};
-pub use crate::codec::Codec;
-use crate::process::ProcMacroServerProcess;
+pub use crate::transport::codec::Codec;
+use crate::{bidirectional_protocol::SubCallback, process::ProcMacroServerProcess};
/// The versions of the server protocol
pub mod version {
@@ -142,9 +142,13 @@ impl ProcMacroClient {
}
/// Loads a proc-macro dylib into the server process returning a list of `ProcMacro`s loaded.
- pub fn load_dylib(&self, dylib: MacroDylib) -> Result<Vec<ProcMacro>, ServerError> {
+ pub fn load_dylib(
+ &self,
+ dylib: MacroDylib,
+ callback: Option<SubCallback<'_>>,
+ ) -> Result<Vec<ProcMacro>, ServerError> {
let _p = tracing::info_span!("ProcMacroServer::load_dylib").entered();
- let macros = self.process.find_proc_macros(&dylib.path)?;
+ let macros = self.process.find_proc_macros(&dylib.path, callback)?;
let dylib_path = Arc::new(dylib.path);
let dylib_last_modified = std::fs::metadata(dylib_path.as_path())
@@ -188,44 +192,31 @@ impl ProcMacro {
}
/// On some server versions, the fixup ast id is different than ours. So change it to match.
- fn change_fixup_to_match_old_server(&self, tt: &mut tt::TopSubtree<Span>) {
+ fn change_fixup_to_match_old_server(&self, tt: &mut tt::TopSubtree) {
const OLD_FIXUP_AST_ID: ErasedFileAstId = ErasedFileAstId::from_raw(!0 - 1);
- let change_ast_id = |ast_id: &mut ErasedFileAstId| {
+ tt.change_every_ast_id(|ast_id| {
if *ast_id == FIXUP_ERASED_FILE_AST_ID_MARKER {
*ast_id = OLD_FIXUP_AST_ID;
} else if *ast_id == OLD_FIXUP_AST_ID {
// Swap between them, that means no collision plus the change can be reversed by doing itself.
*ast_id = FIXUP_ERASED_FILE_AST_ID_MARKER;
}
- };
-
- for tt in &mut tt.0 {
- match tt {
- tt::TokenTree::Leaf(tt::Leaf::Ident(tt::Ident { span, .. }))
- | tt::TokenTree::Leaf(tt::Leaf::Literal(tt::Literal { span, .. }))
- | tt::TokenTree::Leaf(tt::Leaf::Punct(tt::Punct { span, .. })) => {
- change_ast_id(&mut span.anchor.ast_id);
- }
- tt::TokenTree::Subtree(subtree) => {
- change_ast_id(&mut subtree.delimiter.open.anchor.ast_id);
- change_ast_id(&mut subtree.delimiter.close.anchor.ast_id);
- }
- }
- }
+ });
}
/// Expands the procedural macro by sending an expansion request to the server.
/// This includes span information and environmental context.
pub fn expand(
&self,
- subtree: tt::SubtreeView<'_, Span>,
- attr: Option<tt::SubtreeView<'_, Span>>,
+ subtree: tt::SubtreeView<'_>,
+ attr: Option<tt::SubtreeView<'_>>,
env: Vec<(String, String)>,
def_site: Span,
call_site: Span,
mixed_site: Span,
current_dir: String,
- ) -> Result<Result<tt::TopSubtree<Span>, String>, ServerError> {
+ callback: Option<SubCallback<'_>>,
+ ) -> Result<Result<tt::TopSubtree, String>, ServerError> {
let (mut subtree, mut attr) = (subtree, attr);
let (mut subtree_changed, mut attr_changed);
if self.needs_fixup_change() {
@@ -240,7 +231,7 @@ impl ProcMacro {
}
}
- legacy_protocol::expand(
+ self.process.expand(
self,
subtree,
attr,
@@ -249,6 +240,7 @@ impl ProcMacro {
call_site,
mixed_site,
current_dir,
+ callback,
)
}
}