about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAmos Wenger <amoswenger@gmail.com>2022-07-25 17:52:38 +0200
committerAmos Wenger <amoswenger@gmail.com>2022-07-25 17:52:38 +0200
commit2c2520fbb48b977a805b46af79e4016a4394e719 (patch)
treea20f7e4d852d5c4c9eef3bc1551b2268cad7ce18
parent696775153dffaa701bcabe67b5fe601db862c4f4 (diff)
downloadrust-2c2520fbb48b977a805b46af79e4016a4394e719.tar.gz
rust-2c2520fbb48b977a805b46af79e4016a4394e719.zip
Allow specifying sysroot OR sysroot_src
-rw-r--r--crates/project-model/src/workspace.rs24
1 files changed, 17 insertions, 7 deletions
diff --git a/crates/project-model/src/workspace.rs b/crates/project-model/src/workspace.rs
index 63882466fa4..b144006b44e 100644
--- a/crates/project-model/src/workspace.rs
+++ b/crates/project-model/src/workspace.rs
@@ -230,16 +230,26 @@ impl ProjectWorkspace {
         project_json: ProjectJson,
         target: Option<&str>,
     ) -> Result<ProjectWorkspace> {
-        let sysroot = match project_json.sysroot_src.clone() {
-            Some(sysroot_src) => {
-                // if `sysroot` isn't specified (only `sysroot_src`), we won't have
-                // a real sysroot path, that's fine. it's just used to discover
-                // the standalone `proc-macro-srv` binary.
-                let sysroot = project_json.sysroot.clone().unwrap_or_else(|| sysroot_src.clone());
+        let sysroot = match (project_json.sysroot.clone(), project_json.sysroot_src.clone()) {
+            (Some(sysroot), Some(sysroot_src)) => Some(Sysroot::load(sysroot, sysroot_src)?),
+            (Some(sysroot), None) => {
+                // assume sysroot is structured like rustup's and guess `sysroot_src`
+                let sysroot_src =
+                    sysroot.join("lib").join("rustlib").join("src").join("rust").join("library");
+
                 Some(Sysroot::load(sysroot, sysroot_src)?)
             }
-            None => None,
+            (None, Some(sysroot_src)) => {
+                // assume sysroot is structured like rustup's and guess `sysroot`
+                let mut sysroot = sysroot_src.clone();
+                for _ in 0..5 {
+                    sysroot.pop();
+                }
+                Some(Sysroot::load(sysroot, sysroot_src)?)
+            }
+            (None, None) => None,
         };
+
         let rustc_cfg = rustc_cfg::get(None, target);
         Ok(ProjectWorkspace::Json { project: project_json, sysroot, rustc_cfg })
     }