Overwrite the prelude with one defined in a later dependency

This removes the special casing for the "core" prelude.
Whenever a later dependency also exports a prelude, it will replace
the formerly imported prelude.  The utilized prelude then depends
purely on import order.
This commit is contained in:
Matthias Einwag 2019-11-10 13:15:47 -08:00
parent 8baa05666c
commit d634364462
2 changed files with 8 additions and 9 deletions

View file

@ -27,7 +27,6 @@ pub(super) fn collect_defs(db: &impl DefDatabase2, mut def_map: CrateDefMap) ->
let crate_graph = db.crate_graph();
// populate external prelude
let mut prelude_is_core = false;
for dep in crate_graph.dependencies(def_map.krate) {
let dep_def_map = db.crate_def_map(dep.crate_id);
log::debug!("crate dep {:?} -> {:?}", dep.name, dep.crate_id);
@ -37,14 +36,12 @@ pub(super) fn collect_defs(db: &impl DefDatabase2, mut def_map: CrateDefMap) ->
);
// look for the prelude
// If the prelude is the "core" prelude, try to replace it with a higher
// level prelude (e.g. "std") if available.
if def_map.prelude.is_none() || prelude_is_core {
let map = db.crate_def_map(dep.crate_id);
if map.prelude.is_some() {
def_map.prelude = map.prelude;
prelude_is_core = dep.name == "core";
}
// If the dependency defines a prelude, we overwrite an already defined
// prelude. This is necessary to import the "std" prelude if a crate
// depends on both "core" and "std".
let dep_def_map = db.crate_def_map(dep.crate_id);
if dep_def_map.prelude.is_some() {
def_map.prelude = dep_def_map.prelude;
}
}

View file

@ -241,6 +241,8 @@ impl ProjectWorkspace {
}
}
}
// core is added as a dependency before std in order to
// mimic rustcs dependency order
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))