diff options
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r-- | crates/ra_hir/src/nameres.rs | 95 |
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 | ||
84 | impl<T> Default for PerNs<T> { | 84 | impl<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 | ||
93 | impl<T> PerNs<T> { | 90 | impl<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); |