Resolve core types

This adds support for completion and goto definition of
types defined within the "core" crate. The core crate is
added as a dependency to each crate in the project.

The core crate exported it's own prelude. This caused
now all crates to inherit the core crates prelude instead
of the std crates. In order to avoid the problem the
prelude resolution has been changed to overwrite
an already resolved prelude if this was set to a crate
named core - in order to pick a better prelude like std.

Fixes #2199
This commit is contained in:
Matthias Einwag 2019-11-09 15:22:19 -08:00
parent 9d786ea221
commit 799903ba16
3 changed files with 16 additions and 2 deletions

View file

@ -199,6 +199,7 @@ impl ProjectWorkspace {
}
}
let libcore = sysroot.core().and_then(|it| sysroot_crates.get(&it).copied());
let libstd = sysroot.std().and_then(|it| sysroot_crates.get(&it).copied());
let mut pkg_to_lib_crate = FxHashMap::default();
@ -226,7 +227,7 @@ impl ProjectWorkspace {
}
}
// Set deps to the std and to the lib target of the current package
// Set deps to the core, std and to the lib target of the current package
for &from in pkg_crates.get(&pkg).into_iter().flatten() {
if let Some(to) = lib_tgt {
if to != from {
@ -240,6 +241,11 @@ impl ProjectWorkspace {
}
}
}
if let Some(core) = libcore {
if let Err(_) = crate_graph.add_dep(from, "core".into(), core) {
log::error!("cyclic dependency on core for {}", pkg.name(&cargo))
}
}
if let Some(std) = libstd {
if let Err(_) = crate_graph.add_dep(from, "std".into(), std) {
log::error!("cyclic dependency on std for {}", pkg.name(&cargo))