diff options
Diffstat (limited to 'crates/ra_project_model/src/sysroot.rs')
-rw-r--r-- | crates/ra_project_model/src/sysroot.rs | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/crates/ra_project_model/src/sysroot.rs b/crates/ra_project_model/src/sysroot.rs index a8a196e64..943ff92df 100644 --- a/crates/ra_project_model/src/sysroot.rs +++ b/crates/ra_project_model/src/sysroot.rs | |||
@@ -1,15 +1,12 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! FIXME: write short doc here |
2 | 2 | ||
3 | use std::{ | 3 | use std::{convert::TryFrom, env, ops, path::Path, process::Command}; |
4 | env, ops, | ||
5 | path::{Path, PathBuf}, | ||
6 | process::Command, | ||
7 | }; | ||
8 | 4 | ||
9 | use anyhow::{bail, Result}; | 5 | use anyhow::{bail, format_err, Result}; |
10 | use ra_arena::{Arena, Idx}; | 6 | use ra_arena::{Arena, Idx}; |
11 | 7 | ||
12 | use crate::output; | 8 | use crate::output; |
9 | use paths::{AbsPath, AbsPathBuf}; | ||
13 | 10 | ||
14 | #[derive(Default, Debug, Clone)] | 11 | #[derive(Default, Debug, Clone)] |
15 | pub struct Sysroot { | 12 | pub struct Sysroot { |
@@ -21,7 +18,7 @@ pub type SysrootCrate = Idx<SysrootCrateData>; | |||
21 | #[derive(Debug, Clone)] | 18 | #[derive(Debug, Clone)] |
22 | pub struct SysrootCrateData { | 19 | pub struct SysrootCrateData { |
23 | pub name: String, | 20 | pub name: String, |
24 | pub root: PathBuf, | 21 | pub root: AbsPathBuf, |
25 | pub deps: Vec<SysrootCrate>, | 22 | pub deps: Vec<SysrootCrate>, |
26 | } | 23 | } |
27 | 24 | ||
@@ -53,7 +50,7 @@ impl Sysroot { | |||
53 | self.crates.iter().map(|(id, _data)| id) | 50 | self.crates.iter().map(|(id, _data)| id) |
54 | } | 51 | } |
55 | 52 | ||
56 | pub fn discover(cargo_toml: &Path) -> Result<Sysroot> { | 53 | pub fn discover(cargo_toml: &AbsPath) -> Result<Sysroot> { |
57 | let src = get_or_install_rust_src(cargo_toml)?; | 54 | let src = get_or_install_rust_src(cargo_toml)?; |
58 | let mut sysroot = Sysroot { crates: Arena::default() }; | 55 | let mut sysroot = Sysroot { crates: Arena::default() }; |
59 | for name in SYSROOT_CRATES.trim().lines() { | 56 | for name in SYSROOT_CRATES.trim().lines() { |
@@ -86,16 +83,18 @@ impl Sysroot { | |||
86 | } | 83 | } |
87 | } | 84 | } |
88 | 85 | ||
89 | fn get_or_install_rust_src(cargo_toml: &Path) -> Result<PathBuf> { | 86 | fn get_or_install_rust_src(cargo_toml: &AbsPath) -> Result<AbsPathBuf> { |
90 | if let Ok(path) = env::var("RUST_SRC_PATH") { | 87 | if let Ok(path) = env::var("RUST_SRC_PATH") { |
91 | return Ok(path.into()); | 88 | let path = AbsPathBuf::try_from(path.as_str()) |
89 | .map_err(|path| format_err!("RUST_SRC_PATH must be absolute: {}", path.display()))?; | ||
90 | return Ok(path); | ||
92 | } | 91 | } |
93 | let current_dir = cargo_toml.parent().unwrap(); | 92 | let current_dir = cargo_toml.parent().unwrap(); |
94 | let mut rustc = Command::new(ra_toolchain::rustc()); | 93 | let mut rustc = Command::new(ra_toolchain::rustc()); |
95 | rustc.current_dir(current_dir).args(&["--print", "sysroot"]); | 94 | rustc.current_dir(current_dir).args(&["--print", "sysroot"]); |
96 | let rustc_output = output(rustc)?; | 95 | let rustc_output = output(rustc)?; |
97 | let stdout = String::from_utf8(rustc_output.stdout)?; | 96 | let stdout = String::from_utf8(rustc_output.stdout)?; |
98 | let sysroot_path = Path::new(stdout.trim()); | 97 | let sysroot_path = AbsPath::assert(Path::new(stdout.trim())); |
99 | let src_path = sysroot_path.join("lib/rustlib/src/rust/src"); | 98 | let src_path = sysroot_path.join("lib/rustlib/src/rust/src"); |
100 | 99 | ||
101 | if !src_path.exists() { | 100 | if !src_path.exists() { |
@@ -116,7 +115,7 @@ fn get_or_install_rust_src(cargo_toml: &Path) -> Result<PathBuf> { | |||
116 | } | 115 | } |
117 | 116 | ||
118 | impl SysrootCrateData { | 117 | impl SysrootCrateData { |
119 | pub fn root_dir(&self) -> &Path { | 118 | pub fn root_dir(&self) -> &AbsPath { |
120 | self.root.parent().unwrap() | 119 | self.root.parent().unwrap() |
121 | } | 120 | } |
122 | } | 121 | } |