Skip to content

Commit 512a93a

Browse files
committed
Auto merge of #14100 - Veykril:load_cargo-proc-macro-srv-config, r=Veykril
Allow specifying what proc-macro server to run in rust_analyzer::load_cargo API Closes #10516
2 parents 6effb26 + f03fb26 commit 512a93a

File tree

7 files changed

+42
-29
lines changed

7 files changed

+42
-29
lines changed

crates/rust-analyzer/src/cli/analysis_stats.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use vfs::{AbsPathBuf, Vfs, VfsPath};
3333

3434
use crate::cli::{
3535
flags::{self, OutputFormat},
36-
load_cargo::{load_workspace, LoadCargoConfig},
36+
load_cargo::{load_workspace, LoadCargoConfig, ProcMacroServerChoice},
3737
print_memory_usage,
3838
progress_report::ProgressReport,
3939
report_metric, Result, Verbosity,
@@ -59,11 +59,6 @@ impl flags::AnalysisStats {
5959
true => None,
6060
false => Some(RustcSource::Discover),
6161
};
62-
let load_cargo_config = LoadCargoConfig {
63-
load_out_dirs_from_check: !self.disable_build_scripts,
64-
with_proc_macro: !self.disable_proc_macros,
65-
prefill_caches: false,
66-
};
6762
let no_progress = &|_| ();
6863

6964
let mut db_load_sw = self.stop_watch();
@@ -73,6 +68,11 @@ impl flags::AnalysisStats {
7368

7469
let mut workspace = ProjectWorkspace::load(manifest, &cargo_config, no_progress)?;
7570
let metadata_time = db_load_sw.elapsed();
71+
let load_cargo_config = LoadCargoConfig {
72+
load_out_dirs_from_check: !self.disable_build_scripts,
73+
with_proc_macro_server: ProcMacroServerChoice::Sysroot,
74+
prefill_caches: false,
75+
};
7676

7777
let build_scripts_time = if self.disable_build_scripts {
7878
None

crates/rust-analyzer/src/cli/diagnostics.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ use ide_db::base_db::SourceDatabaseExt;
99

1010
use crate::cli::{
1111
flags,
12-
load_cargo::{load_workspace_at, LoadCargoConfig},
12+
load_cargo::{load_workspace_at, LoadCargoConfig, ProcMacroServerChoice},
1313
};
1414

1515
impl flags::Diagnostics {
1616
pub fn run(self) -> anyhow::Result<()> {
1717
let cargo_config = Default::default();
1818
let load_cargo_config = LoadCargoConfig {
1919
load_out_dirs_from_check: !self.disable_build_scripts,
20-
with_proc_macro: !self.disable_proc_macros,
20+
with_proc_macro_server: ProcMacroServerChoice::Sysroot,
2121
prefill_caches: false,
2222
};
2323
let (host, _vfs, _proc_macro) =

crates/rust-analyzer/src/cli/load_cargo.rs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Loads a Cargo project into a static instance of analysis, without support
22
//! for incorporating changes.
3-
use std::{path::Path, sync::Arc};
3+
use std::{convert::identity, path::Path, sync::Arc};
44

55
use anyhow::Result;
66
use crossbeam_channel::{unbounded, Receiver};
@@ -17,10 +17,17 @@ use crate::reload::{load_proc_macro, ProjectFolders, SourceRootConfig};
1717
// what otherwise would be `pub(crate)` has to be `pub` here instead.
1818
pub struct LoadCargoConfig {
1919
pub load_out_dirs_from_check: bool,
20-
pub with_proc_macro: bool,
20+
pub with_proc_macro_server: ProcMacroServerChoice,
2121
pub prefill_caches: bool,
2222
}
2323

24+
#[derive(Debug, Clone, PartialEq, Eq)]
25+
pub enum ProcMacroServerChoice {
26+
Sysroot,
27+
Explicit(AbsPathBuf, Vec<String>),
28+
None,
29+
}
30+
2431
// Note: Since this function is used by external tools that use rust-analyzer as a library
2532
// what otherwise would be `pub(crate)` has to be `pub` here instead.
2633
pub fn load_workspace_at(
@@ -59,15 +66,17 @@ pub fn load_workspace(
5966
Box::new(loader)
6067
};
6168

62-
let proc_macro_client = if load_config.with_proc_macro {
63-
let (server_path, args): (_, &[_]) = match ws.find_sysroot_proc_macro_srv() {
64-
Some(server_path) => (server_path, &[]),
65-
None => (AbsPathBuf::assert(std::env::current_exe()?), &["proc-macro"]),
66-
};
67-
68-
ProcMacroServer::spawn(server_path, args).map_err(|e| e.to_string())
69-
} else {
70-
Err("proc macro server disabled".to_owned())
69+
let proc_macro_client = match &load_config.with_proc_macro_server {
70+
ProcMacroServerChoice::Sysroot => ws
71+
.find_sysroot_proc_macro_srv()
72+
.ok_or_else(|| "failed to find sysroot proc-macro server".to_owned())
73+
.and_then(|it| {
74+
ProcMacroServer::spawn(it, identity::<&[&str]>(&[])).map_err(|e| e.to_string())
75+
}),
76+
ProcMacroServerChoice::Explicit(path, args) => {
77+
ProcMacroServer::spawn(path.clone(), args).map_err(|e| e.to_string())
78+
}
79+
ProcMacroServerChoice::None => Err("proc macro server disabled".to_owned()),
7180
};
7281

7382
let crate_graph = ws.to_crate_graph(
@@ -157,7 +166,7 @@ mod tests {
157166
let cargo_config = CargoConfig::default();
158167
let load_cargo_config = LoadCargoConfig {
159168
load_out_dirs_from_check: false,
160-
with_proc_macro: false,
169+
with_proc_macro_server: ProcMacroServerChoice::None,
161170
prefill_caches: false,
162171
};
163172
let (host, _vfs, _proc_macro) =

crates/rust-analyzer/src/cli/lsif.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use lsp_types::{self, lsif};
1515
use project_model::{CargoConfig, ProjectManifest, ProjectWorkspace};
1616
use vfs::{AbsPathBuf, Vfs};
1717

18+
use crate::cli::load_cargo::ProcMacroServerChoice;
1819
use crate::cli::{
1920
flags,
2021
load_cargo::{load_workspace, LoadCargoConfig},
@@ -291,7 +292,7 @@ impl flags::Lsif {
291292
let no_progress = &|_| ();
292293
let load_cargo_config = LoadCargoConfig {
293294
load_out_dirs_from_check: true,
294-
with_proc_macro: true,
295+
with_proc_macro_server: ProcMacroServerChoice::Sysroot,
295296
prefill_caches: false,
296297
};
297298
let path = AbsPathBuf::assert(env::current_dir()?.join(&self.path));

crates/rust-analyzer/src/cli/scip.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ use std::{
55
time::Instant,
66
};
77

8-
use crate::line_index::{LineEndings, LineIndex, PositionEncoding};
8+
use crate::{
9+
cli::load_cargo::ProcMacroServerChoice,
10+
line_index::{LineEndings, LineIndex, PositionEncoding},
11+
};
912
use hir::Name;
1013
use ide::{
1114
LineCol, MonikerDescriptorKind, StaticIndex, StaticIndexedFile, TextRange, TokenId,
@@ -31,7 +34,7 @@ impl flags::Scip {
3134
let no_progress = &|s| (eprintln!("rust-analyzer: Loading {s}"));
3235
let load_cargo_config = LoadCargoConfig {
3336
load_out_dirs_from_check: true,
34-
with_proc_macro: true,
37+
with_proc_macro_server: ProcMacroServerChoice::Sysroot,
3538
prefill_caches: true,
3639
};
3740
let path = vfs::AbsPathBuf::assert(env::current_dir()?.join(&self.path));

crates/rust-analyzer/src/cli/ssr.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use project_model::CargoConfig;
55

66
use crate::cli::{
77
flags,
8-
load_cargo::{load_workspace_at, LoadCargoConfig},
8+
load_cargo::{load_workspace_at, LoadCargoConfig, ProcMacroServerChoice},
99
Result,
1010
};
1111

@@ -15,7 +15,7 @@ impl flags::Ssr {
1515
let cargo_config = CargoConfig::default();
1616
let load_cargo_config = LoadCargoConfig {
1717
load_out_dirs_from_check: true,
18-
with_proc_macro: true,
18+
with_proc_macro_server: ProcMacroServerChoice::Sysroot,
1919
prefill_caches: false,
2020
};
2121
let (host, vfs, _proc_macro) = load_workspace_at(
@@ -51,7 +51,7 @@ impl flags::Search {
5151
let cargo_config = CargoConfig::default();
5252
let load_cargo_config = LoadCargoConfig {
5353
load_out_dirs_from_check: true,
54-
with_proc_macro: true,
54+
with_proc_macro_server: ProcMacroServerChoice::Sysroot,
5555
prefill_caches: false,
5656
};
5757
let (host, _vfs, _proc_macro) = load_workspace_at(

crates/rust-analyzer/src/integrated_benchmarks.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use project_model::CargoConfig;
2121
use test_utils::project_root;
2222
use vfs::{AbsPathBuf, VfsPath};
2323

24-
use crate::cli::load_cargo::{load_workspace_at, LoadCargoConfig};
24+
use crate::cli::load_cargo::{load_workspace_at, LoadCargoConfig, ProcMacroServerChoice};
2525

2626
#[test]
2727
fn integrated_highlighting_benchmark() {
@@ -36,7 +36,7 @@ fn integrated_highlighting_benchmark() {
3636
let cargo_config = CargoConfig::default();
3737
let load_cargo_config = LoadCargoConfig {
3838
load_out_dirs_from_check: true,
39-
with_proc_macro: false,
39+
with_proc_macro_server: ProcMacroServerChoice::None,
4040
prefill_caches: false,
4141
};
4242

@@ -90,7 +90,7 @@ fn integrated_completion_benchmark() {
9090
let cargo_config = CargoConfig::default();
9191
let load_cargo_config = LoadCargoConfig {
9292
load_out_dirs_from_check: true,
93-
with_proc_macro: false,
93+
with_proc_macro_server: ProcMacroServerChoice::None,
9494
prefill_caches: true,
9595
};
9696

0 commit comments

Comments
 (0)