Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/proc-macro-api/src/pool.rs')
-rw-r--r--crates/proc-macro-api/src/pool.rs72
1 files changed, 61 insertions, 11 deletions
diff --git a/crates/proc-macro-api/src/pool.rs b/crates/proc-macro-api/src/pool.rs
index 685bc05be6..4639374f3e 100644
--- a/crates/proc-macro-api/src/pool.rs
+++ b/crates/proc-macro-api/src/pool.rs
@@ -1,29 +1,38 @@
use std::sync::Arc;
+use tt::Span;
+
use crate::{
MacroDylib, ProcMacro, ServerError, bidirectional_protocol::SubCallback,
process::ProcMacroServerProcess,
};
-#[derive(Debug)]
+#[derive(Debug, Clone)]
pub(crate) struct ProcMacroServerPool {
- workers: Vec<Arc<ProcMacroServerProcess>>,
+ workers: Arc<[ProcMacroServerProcess]>,
}
impl ProcMacroServerPool {
- pub(crate) fn new(workers: Vec<Arc<ProcMacroServerProcess>>) -> Self {
- Self { workers }
+ pub(crate) fn new(workers: Vec<ProcMacroServerProcess>) -> Self {
+ Self { workers: workers.into() }
}
}
impl ProcMacroServerPool {
pub(crate) fn exited(&self) -> Option<&ServerError> {
- for worker in &self.workers {
- if let Some(e) = worker.exited() {
- return Some(e);
+ for worker in &*self.workers {
+ worker.exited()?;
+ }
+ self.workers[0].exited()
+ }
+
+ fn pick_process(&self) -> &ProcMacroServerProcess {
+ for workers in &*self.workers {
+ if workers.can_use() {
+ return workers;
}
}
- None
+ &self.workers[0]
}
pub(crate) fn load_dylib(
@@ -34,16 +43,16 @@ impl ProcMacroServerPool {
let _p = tracing::info_span!("ProcMacroServer::load_dylib").entered();
let mut all_macros = Vec::new();
- for worker in &self.workers {
+ for worker in &*self.workers {
let dylib_path = Arc::new(dylib.path.clone());
let dylib_last_modified = std::fs::metadata(dylib_path.as_path())
.ok()
.and_then(|metadata| metadata.modified().ok());
- let macros = worker.load_dylib(&dylib.path, None)?;
+ let macros = worker.find_proc_macros(&dylib.path, None)?.unwrap();
for (name, kind) in macros {
all_macros.push(ProcMacro {
- process: worker.clone(),
+ process: self.clone(),
name: name.into(),
kind,
dylib_path: Arc::new(dylib.path.clone()),
@@ -54,6 +63,47 @@ impl ProcMacroServerPool {
Ok(all_macros)
}
+
+ pub(crate) fn expand(
+ &self,
+ proc_macro: &ProcMacro,
+ subtree: tt::SubtreeView<'_>,
+ attr: Option<tt::SubtreeView<'_>>,
+ env: Vec<(String, String)>,
+ def_site: Span,
+ call_site: Span,
+ mixed_site: Span,
+ current_dir: String,
+ callback: Option<SubCallback<'_>>,
+ ) -> Result<Result<tt::TopSubtree, String>, ServerError> {
+ let process = self.pick_process();
+
+ let (mut subtree, mut attr) = (subtree, attr);
+ let (mut subtree_changed, mut attr_changed);
+ if proc_macro.needs_fixup_change(process) {
+ subtree_changed = tt::TopSubtree::from_subtree(subtree);
+ proc_macro.change_fixup_to_match_old_server(&mut subtree_changed);
+ subtree = subtree_changed.view();
+
+ if let Some(attr) = &mut attr {
+ attr_changed = tt::TopSubtree::from_subtree(*attr);
+ proc_macro.change_fixup_to_match_old_server(&mut attr_changed);
+ *attr = attr_changed.view();
+ }
+ }
+
+ process.expand(
+ proc_macro,
+ subtree,
+ attr,
+ env,
+ def_site,
+ call_site,
+ mixed_site,
+ current_dir,
+ callback,
+ )
+ }
}
pub(crate) fn default_pool_size() -> usize {