diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_hir_def/src/nameres/collector.rs | 6 | ||||
-rw-r--r-- | crates/ra_project_model/src/lib.rs | 8 | ||||
-rw-r--r-- | crates/ra_project_model/src/sysroot.rs | 4 |
3 files changed, 16 insertions, 2 deletions
diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs index 7e6083961..36a61dc3d 100644 --- a/crates/ra_hir_def/src/nameres/collector.rs +++ b/crates/ra_hir_def/src/nameres/collector.rs | |||
@@ -27,6 +27,7 @@ pub(super) fn collect_defs(db: &impl DefDatabase2, mut def_map: CrateDefMap) -> | |||
27 | let crate_graph = db.crate_graph(); | 27 | let crate_graph = db.crate_graph(); |
28 | 28 | ||
29 | // populate external prelude | 29 | // populate external prelude |
30 | let mut prelude_is_core = false; | ||
30 | for dep in crate_graph.dependencies(def_map.krate) { | 31 | for dep in crate_graph.dependencies(def_map.krate) { |
31 | let dep_def_map = db.crate_def_map(dep.crate_id); | 32 | let dep_def_map = db.crate_def_map(dep.crate_id); |
32 | log::debug!("crate dep {:?} -> {:?}", dep.name, dep.crate_id); | 33 | log::debug!("crate dep {:?} -> {:?}", dep.name, dep.crate_id); |
@@ -36,10 +37,13 @@ pub(super) fn collect_defs(db: &impl DefDatabase2, mut def_map: CrateDefMap) -> | |||
36 | ); | 37 | ); |
37 | 38 | ||
38 | // look for the prelude | 39 | // look for the prelude |
39 | if def_map.prelude.is_none() { | 40 | // If the prelude is the "core" prelude, try to replace it with a higher |
41 | // level prelude (e.g. "std") if available. | ||
42 | if def_map.prelude.is_none() || prelude_is_core { | ||
40 | let map = db.crate_def_map(dep.crate_id); | 43 | let map = db.crate_def_map(dep.crate_id); |
41 | if map.prelude.is_some() { | 44 | if map.prelude.is_some() { |
42 | def_map.prelude = map.prelude; | 45 | def_map.prelude = map.prelude; |
46 | prelude_is_core = dep.name == "core"; | ||
43 | } | 47 | } |
44 | } | 48 | } |
45 | } | 49 | } |
diff --git a/crates/ra_project_model/src/lib.rs b/crates/ra_project_model/src/lib.rs index 8b8663a78..b1268f29b 100644 --- a/crates/ra_project_model/src/lib.rs +++ b/crates/ra_project_model/src/lib.rs | |||
@@ -199,6 +199,7 @@ impl ProjectWorkspace { | |||
199 | } | 199 | } |
200 | } | 200 | } |
201 | 201 | ||
202 | let libcore = sysroot.core().and_then(|it| sysroot_crates.get(&it).copied()); | ||
202 | let libstd = sysroot.std().and_then(|it| sysroot_crates.get(&it).copied()); | 203 | let libstd = sysroot.std().and_then(|it| sysroot_crates.get(&it).copied()); |
203 | 204 | ||
204 | let mut pkg_to_lib_crate = FxHashMap::default(); | 205 | let mut pkg_to_lib_crate = FxHashMap::default(); |
@@ -226,7 +227,7 @@ impl ProjectWorkspace { | |||
226 | } | 227 | } |
227 | } | 228 | } |
228 | 229 | ||
229 | // Set deps to the std and to the lib target of the current package | 230 | // Set deps to the core, std and to the lib target of the current package |
230 | for &from in pkg_crates.get(&pkg).into_iter().flatten() { | 231 | for &from in pkg_crates.get(&pkg).into_iter().flatten() { |
231 | if let Some(to) = lib_tgt { | 232 | if let Some(to) = lib_tgt { |
232 | if to != from { | 233 | if to != from { |
@@ -240,6 +241,11 @@ impl ProjectWorkspace { | |||
240 | } | 241 | } |
241 | } | 242 | } |
242 | } | 243 | } |
244 | if let Some(core) = libcore { | ||
245 | if let Err(_) = crate_graph.add_dep(from, "core".into(), core) { | ||
246 | log::error!("cyclic dependency on core for {}", pkg.name(&cargo)) | ||
247 | } | ||
248 | } | ||
243 | if let Some(std) = libstd { | 249 | if let Some(std) = libstd { |
244 | if let Err(_) = crate_graph.add_dep(from, "std".into(), std) { | 250 | if let Err(_) = crate_graph.add_dep(from, "std".into(), std) { |
245 | log::error!("cyclic dependency on std for {}", pkg.name(&cargo)) | 251 | log::error!("cyclic dependency on std for {}", pkg.name(&cargo)) |
diff --git a/crates/ra_project_model/src/sysroot.rs b/crates/ra_project_model/src/sysroot.rs index 35d6df5cb..3d827809e 100644 --- a/crates/ra_project_model/src/sysroot.rs +++ b/crates/ra_project_model/src/sysroot.rs | |||
@@ -27,6 +27,10 @@ struct SysrootCrateData { | |||
27 | } | 27 | } |
28 | 28 | ||
29 | impl Sysroot { | 29 | impl Sysroot { |
30 | pub fn core(&self) -> Option<SysrootCrate> { | ||
31 | self.by_name("core") | ||
32 | } | ||
33 | |||
30 | pub fn std(&self) -> Option<SysrootCrate> { | 34 | pub fn std(&self) -> Option<SysrootCrate> { |
31 | self.by_name("std") | 35 | self.by_name("std") |
32 | } | 36 | } |