about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLukas Wirth <lukastw97@gmail.com>2024-04-19 15:50:27 +0200
committerLukas Wirth <lukastw97@gmail.com>2024-04-19 18:25:10 +0200
commit46f05543a2520af5dced5667e5d2c16586539ffa (patch)
tree58a25ce790ea995cde36f9273db5f4f1c60288d7
parent0b24599cf9830caf58d9df5f6b340b7156bc932b (diff)
downloadrust-46f05543a2520af5dced5667e5d2c16586539ffa.tar.gz
rust-46f05543a2520af5dced5667e5d2c16586539ffa.zip
Patch cargo script root files back to manifest
-rw-r--r--crates/project-model/src/cargo_workspace.rs18
-rw-r--r--crates/project-model/src/workspace.rs6
-rw-r--r--crates/rust-analyzer/src/reload.rs2
-rw-r--r--crates/rust-analyzer/tests/slow-tests/main.rs16
4 files changed, 26 insertions, 16 deletions
diff --git a/crates/project-model/src/cargo_workspace.rs b/crates/project-model/src/cargo_workspace.rs
index 7bba987f7d0..ff7cf144aa8 100644
--- a/crates/project-model/src/cargo_workspace.rs
+++ b/crates/project-model/src/cargo_workspace.rs
@@ -379,11 +379,12 @@ impl CargoWorkspace {
             let is_local = source.is_none();
             let is_member = ws_members.contains(&id);
 
+            let manifest = AbsPathBuf::assert(manifest_path);
             let pkg = packages.alloc(PackageData {
                 id: id.repr.clone(),
                 name,
                 version,
-                manifest: AbsPathBuf::assert(manifest_path).try_into().unwrap(),
+                manifest: manifest.clone().try_into().unwrap(),
                 targets: Vec::new(),
                 is_local,
                 is_member,
@@ -406,11 +407,22 @@ impl CargoWorkspace {
             for meta_tgt in meta_targets {
                 let cargo_metadata::Target { name, kind, required_features, src_path, .. } =
                     meta_tgt;
+                let kind = TargetKind::new(&kind);
                 let tgt = targets.alloc(TargetData {
                     package: pkg,
                     name,
-                    root: AbsPathBuf::assert(src_path),
-                    kind: TargetKind::new(&kind),
+                    root: if kind == TargetKind::Bin
+                        && manifest.extension().is_some_and(|ext| ext == "rs")
+                    {
+                        // cargo strips the script part of a cargo script away and places the
+                        // modified manifest file into a special target dir which is then used as
+                        // the source path. We don't want that, we want the original here so map it
+                        // back
+                        manifest.clone()
+                    } else {
+                        AbsPathBuf::assert(src_path)
+                    },
+                    kind,
                     required_features,
                 });
                 pkg_data.targets.push(tgt);
diff --git a/crates/project-model/src/workspace.rs b/crates/project-model/src/workspace.rs
index dca2c8d7392..7709f99b2e9 100644
--- a/crates/project-model/src/workspace.rs
+++ b/crates/project-model/src/workspace.rs
@@ -437,7 +437,7 @@ impl ProjectWorkspace {
         detached_files: Vec<AbsPathBuf>,
         config: &CargoConfig,
     ) -> Vec<anyhow::Result<ProjectWorkspace>> {
-        dbg!(detached_files
+        detached_files
             .into_iter()
             .map(|detached_file| {
                 let dir = detached_file
@@ -508,7 +508,7 @@ impl ProjectWorkspace {
                     cargo_script,
                 })
             })
-            .collect())
+            .collect()
     }
 
     /// Runs the build scripts for this [`ProjectWorkspace`].
@@ -822,7 +822,7 @@ impl ProjectWorkspace {
             } => (
                 if let Some(cargo) = cargo_script {
                     cargo_to_crate_graph(
-                        load,
+                        &mut |path| load(path),
                         None,
                         cargo,
                         sysroot.as_ref().ok(),
diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs
index 84db3c6720e..557faaf84ca 100644
--- a/crates/rust-analyzer/src/reload.rs
+++ b/crates/rust-analyzer/src/reload.rs
@@ -718,9 +718,7 @@ pub fn ws_to_crate_graph(
     let mut toolchains = Vec::default();
     let e = Err(Arc::from("missing layout"));
     for ws in workspaces {
-        dbg!(ws);
         let (other, mut crate_proc_macros) = ws.to_crate_graph(&mut load, extra_env);
-        dbg!(&other);
         let num_layouts = layouts.len();
         let num_toolchains = toolchains.len();
         let (ProjectWorkspace::Cargo { toolchain, target_layout, .. }
diff --git a/crates/rust-analyzer/tests/slow-tests/main.rs b/crates/rust-analyzer/tests/slow-tests/main.rs
index 715fed5fef6..22d8b6bdf18 100644
--- a/crates/rust-analyzer/tests/slow-tests/main.rs
+++ b/crates/rust-analyzer/tests/slow-tests/main.rs
@@ -139,10 +139,10 @@ version = "0.1.0"
 pub struct SpecialHashMap2;
 //- /src/lib.rs
 #!/usr/bin/env -S cargo +nightly -Zscript
-//! ---cargo
-//! [dependencies]
-//! dependency = { path = "../dependency" }
-//! ---
+---cargo
+[dependencies]
+dependency = { path = "../dependency" }
+---
 use dependency::Spam;
 use dependency2::Spam;
 "#,
@@ -178,10 +178,10 @@ use dependency2::Spam;
     server.write_file_and_save(
         "src/lib.rs",
         r#"#!/usr/bin/env -S cargo +nightly -Zscript
-//! ---cargo
-//! [dependencies]
-//! dependency2 = { path = "../dependency2" }
-//! ---
+---cargo
+[dependencies]
+dependency2 = { path = "../dependency2" }
+---
 use dependency::Spam;
 use dependency2::Spam;
 "#