Skip to content

Commit 7d3705a

Browse files
committed
internal: Use rayon for proc-macro loading
1 parent c75729d commit 7d3705a

7 files changed

Lines changed: 31 additions & 32 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/load-cargo/src/lib.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,7 @@ use ide_db::{
2626
use itertools::Itertools;
2727
use proc_macro_api::{
2828
MacroDylib, ProcMacroClient,
29-
bidirectional_protocol::{
30-
msg::{SubRequest, SubResponse},
31-
reject_subrequests,
32-
},
29+
bidirectional_protocol::msg::{SubRequest, SubResponse},
3330
};
3431
use project_model::{CargoConfig, PackageRoot, ProjectManifest, ProjectWorkspace};
3532
use span::{Span, SpanAnchor, SyntaxContext};
@@ -446,7 +443,7 @@ pub fn load_proc_macro(
446443
) -> ProcMacroLoadResult {
447444
let res: Result<Vec<_>, _> = (|| {
448445
let dylib = MacroDylib::new(path.to_path_buf());
449-
let vec = server.load_dylib(dylib, Some(&reject_subrequests)).map_err(|e| {
446+
let vec = server.load_dylib(dylib).map_err(|e| {
450447
ProcMacroLoadingError::ProcMacroSrvError(format!("{e}").into_boxed_str())
451448
})?;
452449
if vec.is_empty() {

crates/proc-macro-api/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ span = { path = "../span", version = "0.0.0", default-features = false}
3131
intern.workspace = true
3232
postcard.workspace = true
3333
semver.workspace = true
34+
rayon.workspace = true
3435

3536
[features]
3637
sysroot-abi = ["proc-macro-srv", "proc-macro-srv/sysroot-abi"]

crates/proc-macro-api/src/lib.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -198,12 +198,8 @@ impl ProcMacroClient {
198198
}
199199

200200
/// Loads a proc-macro dylib into the server process returning a list of `ProcMacro`s loaded.
201-
pub fn load_dylib(
202-
&self,
203-
dylib: MacroDylib,
204-
callback: Option<SubCallback<'_>>,
205-
) -> Result<Vec<ProcMacro>, ServerError> {
206-
self.pool.load_dylib(&dylib, callback)
201+
pub fn load_dylib(&self, dylib: MacroDylib) -> Result<Vec<ProcMacro>, ServerError> {
202+
self.pool.load_dylib(&dylib)
207203
}
208204

209205
/// Checks if the proc-macro server has exited.

crates/proc-macro-api/src/pool.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
//! A pool of proc-macro server processes
22
use std::sync::Arc;
33

4-
use crate::{
5-
MacroDylib, ProcMacro, ServerError, bidirectional_protocol::SubCallback,
6-
process::ProcMacroServerProcess,
7-
};
4+
use rayon::iter::{IntoParallelIterator, ParallelIterator};
5+
6+
use crate::{MacroDylib, ProcMacro, ServerError, process::ProcMacroServerProcess};
87

98
#[derive(Debug, Clone)]
109
pub(crate) struct ProcMacroServerPool {
@@ -50,11 +49,7 @@ impl ProcMacroServerPool {
5049
})
5150
}
5251

53-
pub(crate) fn load_dylib(
54-
&self,
55-
dylib: &MacroDylib,
56-
callback: Option<SubCallback<'_>>,
57-
) -> Result<Vec<ProcMacro>, ServerError> {
52+
pub(crate) fn load_dylib(&self, dylib: &MacroDylib) -> Result<Vec<ProcMacro>, ServerError> {
5853
let _span = tracing::info_span!("ProcMacroServer::load_dylib").entered();
5954

6055
let dylib_path = Arc::new(dylib.path.clone());
@@ -64,14 +59,17 @@ impl ProcMacroServerPool {
6459
let (first, rest) = self.workers.split_first().expect("worker pool must not be empty");
6560

6661
let macros = first
67-
.find_proc_macros(&dylib.path, callback)?
62+
.find_proc_macros(&dylib.path)?
6863
.map_err(|e| ServerError { message: e, io: None })?;
6964

70-
for worker in rest {
71-
worker
72-
.find_proc_macros(&dylib.path, callback)?
73-
.map_err(|e| ServerError { message: e, io: None })?;
74-
}
65+
rest.into_par_iter()
66+
.map(|worker| {
67+
worker
68+
.find_proc_macros(&dylib.path)?
69+
.map(|_| ())
70+
.map_err(|e| ServerError { message: e, io: None })
71+
})
72+
.collect::<Result<(), _>>()?;
7573

7674
Ok(macros
7775
.into_iter()

crates/proc-macro-api/src/process.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ use stdx::JodChild;
1818

1919
use crate::{
2020
ProcMacro, ProcMacroKind, ProtocolFormat, ServerError,
21-
bidirectional_protocol::{self, SubCallback, msg::BidirectionalMessage, reject_subrequests},
21+
bidirectional_protocol::{
22+
self, SubCallback,
23+
msg::{BidirectionalMessage, SubResponse},
24+
reject_subrequests,
25+
},
2226
legacy_protocol::{self, SpanMode},
2327
version,
2428
};
@@ -207,14 +211,18 @@ impl ProcMacroServerProcess {
207211
pub(crate) fn find_proc_macros(
208212
&self,
209213
dylib_path: &AbsPath,
210-
callback: Option<SubCallback<'_>>,
211214
) -> Result<Result<Vec<(String, ProcMacroKind)>, String>, ServerError> {
212215
match self.protocol {
213216
Protocol::LegacyJson { .. } => legacy_protocol::find_proc_macros(self, dylib_path),
214217

215218
Protocol::BidirectionalPostcardPrototype { .. } => {
216-
let cb = callback.expect("callback required for bidirectional protocol");
217-
bidirectional_protocol::find_proc_macros(self, dylib_path, cb)
219+
bidirectional_protocol::find_proc_macros(self, dylib_path, &|_| {
220+
Ok(SubResponse::Cancel {
221+
reason: String::from(
222+
"Server should not do a sub request when loading proc-macros",
223+
),
224+
})
225+
})
218226
}
219227
}
220228
}

crates/span/src/ast_id.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ impl fmt::Debug for ErasedFileAstId {
8888
Module,
8989
Static,
9090
Trait,
91-
TraitAlias,
9291
Variant,
9392
Const,
9493
Fn,
@@ -129,7 +128,6 @@ enum ErasedFileAstIdKind {
129128
Module,
130129
Static,
131130
Trait,
132-
TraitAlias,
133131
// Until here associated with `ErasedHasNameFileAstId`.
134132
// The following are associated with `ErasedAssocItemFileAstId`.
135133
Variant,

0 commit comments

Comments
 (0)