aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/nameres.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r--crates/ra_hir/src/nameres.rs95
1 files changed, 21 insertions, 74 deletions
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs
index 681aa9a67..b7382d9c3 100644
--- a/crates/ra_hir/src/nameres.rs
+++ b/crates/ra_hir/src/nameres.rs
@@ -83,40 +83,25 @@ pub struct PerNs<T> {
83 83
84impl<T> Default for PerNs<T> { 84impl<T> Default for PerNs<T> {
85 fn default() -> Self { 85 fn default() -> Self {
86 PerNs { 86 PerNs { types: None, values: None }
87 types: None,
88 values: None,
89 }
90 } 87 }
91} 88}
92 89
93impl<T> PerNs<T> { 90impl<T> PerNs<T> {
94 pub fn none() -> PerNs<T> { 91 pub fn none() -> PerNs<T> {
95 PerNs { 92 PerNs { types: None, values: None }
96 types: None,
97 values: None,
98 }
99 } 93 }
100 94
101 pub fn values(t: T) -> PerNs<T> { 95 pub fn values(t: T) -> PerNs<T> {
102 PerNs { 96 PerNs { types: None, values: Some(t) }
103 types: None,
104 values: Some(t),
105 }
106 } 97 }
107 98
108 pub fn types(t: T) -> PerNs<T> { 99 pub fn types(t: T) -> PerNs<T> {
109 PerNs { 100 PerNs { types: Some(t), values: None }
110 types: Some(t),
111 values: None,
112 }
113 } 101 }
114 102
115 pub fn both(types: T, values: T) -> PerNs<T> { 103 pub fn both(types: T, values: T) -> PerNs<T> {
116 PerNs { 104 PerNs { types: Some(types), values: Some(values) }
117 types: Some(types),
118 values: Some(values),
119 }
120 } 105 }
121 106
122 pub fn is_none(&self) -> bool { 107 pub fn is_none(&self) -> bool {
@@ -147,31 +132,19 @@ impl<T> PerNs<T> {
147 } 132 }
148 133
149 pub fn as_ref(&self) -> PerNs<&T> { 134 pub fn as_ref(&self) -> PerNs<&T> {
150 PerNs { 135 PerNs { types: self.types.as_ref(), values: self.values.as_ref() }
151 types: self.types.as_ref(),
152 values: self.values.as_ref(),
153 }
154 } 136 }
155 137
156 pub fn combine(self, other: PerNs<T>) -> PerNs<T> { 138 pub fn combine(self, other: PerNs<T>) -> PerNs<T> {
157 PerNs { 139 PerNs { types: self.types.or(other.types), values: self.values.or(other.values) }
158 types: self.types.or(other.types),
159 values: self.values.or(other.values),
160 }
161 } 140 }
162 141
163 pub fn and_then<U>(self, f: impl Fn(T) -> Option<U>) -> PerNs<U> { 142 pub fn and_then<U>(self, f: impl Fn(T) -> Option<U>) -> PerNs<U> {
164 PerNs { 143 PerNs { types: self.types.and_then(&f), values: self.values.and_then(&f) }
165 types: self.types.and_then(&f),
166 values: self.values.and_then(&f),
167 }
168 } 144 }
169 145
170 pub fn map<U>(self, f: impl Fn(T) -> U) -> PerNs<U> { 146 pub fn map<U>(self, f: impl Fn(T) -> U) -> PerNs<U> {
171 PerNs { 147 PerNs { types: self.types.map(&f), values: self.values.map(&f) }
172 types: self.types.map(&f),
173 values: self.values.map(&f),
174 }
175 } 148 }
176} 149}
177 150
@@ -233,9 +206,7 @@ where
233 for dep in self.krate.dependencies(self.db) { 206 for dep in self.krate.dependencies(self.db) {
234 log::debug!("crate dep {:?} -> {:?}", dep.name, dep.krate); 207 log::debug!("crate dep {:?} -> {:?}", dep.name, dep.krate);
235 if let Some(module) = dep.krate.root_module(self.db) { 208 if let Some(module) = dep.krate.root_module(self.db) {
236 self.result 209 self.result.extern_prelude.insert(dep.name.clone(), module.into());
237 .extern_prelude
238 .insert(dep.name.clone(), module.into());
239 } 210 }
240 } 211 }
241 } 212 }
@@ -245,17 +216,11 @@ where
245 for (import_id, import_data) in input.imports.iter() { 216 for (import_id, import_data) in input.imports.iter() {
246 if let Some(last_segment) = import_data.path.segments.iter().last() { 217 if let Some(last_segment) = import_data.path.segments.iter().last() {
247 if !import_data.is_glob { 218 if !import_data.is_glob {
248 let name = import_data 219 let name =
249 .alias 220 import_data.alias.clone().unwrap_or_else(|| last_segment.name.clone());
250 .clone() 221 module_items
251 .unwrap_or_else(|| last_segment.name.clone()); 222 .items
252 module_items.items.insert( 223 .insert(name, Resolution { def: PerNs::none(), import: Some(import_id) });
253 name,
254 Resolution {
255 def: PerNs::none(),
256 import: Some(import_id),
257 },
258 );
259 } 224 }
260 } 225 }
261 } 226 }
@@ -267,10 +232,7 @@ where
267 232
268 // Populate modules 233 // Populate modules
269 for (name, module_id) in module_id.children(&self.module_tree) { 234 for (name, module_id) in module_id.children(&self.module_tree) {
270 let module = Module { 235 let module = Module { module_id, krate: self.krate };
271 module_id,
272 krate: self.krate,
273 };
274 self.add_module_item(&mut module_items, name, PerNs::types(module.into())); 236 self.add_module_item(&mut module_items, name, PerNs::types(module.into()));
275 } 237 }
276 238
@@ -305,20 +267,13 @@ where
305 if import.is_glob { 267 if import.is_glob {
306 return ReachedFixedPoint::Yes; 268 return ReachedFixedPoint::Yes;
307 }; 269 };
308 let original_module = Module { 270 let original_module = Module { krate: self.krate, module_id };
309 krate: self.krate,
310 module_id,
311 };
312 let (def, reached_fixedpoint) = 271 let (def, reached_fixedpoint) =
313 self.result 272 self.result.resolve_path_fp(self.db, original_module, &import.path);
314 .resolve_path_fp(self.db, original_module, &import.path);
315 273
316 if reached_fixedpoint == ReachedFixedPoint::Yes { 274 if reached_fixedpoint == ReachedFixedPoint::Yes {
317 let last_segment = import.path.segments.last().unwrap(); 275 let last_segment = import.path.segments.last().unwrap();
318 let name = import 276 let name = import.alias.clone().unwrap_or_else(|| last_segment.name.clone());
319 .alias
320 .clone()
321 .unwrap_or_else(|| last_segment.name.clone());
322 log::debug!("resolved import {:?} ({:?}) to {:?}", name, import, def); 277 log::debug!("resolved import {:?} ({:?}) to {:?}", name, import, def);
323 278
324 // extern crates in the crate root are special-cased to insert entries into the extern prelude: rust-lang/rust#54658 279 // extern crates in the crate root are special-cased to insert entries into the extern prelude: rust-lang/rust#54658
@@ -330,10 +285,7 @@ where
330 } 285 }
331 } 286 }
332 self.update(module_id, |items| { 287 self.update(module_id, |items| {
333 let res = Resolution { 288 let res = Resolution { def, import: Some(import_id) };
334 def,
335 import: Some(import_id),
336 };
337 items.items.insert(name, res); 289 items.items.insert(name, res);
338 }); 290 });
339 } 291 }
@@ -358,12 +310,7 @@ impl ItemMap {
358 let module_tree = db.module_tree(krate); 310 let module_tree = db.module_tree(krate);
359 let input = module_tree 311 let input = module_tree
360 .modules() 312 .modules()
361 .map(|module_id| { 313 .map(|module_id| (module_id, db.lower_module_module(Module { krate, module_id })))
362 (
363 module_id,
364 db.lower_module_module(Module { krate, module_id }),
365 )
366 })
367 .collect::<FxHashMap<_, _>>(); 314 .collect::<FxHashMap<_, _>>();
368 315
369 let resolver = Resolver::new(db, &input, krate); 316 let resolver = Resolver::new(db, &input, krate);