From 1f0e9c149f97eba98a34215a043b81b11f962298 Mon Sep 17 00:00:00 2001 From: Alexander Andreev Date: Sat, 13 Jul 2019 21:26:04 +0300 Subject: More resolution modules with attribute path #1211 --- crates/ra_hir/src/nameres/collector.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'crates/ra_hir/src/nameres/collector.rs') diff --git a/crates/ra_hir/src/nameres/collector.rs b/crates/ra_hir/src/nameres/collector.rs index 552a1b6d9..7eee3cb38 100644 --- a/crates/ra_hir/src/nameres/collector.rs +++ b/crates/ra_hir/src/nameres/collector.rs @@ -84,7 +84,7 @@ struct DefCollector { global_macro_scope: FxHashMap, /// Some macro use `$tt:tt which mean we have to handle the macro perfectly - /// To prevent stackoverflow, we add a deep counter here for prevent that. + /// To prevent stack overflow, we add a deep counter here for prevent that. macro_stack_monitor: MacroStackMonitor, } @@ -497,7 +497,7 @@ where fn collect_module(&mut self, module: &raw::ModuleData) { match module { - // inline module, just recurse + // inline module, just recursive raw::ModuleData::Definition { name, items, ast_id } => { let module_id = self.push_child_module(name.clone(), ast_id.with_file_id(self.file_id), None); @@ -509,7 +509,7 @@ where } .collect(&*items); } - // out of line module, resolve, parse and recurse + // out of line module, resolve, parse and recursive raw::ModuleData::Declaration { name, ast_id, attr_path } => { let ast_id = ast_id.with_file_id(self.file_id); let is_root = self.def_collector.def_map.modules[self.module_id].parent.is_none(); @@ -649,7 +649,8 @@ fn resolve_submodule( let file_dir_mod = dir_path.join(format!("{}/{}.rs", mod_name, name)); let mut candidates = ArrayVec::<[_; 3]>::new(); let file_attr_mod = attr_path.map(|file_path| { - let file_attr_mod = dir_path.join(file_path.to_string()); + let file_path = normalize_attribute_path(file_path); + let file_attr_mod = dir_path.join(file_path).normalize(); candidates.push(file_attr_mod.clone()); file_attr_mod @@ -675,6 +676,17 @@ fn resolve_submodule( } } +fn normalize_attribute_path(file_path: &SmolStr) -> String { + let current_dir = "./"; + + let separator = |path: &str| path.replace("\\", "/"); + if file_path.starts_with(current_dir) { + separator(&file_path[current_dir.len()..]) + } else { + separator(file_path.as_str()) + } +} + #[cfg(test)] mod tests { use ra_db::SourceDatabase; -- cgit v1.2.3 From 22b863c53401971200ed0d94a6f4d9389891c608 Mon Sep 17 00:00:00 2001 From: Alexander Andreev Date: Sat, 13 Jul 2019 21:51:20 +0300 Subject: Fixed comments --- crates/ra_hir/src/nameres/collector.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir/src/nameres/collector.rs') diff --git a/crates/ra_hir/src/nameres/collector.rs b/crates/ra_hir/src/nameres/collector.rs index 7eee3cb38..b8840e37c 100644 --- a/crates/ra_hir/src/nameres/collector.rs +++ b/crates/ra_hir/src/nameres/collector.rs @@ -497,7 +497,7 @@ where fn collect_module(&mut self, module: &raw::ModuleData) { match module { - // inline module, just recursive + // inline module, just recurse raw::ModuleData::Definition { name, items, ast_id } => { let module_id = self.push_child_module(name.clone(), ast_id.with_file_id(self.file_id), None); @@ -509,7 +509,7 @@ where } .collect(&*items); } - // out of line module, resolve, parse and recursive + // out of line module, resolve, parse and recurse raw::ModuleData::Declaration { name, ast_id, attr_path } => { let ast_id = ast_id.with_file_id(self.file_id); let is_root = self.def_collector.def_map.modules[self.module_id].parent.is_none(); -- cgit v1.2.3 From 9c75f30272d8c520089a9937544bb77423b52a5c Mon Sep 17 00:00:00 2001 From: Alexander Andreev Date: Sun, 14 Jul 2019 09:24:18 +0300 Subject: Fixed request comments --- crates/ra_hir/src/nameres/collector.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'crates/ra_hir/src/nameres/collector.rs') diff --git a/crates/ra_hir/src/nameres/collector.rs b/crates/ra_hir/src/nameres/collector.rs index b8840e37c..7f765caf3 100644 --- a/crates/ra_hir/src/nameres/collector.rs +++ b/crates/ra_hir/src/nameres/collector.rs @@ -1,3 +1,5 @@ +use std::borrow::Cow; + use arrayvec::ArrayVec; use ra_db::FileId; use ra_syntax::{ast, SmolStr}; @@ -650,7 +652,7 @@ fn resolve_submodule( let mut candidates = ArrayVec::<[_; 3]>::new(); let file_attr_mod = attr_path.map(|file_path| { let file_path = normalize_attribute_path(file_path); - let file_attr_mod = dir_path.join(file_path).normalize(); + let file_attr_mod = dir_path.join(file_path.as_ref()).normalize(); candidates.push(file_attr_mod.clone()); file_attr_mod @@ -676,14 +678,18 @@ fn resolve_submodule( } } -fn normalize_attribute_path(file_path: &SmolStr) -> String { +fn normalize_attribute_path(file_path: &SmolStr) -> Cow { let current_dir = "./"; - - let separator = |path: &str| path.replace("\\", "/"); - if file_path.starts_with(current_dir) { - separator(&file_path[current_dir.len()..]) + let windows_path_separator = r#"\"#; + let current_dir_normalize = if file_path.starts_with(current_dir) { + &file_path[current_dir.len()..] + } else { + file_path.as_str() + }; + if current_dir_normalize.contains(windows_path_separator) { + Cow::Owned(current_dir_normalize.replace(windows_path_separator, "/")) } else { - separator(file_path.as_str()) + Cow::Borrowed(current_dir_normalize) } } -- cgit v1.2.3