diff options
| author | Aleksey Kladov <[email protected]> | 2018-11-21 13:15:15 +0000 |
|---|---|---|
| committer | Aleksey Kladov <[email protected]> | 2018-11-21 13:15:15 +0000 |
| commit | 8954d4dc67fc3cf519a9855b974846cfcb8c53b2 (patch) | |
| tree | 6e61f614929d51fb35140e1fff9ab670d64f0f41 /crates/ra_analysis/src/descriptors/module | |
| parent | 82c088137abe2ed834433634f0f7641a601a21fd (diff) | |
Introduce Import struct
Diffstat (limited to 'crates/ra_analysis/src/descriptors/module')
| -rw-r--r-- | crates/ra_analysis/src/descriptors/module/nameres.rs | 69 |
1 files changed, 44 insertions, 25 deletions
diff --git a/crates/ra_analysis/src/descriptors/module/nameres.rs b/crates/ra_analysis/src/descriptors/module/nameres.rs index d69cc6e4d..fb315a870 100644 --- a/crates/ra_analysis/src/descriptors/module/nameres.rs +++ b/crates/ra_analysis/src/descriptors/module/nameres.rs | |||
| @@ -43,14 +43,26 @@ pub(crate) struct ModuleScope { | |||
| 43 | #[derive(Debug, Default, PartialEq, Eq)] | 43 | #[derive(Debug, Default, PartialEq, Eq)] |
| 44 | pub(crate) struct InputModuleItems { | 44 | pub(crate) struct InputModuleItems { |
| 45 | items: Vec<ModuleItem>, | 45 | items: Vec<ModuleItem>, |
| 46 | glob_imports: Vec<Path>, | 46 | imports: Vec<Import>, |
| 47 | imports: Vec<Path>, | 47 | } |
| 48 | |||
| 49 | #[derive(Debug, Clone, PartialEq, Eq)] | ||
| 50 | struct Import { | ||
| 51 | path: Path, | ||
| 52 | kind: ImportKind, | ||
| 53 | } | ||
| 54 | |||
| 55 | #[derive(Debug, Clone, PartialEq, Eq)] | ||
| 56 | enum ImportKind { | ||
| 57 | Glob, | ||
| 58 | // TODO: make offset independent | ||
| 59 | Named(LocalSyntaxPtr), | ||
| 48 | } | 60 | } |
| 49 | 61 | ||
| 50 | #[derive(Debug, Clone, PartialEq, Eq)] | 62 | #[derive(Debug, Clone, PartialEq, Eq)] |
| 51 | struct Path { | 63 | struct Path { |
| 52 | kind: PathKind, | 64 | kind: PathKind, |
| 53 | segments: Vec<(LocalSyntaxPtr, SmolStr)>, | 65 | segments: Vec<SmolStr>, |
| 54 | } | 66 | } |
| 55 | 67 | ||
| 56 | #[derive(Debug, Clone, Copy, PartialEq, Eq)] | 68 | #[derive(Debug, Clone, Copy, PartialEq, Eq)] |
| @@ -199,14 +211,15 @@ impl InputModuleItems { | |||
| 199 | self.add_use_tree(prefix.clone(), tree); | 211 | self.add_use_tree(prefix.clone(), tree); |
| 200 | } | 212 | } |
| 201 | } else { | 213 | } else { |
| 202 | if let Some(path) = tree.path() { | 214 | if let Some(ast_path) = tree.path() { |
| 203 | if let Some(path) = convert_path(prefix, path) { | 215 | if let Some(path) = convert_path(prefix, ast_path) { |
| 204 | if tree.has_star() { | 216 | let kind = if tree.has_star() { |
| 205 | &mut self.glob_imports | 217 | ImportKind::Glob |
| 206 | } else { | 218 | } else { |
| 207 | &mut self.imports | 219 | let ptr = LocalSyntaxPtr::new(ast_path.segment().unwrap().syntax()); |
| 208 | } | 220 | ImportKind::Named(ptr) |
| 209 | .push(path); | 221 | }; |
| 222 | self.imports.push(Import { kind, path }) | ||
| 210 | } | 223 | } |
| 211 | } | 224 | } |
| 212 | } | 225 | } |
| @@ -226,8 +239,7 @@ fn convert_path(prefix: Option<Path>, path: ast::Path) -> Option<Path> { | |||
| 226 | kind: PathKind::Abs, | 239 | kind: PathKind::Abs, |
| 227 | segments: Vec::with_capacity(1), | 240 | segments: Vec::with_capacity(1), |
| 228 | }); | 241 | }); |
| 229 | let ptr = LocalSyntaxPtr::new(name.syntax()); | 242 | res.segments.push(name.text()); |
| 230 | res.segments.push((ptr, name.text())); | ||
| 231 | res | 243 | res |
| 232 | } | 244 | } |
| 233 | ast::PathSegmentKind::CrateKw => { | 245 | ast::PathSegmentKind::CrateKw => { |
| @@ -307,14 +319,16 @@ where | |||
| 307 | let mut module_items = ModuleScope::default(); | 319 | let mut module_items = ModuleScope::default(); |
| 308 | 320 | ||
| 309 | for import in input.imports.iter() { | 321 | for import in input.imports.iter() { |
| 310 | if let Some((ptr, name)) = import.segments.last() { | 322 | if let Some(name) = import.path.segments.iter().last() { |
| 311 | module_items.items.insert( | 323 | if let ImportKind::Named(ptr) = import.kind { |
| 312 | name.clone(), | 324 | module_items.items.insert( |
| 313 | Resolution { | 325 | name.clone(), |
| 314 | def_id: None, | 326 | Resolution { |
| 315 | import_name: Some(*ptr), | 327 | def_id: None, |
| 316 | }, | 328 | import_name: Some(ptr), |
| 317 | ); | 329 | }, |
| 330 | ); | ||
| 331 | } | ||
| 318 | } | 332 | } |
| 319 | } | 333 | } |
| 320 | 334 | ||
| @@ -355,8 +369,13 @@ where | |||
| 355 | } | 369 | } |
| 356 | } | 370 | } |
| 357 | 371 | ||
| 358 | fn resolve_import(&mut self, module_id: ModuleId, import: &Path) { | 372 | fn resolve_import(&mut self, module_id: ModuleId, import: &Import) { |
| 359 | let mut curr = match import.kind { | 373 | let ptr = match import.kind { |
| 374 | ImportKind::Glob => return, | ||
| 375 | ImportKind::Named(ptr) => ptr, | ||
| 376 | }; | ||
| 377 | |||
| 378 | let mut curr = match import.path.kind { | ||
| 360 | // TODO: handle extern crates | 379 | // TODO: handle extern crates |
| 361 | PathKind::Abs => return, | 380 | PathKind::Abs => return, |
| 362 | PathKind::Self_ => module_id, | 381 | PathKind::Self_ => module_id, |
| @@ -370,8 +389,8 @@ where | |||
| 370 | PathKind::Crate => module_id.crate_root(&self.module_tree), | 389 | PathKind::Crate => module_id.crate_root(&self.module_tree), |
| 371 | }; | 390 | }; |
| 372 | 391 | ||
| 373 | for (i, (ptr, name)) in import.segments.iter().enumerate() { | 392 | for (i, name) in import.path.segments.iter().enumerate() { |
| 374 | let is_last = i == import.segments.len() - 1; | 393 | let is_last = i == import.path.segments.len() - 1; |
| 375 | 394 | ||
| 376 | let def_id = match self.result.per_module[&curr].items.get(name) { | 395 | let def_id = match self.result.per_module[&curr].items.get(name) { |
| 377 | None => return, | 396 | None => return, |
| @@ -390,7 +409,7 @@ where | |||
| 390 | self.update(module_id, |items| { | 409 | self.update(module_id, |items| { |
| 391 | let res = Resolution { | 410 | let res = Resolution { |
| 392 | def_id: Some(def_id), | 411 | def_id: Some(def_id), |
| 393 | import_name: Some(*ptr), | 412 | import_name: Some(ptr), |
| 394 | }; | 413 | }; |
| 395 | items.items.insert(name.clone(), res); | 414 | items.items.insert(name.clone(), res); |
| 396 | }) | 415 | }) |
