aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/item_scope.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-12-21 11:38:40 +0000
committerAleksey Kladov <[email protected]>2019-12-21 11:38:40 +0000
commitab7a70fb14d281507b6e6726b47614035b073a28 (patch)
treebecb28dbc24c9772017a84f2e6f02bc15a03475d /crates/ra_hir_def/src/item_scope.rs
parent67ba9072fad8698af4e96b38b8b4acfdd801f7f7 (diff)
Don't track imports
Diffstat (limited to 'crates/ra_hir_def/src/item_scope.rs')
-rw-r--r--crates/ra_hir_def/src/item_scope.rs35
1 files changed, 10 insertions, 25 deletions
diff --git a/crates/ra_hir_def/src/item_scope.rs b/crates/ra_hir_def/src/item_scope.rs
index 6b9be8325..5c14fefff 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()), declaration: false })
34 }) 34 })
35 .collect() 35 .collect()
36}); 36});
@@ -53,11 +53,9 @@ impl ItemScope {
53 } 53 }
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().filter(|(_name, res)| res.declaration).flat_map(|(_name, res)| {
57 .filter_map(|(_name, res)| if res.import.is_none() { Some(res.def) } else { None }) 57 res.def.take_types().into_iter().chain(res.def.take_values().into_iter())
58 .flat_map(|per_ns| { 58 })
59 per_ns.take_types().into_iter().chain(per_ns.take_values().into_iter())
60 })
61 } 59 }
62 60
63 pub fn impls(&self) -> impl Iterator<Item = ImplId> + ExactSizeIterator + '_ { 61 pub fn impls(&self) -> impl Iterator<Item = ImplId> + ExactSizeIterator + '_ {
@@ -112,38 +110,26 @@ impl ItemScope {
112 self.legacy_macros.insert(name, mac); 110 self.legacy_macros.insert(name, mac);
113 } 111 }
114 112
115 pub(crate) fn push_res( 113 pub(crate) fn push_res(&mut self, name: Name, res: &Resolution, declaration: bool) -> bool {
116 &mut self,
117 name: Name,
118 res: &Resolution,
119 import: Option<LocalImportId>,
120 ) -> bool {
121 let mut changed = false; 114 let mut changed = false;
122 let existing = self.items.entry(name.clone()).or_default(); 115 let existing = self.items.entry(name.clone()).or_default();
123 116
124 if existing.def.types.is_none() && res.def.types.is_some() { 117 if existing.def.types.is_none() && res.def.types.is_some() {
125 existing.def.types = res.def.types; 118 existing.def.types = res.def.types;
126 existing.import = import.or(res.import); 119 existing.declaration |= declaration;
127 changed = true; 120 changed = true;
128 } 121 }
129 if existing.def.values.is_none() && res.def.values.is_some() { 122 if existing.def.values.is_none() && res.def.values.is_some() {
130 existing.def.values = res.def.values; 123 existing.def.values = res.def.values;
131 existing.import = import.or(res.import); 124 existing.declaration |= declaration;
132 changed = true; 125 changed = true;
133 } 126 }
134 if existing.def.macros.is_none() && res.def.macros.is_some() { 127 if existing.def.macros.is_none() && res.def.macros.is_some() {
135 existing.def.macros = res.def.macros; 128 existing.def.macros = res.def.macros;
136 existing.import = import.or(res.import); 129 existing.declaration |= declaration;
137 changed = true; 130 changed = true;
138 } 131 }
139 132
140 if existing.def.is_none()
141 && res.def.is_none()
142 && existing.import.is_none()
143 && res.import.is_some()
144 {
145 existing.import = res.import;
146 }
147 changed 133 changed
148 } 134 }
149 135
@@ -160,6 +146,5 @@ impl ItemScope {
160pub struct Resolution { 146pub struct Resolution {
161 /// None for unresolved 147 /// None for unresolved
162 pub def: PerNs, 148 pub def: PerNs,
163 /// ident by which this is imported into local scope. 149 pub declaration: bool,
164 pub import: Option<LocalImportId>,
165} 150}