diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-02-22 11:25:09 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2020-02-22 11:25:09 +0000 |
commit | f9acb4333f7c07969184d64793a84f8ad8efb309 (patch) | |
tree | da6209649e2b775c5e0fcf569f5438e68f678cc3 /crates/ra_hir_def/src/resolver.rs | |
parent | 62ddf617e2d2774744bd376dfb5a17ad4dc9cf19 (diff) | |
parent | 31af774254d1fb4e9105ba050546db16b9b54fb6 (diff) |
Merge #3260
3260: Refactor how builtins are resolved r=matklad a=flodiebold
This fixes autocompletion suggesting e.g. `self::usize`. (I thought we had a bug for that, but I didn't find it.)
Co-authored-by: Florian Diebold <[email protected]>
Diffstat (limited to 'crates/ra_hir_def/src/resolver.rs')
-rw-r--r-- | crates/ra_hir_def/src/resolver.rs | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/crates/ra_hir_def/src/resolver.rs b/crates/ra_hir_def/src/resolver.rs index 5365b80e2..9dd4fa555 100644 --- a/crates/ra_hir_def/src/resolver.rs +++ b/crates/ra_hir_def/src/resolver.rs | |||
@@ -15,7 +15,7 @@ use crate::{ | |||
15 | db::DefDatabase, | 15 | db::DefDatabase, |
16 | expr::{ExprId, PatId}, | 16 | expr::{ExprId, PatId}, |
17 | generics::GenericParams, | 17 | generics::GenericParams, |
18 | item_scope::BuiltinShadowMode, | 18 | item_scope::{BuiltinShadowMode, BUILTIN_SCOPE}, |
19 | nameres::CrateDefMap, | 19 | nameres::CrateDefMap, |
20 | path::{ModPath, PathKind}, | 20 | path::{ModPath, PathKind}, |
21 | per_ns::PerNs, | 21 | per_ns::PerNs, |
@@ -193,7 +193,7 @@ impl Resolver { | |||
193 | return Some((res, idx)); | 193 | return Some((res, idx)); |
194 | } | 194 | } |
195 | Scope::LocalItemsScope(body) => { | 195 | Scope::LocalItemsScope(body) => { |
196 | let def = body.item_scope.get(first_name, BuiltinShadowMode::Other); | 196 | let def = body.item_scope.get(first_name); |
197 | if let Some(res) = to_type_ns(def) { | 197 | if let Some(res) = to_type_ns(def) { |
198 | return Some((res, None)); | 198 | return Some((res, None)); |
199 | } | 199 | } |
@@ -335,8 +335,10 @@ impl Resolver { | |||
335 | }; | 335 | }; |
336 | } | 336 | } |
337 | Scope::LocalItemsScope(body) => { | 337 | Scope::LocalItemsScope(body) => { |
338 | let def = body.item_scope.get(first_name, BuiltinShadowMode::Other); | 338 | // we don't bother looking in the builtin scope here because there are no builtin values |
339 | if let Some(res) = to_value_ns(def) { | 339 | let def = to_value_ns(body.item_scope.get(first_name)); |
340 | |||
341 | if let Some(res) = def { | ||
340 | return Some(ResolveValueResult::ValueNs(res)); | 342 | return Some(ResolveValueResult::ValueNs(res)); |
341 | } | 343 | } |
342 | } | 344 | } |
@@ -476,6 +478,9 @@ impl Scope { | |||
476 | m.crate_def_map.extern_prelude.iter().for_each(|(name, &def)| { | 478 | m.crate_def_map.extern_prelude.iter().for_each(|(name, &def)| { |
477 | f(name.clone(), ScopeDef::PerNs(PerNs::types(def, Visibility::Public))); | 479 | f(name.clone(), ScopeDef::PerNs(PerNs::types(def, Visibility::Public))); |
478 | }); | 480 | }); |
481 | BUILTIN_SCOPE.iter().for_each(|(name, &def)| { | ||
482 | f(name.clone(), ScopeDef::PerNs(def)); | ||
483 | }); | ||
479 | if let Some(prelude) = m.crate_def_map.prelude { | 484 | if let Some(prelude) = m.crate_def_map.prelude { |
480 | let prelude_def_map = db.crate_def_map(prelude.krate); | 485 | let prelude_def_map = db.crate_def_map(prelude.krate); |
481 | prelude_def_map[prelude.local_id].scope.entries().for_each(|(name, def)| { | 486 | prelude_def_map[prelude.local_id].scope.entries().for_each(|(name, def)| { |