diff options
author | Aleksey Kladov <[email protected]> | 2019-10-10 15:42:29 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-10-10 15:42:29 +0100 |
commit | 89826a50fc59f271b8b52ae675e145029727aa35 (patch) | |
tree | edbce072fccea11cc7331f5b5dbdca40f6a4bbb4 | |
parent | b36b8970ccefa7c98f827caebf6dda71ff3d99c4 (diff) |
don't special case path attr
-rw-r--r-- | crates/ra_hir/src/attr.rs | 23 | ||||
-rw-r--r-- | crates/ra_hir/src/nameres/collector.rs | 21 | ||||
-rw-r--r-- | crates/ra_hir/src/nameres/raw.rs | 21 |
3 files changed, 31 insertions, 34 deletions
diff --git a/crates/ra_hir/src/attr.rs b/crates/ra_hir/src/attr.rs index f67e80bfd..a0a74ab8c 100644 --- a/crates/ra_hir/src/attr.rs +++ b/crates/ra_hir/src/attr.rs | |||
@@ -64,13 +64,22 @@ impl Attr { | |||
64 | } | 64 | } |
65 | 65 | ||
66 | pub(crate) fn as_cfg(&self) -> Option<&Subtree> { | 66 | pub(crate) fn as_cfg(&self) -> Option<&Subtree> { |
67 | if self.is_simple_atom("cfg") { | 67 | if !self.is_simple_atom("cfg") { |
68 | match &self.input { | 68 | return None; |
69 | Some(AttrInput::TokenTree(subtree)) => Some(subtree), | 69 | } |
70 | _ => None, | 70 | match &self.input { |
71 | } | 71 | Some(AttrInput::TokenTree(subtree)) => Some(subtree), |
72 | } else { | 72 | _ => None, |
73 | None | 73 | } |
74 | } | ||
75 | |||
76 | pub(crate) fn as_path(&self) -> Option<&SmolStr> { | ||
77 | if !self.is_simple_atom("path") { | ||
78 | return None; | ||
79 | } | ||
80 | match &self.input { | ||
81 | Some(AttrInput::Literal(it)) => Some(it), | ||
82 | _ => None, | ||
74 | } | 83 | } |
75 | } | 84 | } |
76 | 85 | ||
diff --git a/crates/ra_hir/src/nameres/collector.rs b/crates/ra_hir/src/nameres/collector.rs index 5dacdb0d9..54514becc 100644 --- a/crates/ra_hir/src/nameres/collector.rs +++ b/crates/ra_hir/src/nameres/collector.rs | |||
@@ -2,7 +2,7 @@ | |||
2 | 2 | ||
3 | use ra_cfg::CfgOptions; | 3 | use ra_cfg::CfgOptions; |
4 | use ra_db::FileId; | 4 | use ra_db::FileId; |
5 | use ra_syntax::ast; | 5 | use ra_syntax::{ast, SmolStr}; |
6 | use rustc_hash::FxHashMap; | 6 | use rustc_hash::FxHashMap; |
7 | use test_utils::tested_by; | 7 | use test_utils::tested_by; |
8 | 8 | ||
@@ -546,7 +546,9 @@ where | |||
546 | for item in items { | 546 | for item in items { |
547 | if self.is_cfg_enabled(item.attrs()) { | 547 | if self.is_cfg_enabled(item.attrs()) { |
548 | match item.kind { | 548 | match item.kind { |
549 | raw::RawItemKind::Module(m) => self.collect_module(&self.raw_items[m]), | 549 | raw::RawItemKind::Module(m) => { |
550 | self.collect_module(&self.raw_items[m], item.attrs()) | ||
551 | } | ||
550 | raw::RawItemKind::Import(import_id) => self | 552 | raw::RawItemKind::Import(import_id) => self |
551 | .def_collector | 553 | .def_collector |
552 | .unresolved_imports | 554 | .unresolved_imports |
@@ -558,10 +560,11 @@ where | |||
558 | } | 560 | } |
559 | } | 561 | } |
560 | 562 | ||
561 | fn collect_module(&mut self, module: &raw::ModuleData) { | 563 | fn collect_module(&mut self, module: &raw::ModuleData, attrs: &[Attr]) { |
564 | let path_attr = self.path_attr(attrs); | ||
562 | match module { | 565 | match module { |
563 | // inline module, just recurse | 566 | // inline module, just recurse |
564 | raw::ModuleData::Definition { name, items, ast_id, attr_path, is_macro_use } => { | 567 | raw::ModuleData::Definition { name, items, ast_id, is_macro_use } => { |
565 | let module_id = | 568 | let module_id = |
566 | self.push_child_module(name.clone(), ast_id.with_file_id(self.file_id), None); | 569 | self.push_child_module(name.clone(), ast_id.with_file_id(self.file_id), None); |
567 | 570 | ||
@@ -570,7 +573,7 @@ where | |||
570 | module_id, | 573 | module_id, |
571 | file_id: self.file_id, | 574 | file_id: self.file_id, |
572 | raw_items: self.raw_items, | 575 | raw_items: self.raw_items, |
573 | mod_dir: self.mod_dir.descend_into_definition(name, attr_path.as_ref()), | 576 | mod_dir: self.mod_dir.descend_into_definition(name, path_attr), |
574 | } | 577 | } |
575 | .collect(&*items); | 578 | .collect(&*items); |
576 | if *is_macro_use { | 579 | if *is_macro_use { |
@@ -578,13 +581,13 @@ where | |||
578 | } | 581 | } |
579 | } | 582 | } |
580 | // out of line module, resolve, parse and recurse | 583 | // out of line module, resolve, parse and recurse |
581 | raw::ModuleData::Declaration { name, ast_id, attr_path, is_macro_use } => { | 584 | raw::ModuleData::Declaration { name, ast_id, is_macro_use } => { |
582 | let ast_id = ast_id.with_file_id(self.file_id); | 585 | let ast_id = ast_id.with_file_id(self.file_id); |
583 | match self.mod_dir.resolve_submodule( | 586 | match self.mod_dir.resolve_submodule( |
584 | self.def_collector.db, | 587 | self.def_collector.db, |
585 | self.file_id, | 588 | self.file_id, |
586 | name, | 589 | name, |
587 | attr_path.as_ref(), | 590 | path_attr, |
588 | ) { | 591 | ) { |
589 | Ok((file_id, mod_dir)) => { | 592 | Ok((file_id, mod_dir)) => { |
590 | let module_id = self.push_child_module(name.clone(), ast_id, Some(file_id)); | 593 | let module_id = self.push_child_module(name.clone(), ast_id, Some(file_id)); |
@@ -713,6 +716,10 @@ where | |||
713 | fn is_cfg_enabled(&self, attrs: &[Attr]) -> bool { | 716 | fn is_cfg_enabled(&self, attrs: &[Attr]) -> bool { |
714 | attrs.iter().all(|attr| attr.is_cfg_enabled(&self.def_collector.cfg_options) != Some(false)) | 717 | attrs.iter().all(|attr| attr.is_cfg_enabled(&self.def_collector.cfg_options) != Some(false)) |
715 | } | 718 | } |
719 | |||
720 | fn path_attr<'a>(&self, attrs: &'a [Attr]) -> Option<&'a SmolStr> { | ||
721 | attrs.iter().find_map(|attr| attr.as_path()) | ||
722 | } | ||
716 | } | 723 | } |
717 | 724 | ||
718 | fn is_macro_rules(path: &Path) -> bool { | 725 | fn is_macro_rules(path: &Path) -> bool { |
diff --git a/crates/ra_hir/src/nameres/raw.rs b/crates/ra_hir/src/nameres/raw.rs index 5f93f920f..469fd8ea7 100644 --- a/crates/ra_hir/src/nameres/raw.rs +++ b/crates/ra_hir/src/nameres/raw.rs | |||
@@ -5,7 +5,7 @@ use std::{ops::Index, sync::Arc}; | |||
5 | use ra_arena::{impl_arena_id, map::ArenaMap, Arena, RawId}; | 5 | use ra_arena::{impl_arena_id, map::ArenaMap, Arena, RawId}; |
6 | use ra_syntax::{ | 6 | use ra_syntax::{ |
7 | ast::{self, AttrsOwner, NameOwner}, | 7 | ast::{self, AttrsOwner, NameOwner}, |
8 | AstNode, AstPtr, SmolStr, SourceFile, | 8 | AstNode, AstPtr, SourceFile, |
9 | }; | 9 | }; |
10 | use test_utils::tested_by; | 10 | use test_utils::tested_by; |
11 | 11 | ||
@@ -152,14 +152,12 @@ pub(super) enum ModuleData { | |||
152 | Declaration { | 152 | Declaration { |
153 | name: Name, | 153 | name: Name, |
154 | ast_id: FileAstId<ast::Module>, | 154 | ast_id: FileAstId<ast::Module>, |
155 | attr_path: Option<SmolStr>, | ||
156 | is_macro_use: bool, | 155 | is_macro_use: bool, |
157 | }, | 156 | }, |
158 | Definition { | 157 | Definition { |
159 | name: Name, | 158 | name: Name, |
160 | ast_id: FileAstId<ast::Module>, | 159 | ast_id: FileAstId<ast::Module>, |
161 | items: Vec<RawItem>, | 160 | items: Vec<RawItem>, |
162 | attr_path: Option<SmolStr>, | ||
163 | is_macro_use: bool, | 161 | is_macro_use: bool, |
164 | }, | 162 | }, |
165 | } | 163 | } |
@@ -295,11 +293,9 @@ impl<DB: AstDatabase> RawItemsCollector<&DB> { | |||
295 | // FIXME: cfg_attr | 293 | // FIXME: cfg_attr |
296 | let is_macro_use = module.has_atom_attr("macro_use"); | 294 | let is_macro_use = module.has_atom_attr("macro_use"); |
297 | if module.has_semi() { | 295 | if module.has_semi() { |
298 | let attr_path = extract_mod_path_attribute(&module); | ||
299 | let item = self.raw_items.modules.alloc(ModuleData::Declaration { | 296 | let item = self.raw_items.modules.alloc(ModuleData::Declaration { |
300 | name, | 297 | name, |
301 | ast_id, | 298 | ast_id, |
302 | attr_path, | ||
303 | is_macro_use, | 299 | is_macro_use, |
304 | }); | 300 | }); |
305 | self.push_item(current_module, attrs, RawItemKind::Module(item)); | 301 | self.push_item(current_module, attrs, RawItemKind::Module(item)); |
@@ -307,12 +303,10 @@ impl<DB: AstDatabase> RawItemsCollector<&DB> { | |||
307 | } | 303 | } |
308 | 304 | ||
309 | if let Some(item_list) = module.item_list() { | 305 | if let Some(item_list) = module.item_list() { |
310 | let attr_path = extract_mod_path_attribute(&module); | ||
311 | let item = self.raw_items.modules.alloc(ModuleData::Definition { | 306 | let item = self.raw_items.modules.alloc(ModuleData::Definition { |
312 | name, | 307 | name, |
313 | ast_id, | 308 | ast_id, |
314 | items: Vec::new(), | 309 | items: Vec::new(), |
315 | attr_path, | ||
316 | is_macro_use, | 310 | is_macro_use, |
317 | }); | 311 | }); |
318 | self.process_module(Some(item), item_list); | 312 | self.process_module(Some(item), item_list); |
@@ -423,16 +417,3 @@ impl<DB: AstDatabase> RawItemsCollector<&DB> { | |||
423 | Attr::from_attrs_owner(self.file_id, item, self.db) | 417 | Attr::from_attrs_owner(self.file_id, item, self.db) |
424 | } | 418 | } |
425 | } | 419 | } |
426 | |||
427 | fn extract_mod_path_attribute(module: &ast::Module) -> Option<SmolStr> { | ||
428 | module.attrs().into_iter().find_map(|attr| { | ||
429 | attr.as_simple_key_value().and_then(|(name, value)| { | ||
430 | let is_path = name == "path"; | ||
431 | if is_path { | ||
432 | Some(value) | ||
433 | } else { | ||
434 | None | ||
435 | } | ||
436 | }) | ||
437 | }) | ||
438 | } | ||