diff options
author | Matthias Einwag <[email protected]> | 2019-11-09 23:22:19 +0000 |
---|---|---|
committer | Matthias Einwag <[email protected]> | 2019-11-09 23:22:19 +0000 |
commit | 799903ba16dd0d80ca975a2e0e58e81f71ddc023 (patch) | |
tree | 798af5ece778c1630f903753805f163ba6043fd5 /crates/ra_hir_def | |
parent | 9d786ea221b27fbdf7c7f7beea0290db448e0611 (diff) |
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
Diffstat (limited to 'crates/ra_hir_def')
-rw-r--r-- | crates/ra_hir_def/src/nameres/collector.rs | 6 |
1 files changed, 5 insertions, 1 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 | } |