@@ -306,41 +306,50 @@ impl GlobalState {
306
306
format ! ( "rust-analyzer-proc-macro-srv{}" , std:: env:: consts:: EXE_SUFFIX ) ;
307
307
308
308
if self . proc_macro_clients . is_empty ( ) {
309
- if let Some ( ( path, args ) ) = self . config . proc_macro_srv ( ) {
309
+ if let Some ( ( path, path_manually_set ) ) = self . config . proc_macro_srv ( ) {
310
310
tracing:: info!( "Spawning proc-macro servers" ) ;
311
311
self . proc_macro_clients = self
312
312
. workspaces
313
313
. iter ( )
314
314
. map ( |ws| {
315
- let mut args = args. clone ( ) ;
316
- let mut path = path. clone ( ) ;
317
-
318
- if let ProjectWorkspace :: Cargo { sysroot, .. }
319
- | ProjectWorkspace :: Json { sysroot, .. } = ws
320
- {
321
- tracing:: debug!( "Found a cargo workspace..." ) ;
322
- if let Some ( sysroot) = sysroot. as_ref ( ) {
323
- tracing:: debug!( "Found a cargo workspace with a sysroot..." ) ;
324
- let server_path =
325
- sysroot. root ( ) . join ( "libexec" ) . join ( & standalone_server_name) ;
326
- if std:: fs:: metadata ( & server_path) . is_ok ( ) {
327
- tracing:: debug!(
328
- "And the server exists at {}" ,
329
- server_path. display( )
330
- ) ;
331
- path = server_path;
332
- args = vec ! [ ] ;
333
- } else {
334
- tracing:: debug!(
335
- "And the server does not exist at {}" ,
336
- server_path. display( )
337
- ) ;
315
+ let ( path, args) = if path_manually_set {
316
+ tracing:: debug!(
317
+ "Pro-macro server path explicitly set: {}" ,
318
+ path. display( )
319
+ ) ;
320
+ ( path. clone ( ) , vec ! [ ] )
321
+ } else {
322
+ let mut sysroot_server = None ;
323
+ if let ProjectWorkspace :: Cargo { sysroot, .. }
324
+ | ProjectWorkspace :: Json { sysroot, .. } = ws
325
+ {
326
+ if let Some ( sysroot) = sysroot. as_ref ( ) {
327
+ let server_path = sysroot
328
+ . root ( )
329
+ . join ( "libexec" )
330
+ . join ( & standalone_server_name) ;
331
+ if std:: fs:: metadata ( & server_path) . is_ok ( ) {
332
+ tracing:: debug!(
333
+ "Sysroot proc-macro server exists at {}" ,
334
+ server_path. display( )
335
+ ) ;
336
+ sysroot_server = Some ( server_path) ;
337
+ } else {
338
+ tracing:: debug!(
339
+ "Sysroot proc-macro server does not exist at {}" ,
340
+ server_path. display( )
341
+ ) ;
342
+ }
338
343
}
339
344
}
340
- }
345
+ sysroot_server. map_or_else (
346
+ || ( path. clone ( ) , vec ! [ "proc-macro" . to_owned( ) ] ) ,
347
+ |path| ( path, vec ! [ ] ) ,
348
+ )
349
+ } ;
341
350
342
351
tracing:: info!( ?args, "Using proc-macro server at {}" , path. display( ) , ) ;
343
- ProcMacroServer :: spawn ( path. clone ( ) , args. clone ( ) ) . map_err ( |err| {
352
+ ProcMacroServer :: spawn ( path. clone ( ) , args) . map_err ( |err| {
344
353
let error = format ! (
345
354
"Failed to run proc-macro server from path {}, error: {:?}" ,
346
355
path. display( ) ,
0 commit comments