aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_project_model/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_project_model/src/lib.rs')
-rw-r--r--crates/ra_project_model/src/lib.rs43
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,