Skip to content

Commit 4a6bd40

Browse files
authored
Merge pull request #20158 from Veykril/push-rquozrwuskry
fix: Do not warn about proc-macro srv when sysroot is missing
2 parents 60a65ec + 7e65c22 commit 4a6bd40

File tree

5 files changed

+56
-41
lines changed

5 files changed

+56
-41
lines changed

src/tools/rust-analyzer/crates/load-cargo/src/lib.rs

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -78,20 +78,27 @@ pub fn load_workspace(
7878

7979
tracing::debug!(?load_config, "LoadCargoConfig");
8080
let proc_macro_server = match &load_config.with_proc_macro_server {
81-
ProcMacroServerChoice::Sysroot => ws
82-
.find_sysroot_proc_macro_srv()
83-
.and_then(|it| ProcMacroClient::spawn(&it, extra_env).map_err(Into::into))
84-
.map_err(|e| ProcMacroLoadingError::ProcMacroSrvError(e.to_string().into_boxed_str())),
85-
ProcMacroServerChoice::Explicit(path) => ProcMacroClient::spawn(path, extra_env)
86-
.map_err(|e| ProcMacroLoadingError::ProcMacroSrvError(e.to_string().into_boxed_str())),
87-
ProcMacroServerChoice::None => Err(ProcMacroLoadingError::Disabled),
81+
ProcMacroServerChoice::Sysroot => ws.find_sysroot_proc_macro_srv().map(|it| {
82+
it.and_then(|it| ProcMacroClient::spawn(&it, extra_env).map_err(Into::into)).map_err(
83+
|e| ProcMacroLoadingError::ProcMacroSrvError(e.to_string().into_boxed_str()),
84+
)
85+
}),
86+
ProcMacroServerChoice::Explicit(path) => {
87+
Some(ProcMacroClient::spawn(path, extra_env).map_err(|e| {
88+
ProcMacroLoadingError::ProcMacroSrvError(e.to_string().into_boxed_str())
89+
}))
90+
}
91+
ProcMacroServerChoice::None => Some(Err(ProcMacroLoadingError::Disabled)),
8892
};
8993
match &proc_macro_server {
90-
Ok(server) => {
91-
tracing::info!(path=%server.server_path(), "Proc-macro server started")
94+
Some(Ok(server)) => {
95+
tracing::info!(manifest=%ws.manifest_or_root(), path=%server.server_path(), "Proc-macro server started")
9296
}
93-
Err(e) => {
94-
tracing::info!(%e, "Failed to start proc-macro server")
97+
Some(Err(e)) => {
98+
tracing::info!(manifest=%ws.manifest_or_root(), %e, "Failed to start proc-macro server")
99+
}
100+
None => {
101+
tracing::info!(manifest=%ws.manifest_or_root(), "No proc-macro server started")
95102
}
96103
}
97104

@@ -108,8 +115,13 @@ pub fn load_workspace(
108115
);
109116
let proc_macros = {
110117
let proc_macro_server = match &proc_macro_server {
111-
Ok(it) => Ok(it),
112-
Err(e) => Err(ProcMacroLoadingError::ProcMacroSrvError(e.to_string().into_boxed_str())),
118+
Some(Ok(it)) => Ok(it),
119+
Some(Err(e)) => {
120+
Err(ProcMacroLoadingError::ProcMacroSrvError(e.to_string().into_boxed_str()))
121+
}
122+
None => Err(ProcMacroLoadingError::ProcMacroSrvError(
123+
"proc-macro-srv is not running, workspace is missing a sysroot".into(),
124+
)),
113125
};
114126
proc_macros
115127
.into_iter()
@@ -144,7 +156,7 @@ pub fn load_workspace(
144156
if load_config.prefill_caches {
145157
prime_caches::parallel_prime_caches(&db, 1, &|_| ());
146158
}
147-
Ok((db, vfs, proc_macro_server.ok()))
159+
Ok((db, vfs, proc_macro_server.and_then(Result::ok)))
148160
}
149161

150162
#[derive(Default)]

src/tools/rust-analyzer/crates/project-model/src/sysroot.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -163,18 +163,18 @@ impl Sysroot {
163163
}
164164
}
165165

166-
pub fn discover_proc_macro_srv(&self) -> anyhow::Result<AbsPathBuf> {
167-
let Some(root) = self.root() else {
168-
return Err(anyhow::format_err!("no sysroot",));
169-
};
170-
["libexec", "lib"]
171-
.into_iter()
172-
.map(|segment| root.join(segment).join("rust-analyzer-proc-macro-srv"))
173-
.find_map(|server_path| probe_for_binary(server_path.into()))
174-
.map(AbsPathBuf::assert)
175-
.ok_or_else(|| {
176-
anyhow::format_err!("cannot find proc-macro server in sysroot `{}`", root)
177-
})
166+
pub fn discover_proc_macro_srv(&self) -> Option<anyhow::Result<AbsPathBuf>> {
167+
let root = self.root()?;
168+
Some(
169+
["libexec", "lib"]
170+
.into_iter()
171+
.map(|segment| root.join(segment).join("rust-analyzer-proc-macro-srv"))
172+
.find_map(|server_path| probe_for_binary(server_path.into()))
173+
.map(AbsPathBuf::assert)
174+
.ok_or_else(|| {
175+
anyhow::format_err!("cannot find proc-macro server in sysroot `{}`", root)
176+
}),
177+
)
178178
}
179179

180180
fn assemble(

src/tools/rust-analyzer/crates/project-model/src/workspace.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -744,7 +744,7 @@ impl ProjectWorkspace {
744744
}
745745
}
746746

747-
pub fn find_sysroot_proc_macro_srv(&self) -> anyhow::Result<AbsPathBuf> {
747+
pub fn find_sysroot_proc_macro_srv(&self) -> Option<anyhow::Result<AbsPathBuf>> {
748748
self.sysroot.discover_proc_macro_srv()
749749
}
750750

src/tools/rust-analyzer/crates/rust-analyzer/src/global_state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ pub(crate) struct GlobalState {
101101
pub(crate) last_reported_status: lsp_ext::ServerStatusParams,
102102

103103
// proc macros
104-
pub(crate) proc_macro_clients: Arc<[anyhow::Result<ProcMacroClient>]>,
104+
pub(crate) proc_macro_clients: Arc<[Option<anyhow::Result<ProcMacroClient>>]>,
105105
pub(crate) build_deps_changed: bool,
106106

107107
// Flycheck

src/tools/rust-analyzer/crates/rust-analyzer/src/reload.rs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,7 @@ impl GlobalState {
194194
format_to!(message, "{e}");
195195
});
196196

197-
let proc_macro_clients =
198-
self.proc_macro_clients.iter().map(Some).chain(iter::repeat_with(|| None));
197+
let proc_macro_clients = self.proc_macro_clients.iter().chain(iter::repeat(&None));
199198

200199
for (ws, proc_macro_client) in self.workspaces.iter().zip(proc_macro_clients) {
201200
if let ProjectWorkspaceKind::Cargo { error: Some(error), .. }
@@ -252,7 +251,8 @@ impl GlobalState {
252251
message.push_str("\n\n");
253252
}
254253
}
255-
_ => (),
254+
// sysroot was explicitly not set so we didn't discover a server
255+
None => {}
256256
}
257257
}
258258
}
@@ -419,14 +419,11 @@ impl GlobalState {
419419
};
420420

421421
let mut builder = ProcMacrosBuilder::default();
422-
let proc_macro_clients = proc_macro_clients
423-
.iter()
424-
.map(|res| res.as_ref().map_err(|e| e.to_string()))
425-
.chain(iter::repeat_with(|| Err("proc-macro-srv is not running".into())));
422+
let proc_macro_clients = proc_macro_clients.iter().chain(iter::repeat(&None));
426423
for (client, paths) in proc_macro_clients.zip(paths) {
427424
for (crate_id, res) in paths.iter() {
428425
let expansion_res = match client {
429-
Ok(client) => match res {
426+
Some(Ok(client)) => match res {
430427
Ok((crate_name, path)) => {
431428
progress(format!("loading proc-macros: {path}"));
432429
let ignored_proc_macros = ignored_proc_macros
@@ -440,8 +437,11 @@ impl GlobalState {
440437
}
441438
Err(e) => Err(e.clone()),
442439
},
443-
Err(ref e) => Err(ProcMacroLoadingError::ProcMacroSrvError(
444-
e.clone().into_boxed_str(),
440+
Some(Err(e)) => Err(ProcMacroLoadingError::ProcMacroSrvError(
441+
e.to_string().into_boxed_str(),
442+
)),
443+
None => Err(ProcMacroLoadingError::ProcMacroSrvError(
444+
"proc-macro-srv is not running".into(),
445445
)),
446446
};
447447
builder.insert(*crate_id, expansion_res)
@@ -657,7 +657,10 @@ impl GlobalState {
657657
self.proc_macro_clients = Arc::from_iter(self.workspaces.iter().map(|ws| {
658658
let path = match self.config.proc_macro_srv() {
659659
Some(path) => path,
660-
None => ws.find_sysroot_proc_macro_srv()?,
660+
None => match ws.find_sysroot_proc_macro_srv()? {
661+
Ok(path) => path,
662+
Err(e) => return Some(Err(e)),
663+
},
661664
};
662665

663666
let env: FxHashMap<_, _> = match &ws.kind {
@@ -684,14 +687,14 @@ impl GlobalState {
684687
};
685688
info!("Using proc-macro server at {path}");
686689

687-
ProcMacroClient::spawn(&path, &env).map_err(|err| {
690+
Some(ProcMacroClient::spawn(&path, &env).map_err(|err| {
688691
tracing::error!(
689692
"Failed to run proc-macro server from path {path}, error: {err:?}",
690693
);
691694
anyhow::format_err!(
692695
"Failed to run proc-macro server from path {path}, error: {err:?}",
693696
)
694-
})
697+
}))
695698
}))
696699
}
697700

0 commit comments

Comments
 (0)