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.rs | 72 |
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 { |