internal: Warn when loading sysroot fails to find the core library

This commit is contained in:
Lukas Wirth 2023-04-13 08:40:14 +02:00
parent 7501d3b721
commit dd5c3c30b6
2 changed files with 32 additions and 18 deletions

View File

@ -74,6 +74,23 @@ impl Sysroot {
pub fn is_empty(&self) -> bool {
self.crates.is_empty()
}
pub fn loading_warning(&self) -> Option<String> {
if self.by_name("core").is_none() {
let var_note = if env::var_os("RUST_SRC_PATH").is_some() {
" (`RUST_SRC_PATH` might be incorrect, try unsetting it)"
} else {
" try running `rustup component add rust-src` to possible fix this"
};
Some(format!(
"could not find libcore in loaded sysroot at `{}`{}",
self.src_root.as_path().display(),
var_note,
))
} else {
None
}
}
}
// FIXME: Expose a builder api as loading the sysroot got way too modular and complicated.
@ -103,7 +120,7 @@ impl Sysroot {
pub fn with_sysroot_dir(sysroot_dir: AbsPathBuf) -> Result<Sysroot> {
let sysroot_src_dir = discover_sysroot_src_dir(&sysroot_dir).ok_or_else(|| {
format_err!("can't load standard library from sysroot {}", sysroot_dir.display())
format_err!("can't load standard library from sysroot path {}", sysroot_dir.display())
})?;
Ok(Sysroot::load(sysroot_dir, sysroot_src_dir))
}
@ -153,19 +170,6 @@ impl Sysroot {
}
}
if sysroot.by_name("core").is_none() {
let var_note = if env::var_os("RUST_SRC_PATH").is_some() {
" (`RUST_SRC_PATH` might be incorrect, try unsetting it)"
} else {
""
};
tracing::error!(
"could not find libcore in sysroot path `{}`{}",
sysroot.src_root.as_path().display(),
var_note,
);
}
sysroot
}

View File

@ -138,10 +138,20 @@ impl GlobalState {
let (ProjectWorkspace::Cargo { sysroot, .. }
| ProjectWorkspace::Json { sysroot, .. }
| ProjectWorkspace::DetachedFiles { sysroot, .. }) = ws;
if let Err(Some(e)) = sysroot {
status.health = lsp_ext::Health::Warning;
message.push_str(e);
message.push_str("\n\n");
match sysroot {
Err(None) => (),
Err(Some(e)) => {
status.health = lsp_ext::Health::Warning;
message.push_str(e);
message.push_str("\n\n");
}
Ok(s) => {
if let Some(e) = s.loading_warning() {
status.health = lsp_ext::Health::Warning;
message.push_str(&e);
message.push_str("\n\n");
}
}
}
if let ProjectWorkspace::Cargo { rustc: Err(Some(e)), .. } = ws {
status.health = lsp_ext::Health::Warning;