Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #21609 from Veykril/push-qknzslvkmtyt
internal: Use rayon for proc-macro loading
Lukas Wirth 2 months ago
parent 4dba1b4 · parent 7d3705a · commit 797b1f6
-rw-r--r--Cargo.lock1
-rw-r--r--crates/load-cargo/src/lib.rs7
-rw-r--r--crates/proc-macro-api/Cargo.toml1
-rw-r--r--crates/proc-macro-api/src/lib.rs8
-rw-r--r--crates/proc-macro-api/src/pool.rs28
-rw-r--r--crates/proc-macro-api/src/process.rs16
-rw-r--r--crates/span/src/ast_id.rs2
7 files changed, 31 insertions, 32 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 11d41a17b1..9db4dd7cb1 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1845,6 +1845,7 @@ dependencies = [
"paths",
"postcard",
"proc-macro-srv",
+ "rayon",
"rustc-hash 2.1.1",
"semver",
"serde",
diff --git a/crates/load-cargo/src/lib.rs b/crates/load-cargo/src/lib.rs
index c2935d94a8..70a00cf825 100644
--- a/crates/load-cargo/src/lib.rs
+++ b/crates/load-cargo/src/lib.rs
@@ -26,10 +26,7 @@ use ide_db::{
use itertools::Itertools;
use proc_macro_api::{
MacroDylib, ProcMacroClient,
- bidirectional_protocol::{
- msg::{SubRequest, SubResponse},
- reject_subrequests,
- },
+ bidirectional_protocol::msg::{SubRequest, SubResponse},
};
use project_model::{CargoConfig, PackageRoot, ProjectManifest, ProjectWorkspace};
use span::{Span, SpanAnchor, SyntaxContext};
@@ -446,7 +443,7 @@ pub fn load_proc_macro(
) -> ProcMacroLoadResult {
let res: Result<Vec<_>, _> = (|| {
let dylib = MacroDylib::new(path.to_path_buf());
- let vec = server.load_dylib(dylib, Some(&reject_subrequests)).map_err(|e| {
+ let vec = server.load_dylib(dylib).map_err(|e| {
ProcMacroLoadingError::ProcMacroSrvError(format!("{e}").into_boxed_str())
})?;
if vec.is_empty() {
diff --git a/crates/proc-macro-api/Cargo.toml b/crates/proc-macro-api/Cargo.toml
index 4de1a3e5dd..a135a469e8 100644
--- a/crates/proc-macro-api/Cargo.toml
+++ b/crates/proc-macro-api/Cargo.toml
@@ -31,6 +31,7 @@ span = { path = "../span", version = "0.0.0", default-features = false}
intern.workspace = true
postcard.workspace = true
semver.workspace = true
+rayon.workspace = true
[features]
sysroot-abi = ["proc-macro-srv", "proc-macro-srv/sysroot-abi"]
diff --git a/crates/proc-macro-api/src/lib.rs b/crates/proc-macro-api/src/lib.rs
index e4b121b033..68b3afc3e8 100644
--- a/crates/proc-macro-api/src/lib.rs
+++ b/crates/proc-macro-api/src/lib.rs
@@ -198,12 +198,8 @@ 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,
- callback: Option<SubCallback<'_>>,
- ) -> Result<Vec<ProcMacro>, ServerError> {
- self.pool.load_dylib(&dylib, callback)
+ pub fn load_dylib(&self, dylib: MacroDylib) -> Result<Vec<ProcMacro>, ServerError> {
+ self.pool.load_dylib(&dylib)
}
/// Checks if the proc-macro server has exited.
diff --git a/crates/proc-macro-api/src/pool.rs b/crates/proc-macro-api/src/pool.rs
index a637bc0e48..e6541823da 100644
--- a/crates/proc-macro-api/src/pool.rs
+++ b/crates/proc-macro-api/src/pool.rs
@@ -1,10 +1,9 @@
//! A pool of proc-macro server processes
use std::sync::Arc;
-use crate::{
- MacroDylib, ProcMacro, ServerError, bidirectional_protocol::SubCallback,
- process::ProcMacroServerProcess,
-};
+use rayon::iter::{IntoParallelIterator, ParallelIterator};
+
+use crate::{MacroDylib, ProcMacro, ServerError, process::ProcMacroServerProcess};
#[derive(Debug, Clone)]
pub(crate) struct ProcMacroServerPool {
@@ -50,11 +49,7 @@ impl ProcMacroServerPool {
})
}
- pub(crate) fn load_dylib(
- &self,
- dylib: &MacroDylib,
- callback: Option<SubCallback<'_>>,
- ) -> Result<Vec<ProcMacro>, ServerError> {
+ pub(crate) fn load_dylib(&self, dylib: &MacroDylib) -> Result<Vec<ProcMacro>, ServerError> {
let _span = tracing::info_span!("ProcMacroServer::load_dylib").entered();
let dylib_path = Arc::new(dylib.path.clone());
@@ -64,14 +59,17 @@ impl ProcMacroServerPool {
let (first, rest) = self.workers.split_first().expect("worker pool must not be empty");
let macros = first
- .find_proc_macros(&dylib.path, callback)?
+ .find_proc_macros(&dylib.path)?
.map_err(|e| ServerError { message: e, io: None })?;
- for worker in rest {
- worker
- .find_proc_macros(&dylib.path, callback)?
- .map_err(|e| ServerError { message: e, io: None })?;
- }
+ rest.into_par_iter()
+ .map(|worker| {
+ worker
+ .find_proc_macros(&dylib.path)?
+ .map(|_| ())
+ .map_err(|e| ServerError { message: e, io: None })
+ })
+ .collect::<Result<(), _>>()?;
Ok(macros
.into_iter()
diff --git a/crates/proc-macro-api/src/process.rs b/crates/proc-macro-api/src/process.rs
index 9f80880965..80e4ed05c3 100644
--- a/crates/proc-macro-api/src/process.rs
+++ b/crates/proc-macro-api/src/process.rs
@@ -18,7 +18,11 @@ use stdx::JodChild;
use crate::{
ProcMacro, ProcMacroKind, ProtocolFormat, ServerError,
- bidirectional_protocol::{self, SubCallback, msg::BidirectionalMessage, reject_subrequests},
+ bidirectional_protocol::{
+ self, SubCallback,
+ msg::{BidirectionalMessage, SubResponse},
+ reject_subrequests,
+ },
legacy_protocol::{self, SpanMode},
version,
};
@@ -207,14 +211,18 @@ impl ProcMacroServerProcess {
pub(crate) fn find_proc_macros(
&self,
dylib_path: &AbsPath,
- callback: Option<SubCallback<'_>>,
) -> Result<Result<Vec<(String, ProcMacroKind)>, String>, ServerError> {
match self.protocol {
Protocol::LegacyJson { .. } => legacy_protocol::find_proc_macros(self, dylib_path),
Protocol::BidirectionalPostcardPrototype { .. } => {
- let cb = callback.expect("callback required for bidirectional protocol");
- bidirectional_protocol::find_proc_macros(self, dylib_path, cb)
+ bidirectional_protocol::find_proc_macros(self, dylib_path, &|_| {
+ Ok(SubResponse::Cancel {
+ reason: String::from(
+ "Server should not do a sub request when loading proc-macros",
+ ),
+ })
+ })
}
}
}
diff --git a/crates/span/src/ast_id.rs b/crates/span/src/ast_id.rs
index 599b3c7175..f52604e139 100644
--- a/crates/span/src/ast_id.rs
+++ b/crates/span/src/ast_id.rs
@@ -88,7 +88,6 @@ impl fmt::Debug for ErasedFileAstId {
Module,
Static,
Trait,
- TraitAlias,
Variant,
Const,
Fn,
@@ -129,7 +128,6 @@ enum ErasedFileAstIdKind {
Module,
Static,
Trait,
- TraitAlias,
// Until here associated with `ErasedHasNameFileAstId`.
// The following are associated with `ErasedAssocItemFileAstId`.
Variant,