@@ -303,18 +303,21 @@ impl GlobalState {
303
303
let files_config = self . config . files ( ) ;
304
304
let project_folders = ProjectFolders :: new ( & self . workspaces , & files_config. exclude ) ;
305
305
306
- if self . proc_macro_client . is_none ( ) {
306
+ if self . proc_macro_clients . is_empty ( ) {
307
307
if let Some ( ( path, args) ) = self . config . proc_macro_srv ( ) {
308
- match ProcMacroServer :: spawn ( path. clone ( ) , args) {
309
- Ok ( it) => self . proc_macro_client = Some ( it) ,
310
- Err ( err) => {
311
- tracing:: error!(
312
- "Failed to run proc_macro_srv from path {}, error: {:?}" ,
313
- path. display( ) ,
314
- err
315
- ) ;
316
- }
317
- }
308
+ self . proc_macro_clients = ( 0 ..self . workspaces . len ( ) )
309
+ . map ( |_| {
310
+ ProcMacroServer :: spawn ( path. clone ( ) , args. clone ( ) ) . map_err ( |err| {
311
+ let error = format ! (
312
+ "Failed to run proc_macro_srv from path {}, error: {:?}" ,
313
+ path. display( ) ,
314
+ err
315
+ ) ;
316
+ tracing:: error!( error) ;
317
+ error
318
+ } )
319
+ } )
320
+ . collect ( ) ;
318
321
}
319
322
}
320
323
@@ -331,15 +334,7 @@ impl GlobalState {
331
334
332
335
// Create crate graph from all the workspaces
333
336
let crate_graph = {
334
- let proc_macro_client = self . proc_macro_client . as_ref ( ) ;
335
337
let dummy_replacements = self . config . dummy_replacements ( ) ;
336
- let mut load_proc_macro = move |crate_name : & str , path : & AbsPath | {
337
- load_proc_macro (
338
- proc_macro_client,
339
- path,
340
- dummy_replacements. get ( crate_name) . map ( |v| & * * v) . unwrap_or_default ( ) ,
341
- )
342
- } ;
343
338
344
339
let vfs = & mut self . vfs . write ( ) . 0 ;
345
340
let loader = & mut self . loader ;
@@ -359,7 +354,15 @@ impl GlobalState {
359
354
} ;
360
355
361
356
let mut crate_graph = CrateGraph :: default ( ) ;
362
- for ws in self . workspaces . iter ( ) {
357
+ for ( idx, ws) in self . workspaces . iter ( ) . enumerate ( ) {
358
+ let proc_macro_client = self . proc_macro_clients [ idx] . as_ref ( ) ;
359
+ let mut load_proc_macro = move |crate_name : & str , path : & AbsPath | {
360
+ load_proc_macro (
361
+ proc_macro_client,
362
+ path,
363
+ dummy_replacements. get ( crate_name) . map ( |v| & * * v) . unwrap_or_default ( ) ,
364
+ )
365
+ } ;
363
366
crate_graph. extend ( ws. to_crate_graph ( & mut load_proc_macro, & mut load) ) ;
364
367
}
365
368
crate_graph
@@ -536,14 +539,14 @@ impl SourceRootConfig {
536
539
/// Load the proc-macros for the given lib path, replacing all expanders whose names are in `dummy_replace`
537
540
/// with an identity dummy expander.
538
541
pub ( crate ) fn load_proc_macro (
539
- server : Option < & ProcMacroServer > ,
542
+ server : Result < & ProcMacroServer , & String > ,
540
543
path : & AbsPath ,
541
544
dummy_replace : & [ Box < str > ] ,
542
545
) -> ProcMacroLoadResult {
543
546
let res: Result < Vec < _ > , String > = ( || {
544
547
let dylib = MacroDylib :: new ( path. to_path_buf ( ) )
545
548
. map_err ( |io| format ! ( "Proc-macro dylib loading failed: {io}" ) ) ?;
546
- let server = server. ok_or_else ( || format ! ( "Proc-macro server not started" ) ) ?;
549
+ let server = server. map_err ( ToOwned :: to_owned ) ?;
547
550
let vec = server. load_dylib ( dylib) . map_err ( |e| format ! ( "{e}" ) ) ?;
548
551
if vec. is_empty ( ) {
549
552
return Err ( "proc macro library returned no proc macros" . to_string ( ) ) ;
0 commit comments