diff options
author | Emil Lauridsen <[email protected]> | 2020-03-16 12:43:29 +0000 |
---|---|---|
committer | Emil Lauridsen <[email protected]> | 2020-03-17 13:47:05 +0000 |
commit | 33c6c7abc6621f8b0cf083a98f7e4788cf4b5b54 (patch) | |
tree | 4b763fd11f25db269eacd9302042a54b50eda174 /crates/ra_project_model/src/lib.rs | |
parent | 2720e2374be951bb762ff2815dd67c7ffe3419b7 (diff) |
Support loading OUT_DIR from cargo check at launch
Diffstat (limited to 'crates/ra_project_model/src/lib.rs')
-rw-r--r-- | crates/ra_project_model/src/lib.rs | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/crates/ra_project_model/src/lib.rs b/crates/ra_project_model/src/lib.rs index 897874813..43f834253 100644 --- a/crates/ra_project_model/src/lib.rs +++ b/crates/ra_project_model/src/lib.rs | |||
@@ -150,6 +150,21 @@ impl ProjectWorkspace { | |||
150 | } | 150 | } |
151 | } | 151 | } |
152 | 152 | ||
153 | pub fn out_dirs(&self) -> Vec<PathBuf> { | ||
154 | match self { | ||
155 | ProjectWorkspace::Json { project: _project } => vec![], | ||
156 | ProjectWorkspace::Cargo { cargo, sysroot: _sysroot } => { | ||
157 | let mut out_dirs = Vec::with_capacity(cargo.packages().len()); | ||
158 | for pkg in cargo.packages() { | ||
159 | if let Some(out_dir) = pkg.out_dir(&cargo) { | ||
160 | out_dirs.push(out_dir.to_path_buf()); | ||
161 | } | ||
162 | } | ||
163 | out_dirs | ||
164 | } | ||
165 | } | ||
166 | } | ||
167 | |||
153 | pub fn n_packages(&self) -> usize { | 168 | pub fn n_packages(&self) -> usize { |
154 | match self { | 169 | match self { |
155 | ProjectWorkspace::Json { project } => project.crates.len(), | 170 | ProjectWorkspace::Json { project } => project.crates.len(), |
@@ -162,7 +177,8 @@ impl ProjectWorkspace { | |||
162 | pub fn to_crate_graph( | 177 | pub fn to_crate_graph( |
163 | &self, | 178 | &self, |
164 | default_cfg_options: &CfgOptions, | 179 | default_cfg_options: &CfgOptions, |
165 | outdirs: &FxHashMap<String, (ExternSourceId, String)>, | 180 | additional_out_dirs: &FxHashMap<String, PathBuf>, |
181 | extern_source_roots: &FxHashMap<PathBuf, ExternSourceId>, | ||
166 | load: &mut dyn FnMut(&Path) -> Option<FileId>, | 182 | load: &mut dyn FnMut(&Path) -> Option<FileId>, |
167 | ) -> CrateGraph { | 183 | ) -> CrateGraph { |
168 | let mut crate_graph = CrateGraph::default(); | 184 | let mut crate_graph = CrateGraph::default(); |
@@ -237,9 +253,11 @@ impl ProjectWorkspace { | |||
237 | 253 | ||
238 | let mut env = Env::default(); | 254 | let mut env = Env::default(); |
239 | let mut extern_source = ExternSource::default(); | 255 | let mut extern_source = ExternSource::default(); |
240 | if let Some((id, path)) = outdirs.get(krate.name(&sysroot)) { | 256 | if let Some(path) = additional_out_dirs.get(krate.name(&sysroot)) { |
241 | env.set("OUT_DIR", path.clone()); | 257 | env.set("OUT_DIR", path.to_string_lossy().to_string()); |
242 | extern_source.set_extern_path(&path, *id); | 258 | if let Some(extern_source_id) = extern_source_roots.get(path) { |
259 | extern_source.set_extern_path(&path, *extern_source_id); | ||
260 | } | ||
243 | } | 261 | } |
244 | 262 | ||
245 | let crate_id = crate_graph.add_crate_root( | 263 | let crate_id = crate_graph.add_crate_root( |
@@ -292,9 +310,20 @@ impl ProjectWorkspace { | |||
292 | }; | 310 | }; |
293 | let mut env = Env::default(); | 311 | let mut env = Env::default(); |
294 | let mut extern_source = ExternSource::default(); | 312 | let mut extern_source = ExternSource::default(); |
295 | if let Some((id, path)) = outdirs.get(pkg.name(&cargo)) { | 313 | if let Some(out_dir) = dbg!(pkg.out_dir(cargo)) { |
296 | env.set("OUT_DIR", path.clone()); | 314 | env.set("OUT_DIR", out_dir.to_string_lossy().to_string()); |
297 | extern_source.set_extern_path(&path, *id); | 315 | if let Some(extern_source_id) = |
316 | dbg!(dbg!(&extern_source_roots).get(out_dir)) | ||
317 | { | ||
318 | extern_source.set_extern_path(&out_dir, *extern_source_id); | ||
319 | } | ||
320 | } else { | ||
321 | if let Some(path) = additional_out_dirs.get(pkg.name(&cargo)) { | ||
322 | env.set("OUT_DIR", path.to_string_lossy().to_string()); | ||
323 | if let Some(extern_source_id) = extern_source_roots.get(path) { | ||
324 | extern_source.set_extern_path(&path, *extern_source_id); | ||
325 | } | ||
326 | } | ||
298 | } | 327 | } |
299 | let crate_id = crate_graph.add_crate_root( | 328 | let crate_id = crate_graph.add_crate_root( |
300 | file_id, | 329 | file_id, |