aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/item_scope.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_def/src/item_scope.rs')
-rw-r--r--crates/ra_hir_def/src/item_scope.rs28
1 files changed, 9 insertions, 19 deletions
diff --git a/crates/ra_hir_def/src/item_scope.rs b/crates/ra_hir_def/src/item_scope.rs
index 6b9be8325..9e082c5f7 100644
--- a/crates/ra_hir_def/src/item_scope.rs
+++ b/crates/ra_hir_def/src/item_scope.rs
@@ -5,7 +5,7 @@ use hir_expand::name::Name;
5use once_cell::sync::Lazy; 5use once_cell::sync::Lazy;
6use rustc_hash::FxHashMap; 6use rustc_hash::FxHashMap;
7 7
8use crate::{per_ns::PerNs, BuiltinType, ImplId, LocalImportId, MacroDefId, ModuleDefId, TraitId}; 8use crate::{per_ns::PerNs, BuiltinType, ImplId, MacroDefId, ModuleDefId, TraitId};
9 9
10#[derive(Debug, Default, PartialEq, Eq)] 10#[derive(Debug, Default, PartialEq, Eq)]
11pub struct ItemScope { 11pub struct ItemScope {
@@ -30,7 +30,7 @@ static BUILTIN_SCOPE: Lazy<FxHashMap<Name, Resolution>> = Lazy::new(|| {
30 BuiltinType::ALL 30 BuiltinType::ALL
31 .iter() 31 .iter()
32 .map(|(name, ty)| { 32 .map(|(name, ty)| {
33 (name.clone(), Resolution { def: PerNs::types(ty.clone().into()), import: None }) 33 (name.clone(), Resolution { def: PerNs::types(ty.clone().into()), import: false })
34 }) 34 })
35 .collect() 35 .collect()
36}); 36});
@@ -54,7 +54,7 @@ impl ItemScope {
54 54
55 pub fn declarations(&self) -> impl Iterator<Item = ModuleDefId> + '_ { 55 pub fn declarations(&self) -> impl Iterator<Item = ModuleDefId> + '_ {
56 self.entries() 56 self.entries()
57 .filter_map(|(_name, res)| if res.import.is_none() { Some(res.def) } else { None }) 57 .filter_map(|(_name, res)| if !res.import { Some(res.def) } else { None })
58 .flat_map(|per_ns| { 58 .flat_map(|per_ns| {
59 per_ns.take_types().into_iter().chain(per_ns.take_values().into_iter()) 59 per_ns.take_types().into_iter().chain(per_ns.take_values().into_iter())
60 }) 60 })
@@ -112,36 +112,27 @@ impl ItemScope {
112 self.legacy_macros.insert(name, mac); 112 self.legacy_macros.insert(name, mac);
113 } 113 }
114 114
115 pub(crate) fn push_res( 115 pub(crate) fn push_res(&mut self, name: Name, res: &Resolution, import: bool) -> bool {
116 &mut self,
117 name: Name,
118 res: &Resolution,
119 import: Option<LocalImportId>,
120 ) -> bool {
121 let mut changed = false; 116 let mut changed = false;
122 let existing = self.items.entry(name.clone()).or_default(); 117 let existing = self.items.entry(name.clone()).or_default();
123 118
124 if existing.def.types.is_none() && res.def.types.is_some() { 119 if existing.def.types.is_none() && res.def.types.is_some() {
125 existing.def.types = res.def.types; 120 existing.def.types = res.def.types;
126 existing.import = import.or(res.import); 121 existing.import = import || res.import;
127 changed = true; 122 changed = true;
128 } 123 }
129 if existing.def.values.is_none() && res.def.values.is_some() { 124 if existing.def.values.is_none() && res.def.values.is_some() {
130 existing.def.values = res.def.values; 125 existing.def.values = res.def.values;
131 existing.import = import.or(res.import); 126 existing.import = import || res.import;
132 changed = true; 127 changed = true;
133 } 128 }
134 if existing.def.macros.is_none() && res.def.macros.is_some() { 129 if existing.def.macros.is_none() && res.def.macros.is_some() {
135 existing.def.macros = res.def.macros; 130 existing.def.macros = res.def.macros;
136 existing.import = import.or(res.import); 131 existing.import = import || res.import;
137 changed = true; 132 changed = true;
138 } 133 }
139 134
140 if existing.def.is_none() 135 if existing.def.is_none() && res.def.is_none() && !existing.import && res.import {
141 && res.def.is_none()
142 && existing.import.is_none()
143 && res.import.is_some()
144 {
145 existing.import = res.import; 136 existing.import = res.import;
146 } 137 }
147 changed 138 changed
@@ -160,6 +151,5 @@ impl ItemScope {
160pub struct Resolution { 151pub struct Resolution {
161 /// None for unresolved 152 /// None for unresolved
162 pub def: PerNs, 153 pub def: PerNs,
163 /// ident by which this is imported into local scope. 154 pub(crate) import: bool,
164 pub import: Option<LocalImportId>,
165} 155}