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:
parent
8baa05666c
commit
d634364462
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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))
|
||||
|
Loading…
x
Reference in New Issue
Block a user