mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 22:31:43 +00:00
fix: Fix metadata retrying eating original errors
This commit is contained in:
parent
2025b43653
commit
191949eabe
9 changed files with 60 additions and 52 deletions
|
@ -69,6 +69,8 @@ pub enum ProjectWorkspaceKind {
|
|||
Cargo {
|
||||
/// The workspace as returned by `cargo metadata`.
|
||||
cargo: CargoWorkspace,
|
||||
/// Additional `cargo metadata` error. (only populated if retried fetching via `--no-deps` succeeded).
|
||||
error: Option<Arc<anyhow::Error>>,
|
||||
/// The build script results for the workspace.
|
||||
build_scripts: WorkspaceBuildScripts,
|
||||
/// The rustc workspace loaded for this workspace. An `Err(None)` means loading has been
|
||||
|
@ -93,7 +95,7 @@ pub enum ProjectWorkspaceKind {
|
|||
/// The file in question.
|
||||
file: ManifestPath,
|
||||
/// Is this file a cargo script file?
|
||||
cargo: Option<(CargoWorkspace, WorkspaceBuildScripts)>,
|
||||
cargo: Option<(CargoWorkspace, WorkspaceBuildScripts, Option<Arc<anyhow::Error>>)>,
|
||||
/// Environment variables set in the `.cargo/config` file.
|
||||
cargo_config_extra_env: FxHashMap<String, String>,
|
||||
},
|
||||
|
@ -106,6 +108,7 @@ impl fmt::Debug for ProjectWorkspace {
|
|||
match kind {
|
||||
ProjectWorkspaceKind::Cargo {
|
||||
cargo,
|
||||
error: _,
|
||||
build_scripts: _,
|
||||
rustc,
|
||||
cargo_config_extra_env,
|
||||
|
@ -256,7 +259,7 @@ impl ProjectWorkspace {
|
|||
false,
|
||||
progress,
|
||||
) {
|
||||
Ok(meta) => {
|
||||
Ok((meta, _error)) => {
|
||||
let workspace = CargoWorkspace::new(meta, cargo_toml.clone());
|
||||
let buildscripts = WorkspaceBuildScripts::rustc_crates(
|
||||
&workspace,
|
||||
|
@ -301,7 +304,7 @@ impl ProjectWorkspace {
|
|||
tracing::error!(%e, "failed fetching data layout for {cargo_toml:?} workspace");
|
||||
}
|
||||
|
||||
let meta = CargoWorkspace::fetch_metadata(
|
||||
let (meta, error) = CargoWorkspace::fetch_metadata(
|
||||
cargo_toml,
|
||||
cargo_toml.parent(),
|
||||
config,
|
||||
|
@ -324,6 +327,7 @@ impl ProjectWorkspace {
|
|||
build_scripts: WorkspaceBuildScripts::default(),
|
||||
rustc,
|
||||
cargo_config_extra_env,
|
||||
error: error.map(Arc::new),
|
||||
},
|
||||
sysroot,
|
||||
rustc_cfg,
|
||||
|
@ -404,10 +408,11 @@ impl ProjectWorkspace {
|
|||
let cargo_script =
|
||||
CargoWorkspace::fetch_metadata(detached_file, dir, config, &sysroot, false, &|_| ())
|
||||
.ok()
|
||||
.map(|ws| {
|
||||
.map(|(ws, error)| {
|
||||
(
|
||||
CargoWorkspace::new(ws, detached_file.clone()),
|
||||
WorkspaceBuildScripts::default(),
|
||||
error.map(Arc::new),
|
||||
)
|
||||
});
|
||||
|
||||
|
@ -440,10 +445,8 @@ impl ProjectWorkspace {
|
|||
progress: &dyn Fn(String),
|
||||
) -> anyhow::Result<WorkspaceBuildScripts> {
|
||||
match &self.kind {
|
||||
ProjectWorkspaceKind::DetachedFile { cargo: Some((cargo, _)), .. }
|
||||
| ProjectWorkspaceKind::Cargo { cargo, .. }
|
||||
if !cargo.no_deps() =>
|
||||
{
|
||||
ProjectWorkspaceKind::DetachedFile { cargo: Some((cargo, _, None)), .. }
|
||||
| ProjectWorkspaceKind::Cargo { cargo, error: None, .. } => {
|
||||
WorkspaceBuildScripts::run_for_workspace(config, cargo, progress, &self.sysroot)
|
||||
.with_context(|| {
|
||||
format!("Failed to run build scripts for {}", cargo.workspace_root())
|
||||
|
@ -502,7 +505,7 @@ impl ProjectWorkspace {
|
|||
pub fn set_build_scripts(&mut self, bs: WorkspaceBuildScripts) {
|
||||
match &mut self.kind {
|
||||
ProjectWorkspaceKind::Cargo { build_scripts, .. }
|
||||
| ProjectWorkspaceKind::DetachedFile { cargo: Some((_, build_scripts)), .. } => {
|
||||
| ProjectWorkspaceKind::DetachedFile { cargo: Some((_, build_scripts, _)), .. } => {
|
||||
*build_scripts = bs
|
||||
}
|
||||
_ => assert_eq!(bs, WorkspaceBuildScripts::default()),
|
||||
|
@ -593,6 +596,7 @@ impl ProjectWorkspace {
|
|||
rustc,
|
||||
build_scripts,
|
||||
cargo_config_extra_env: _,
|
||||
error: _,
|
||||
} => {
|
||||
cargo
|
||||
.packages()
|
||||
|
@ -648,7 +652,7 @@ impl ProjectWorkspace {
|
|||
include: vec![file.to_path_buf()],
|
||||
exclude: Vec::new(),
|
||||
})
|
||||
.chain(cargo_script.iter().flat_map(|(cargo, build_scripts)| {
|
||||
.chain(cargo_script.iter().flat_map(|(cargo, build_scripts, _)| {
|
||||
cargo.packages().map(|pkg| {
|
||||
let is_local = cargo[pkg].is_local;
|
||||
let pkg_root = cargo[pkg].manifest.parent().to_path_buf();
|
||||
|
@ -703,7 +707,7 @@ impl ProjectWorkspace {
|
|||
}
|
||||
ProjectWorkspaceKind::DetachedFile { cargo: cargo_script, .. } => {
|
||||
sysroot_package_len
|
||||
+ cargo_script.as_ref().map_or(1, |(cargo, _)| cargo.packages().len())
|
||||
+ cargo_script.as_ref().map_or(1, |(cargo, _, _)| cargo.packages().len())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -733,6 +737,7 @@ impl ProjectWorkspace {
|
|||
rustc,
|
||||
build_scripts,
|
||||
cargo_config_extra_env: _,
|
||||
error: _,
|
||||
} => (
|
||||
cargo_to_crate_graph(
|
||||
load,
|
||||
|
@ -746,7 +751,7 @@ impl ProjectWorkspace {
|
|||
sysroot,
|
||||
),
|
||||
ProjectWorkspaceKind::DetachedFile { file, cargo: cargo_script, .. } => (
|
||||
if let Some((cargo, build_scripts)) = cargo_script {
|
||||
if let Some((cargo, build_scripts, _)) = cargo_script {
|
||||
cargo_to_crate_graph(
|
||||
&mut |path| load(path),
|
||||
None,
|
||||
|
@ -795,12 +800,14 @@ impl ProjectWorkspace {
|
|||
rustc,
|
||||
cargo_config_extra_env,
|
||||
build_scripts: _,
|
||||
error: _,
|
||||
},
|
||||
ProjectWorkspaceKind::Cargo {
|
||||
cargo: o_cargo,
|
||||
rustc: o_rustc,
|
||||
cargo_config_extra_env: o_cargo_config_extra_env,
|
||||
build_scripts: _,
|
||||
error: _,
|
||||
},
|
||||
) => {
|
||||
cargo == o_cargo
|
||||
|
@ -813,12 +820,12 @@ impl ProjectWorkspace {
|
|||
(
|
||||
ProjectWorkspaceKind::DetachedFile {
|
||||
file,
|
||||
cargo: Some((cargo_script, _)),
|
||||
cargo: Some((cargo_script, _, _)),
|
||||
cargo_config_extra_env,
|
||||
},
|
||||
ProjectWorkspaceKind::DetachedFile {
|
||||
file: o_file,
|
||||
cargo: Some((o_cargo_script, _)),
|
||||
cargo: Some((o_cargo_script, _, _)),
|
||||
cargo_config_extra_env: o_cargo_config_extra_env,
|
||||
},
|
||||
) => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue