aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/ra_hir/src/marks.rs1
-rw-r--r--crates/ra_hir/src/nameres/collector.rs24
-rw-r--r--crates/ra_hir/src/nameres/tests.rs26
-rw-r--r--crates/test_utils/src/marks.rs4
4 files changed, 43 insertions, 12 deletions
diff --git a/crates/ra_hir/src/marks.rs b/crates/ra_hir/src/marks.rs
index e8f3005f1..bbf57004d 100644
--- a/crates/ra_hir/src/marks.rs
+++ b/crates/ra_hir/src/marks.rs
@@ -1,4 +1,5 @@
1test_utils::marks!( 1test_utils::marks!(
2 bogus_paths
2 name_res_works_for_broken_modules 3 name_res_works_for_broken_modules
3 can_import_enum_variant 4 can_import_enum_variant
4 type_var_cycles_resolve_completely 5 type_var_cycles_resolve_completely
diff --git a/crates/ra_hir/src/nameres/collector.rs b/crates/ra_hir/src/nameres/collector.rs
index cbe850ba4..e7afc34c9 100644
--- a/crates/ra_hir/src/nameres/collector.rs
+++ b/crates/ra_hir/src/nameres/collector.rs
@@ -213,18 +213,22 @@ where
213 } 213 }
214 } 214 }
215 } else { 215 } else {
216 let last_segment = import.path.segments.last().unwrap(); 216 match import.path.segments.last() {
217 let name = import.alias.clone().unwrap_or_else(|| last_segment.name.clone()); 217 Some(last_segment) => {
218 log::debug!("resolved import {:?} ({:?}) to {:?}", name, import, def); 218 let name = import.alias.clone().unwrap_or_else(|| last_segment.name.clone());
219 219 log::debug!("resolved import {:?} ({:?}) to {:?}", name, import, def);
220 // extern crates in the crate root are special-cased to insert entries into the extern prelude: rust-lang/rust#54658 220
221 if import.is_extern_crate && module_id == self.def_map.root { 221 // extern crates in the crate root are special-cased to insert entries into the extern prelude: rust-lang/rust#54658
222 if let Some(def) = def.take_types() { 222 if import.is_extern_crate && module_id == self.def_map.root {
223 self.def_map.extern_prelude.insert(name.clone(), def); 223 if let Some(def) = def.take_types() {
224 self.def_map.extern_prelude.insert(name.clone(), def);
225 }
226 }
227 let resolution = Resolution { def, import: Some(import_id) };
228 self.update(module_id, Some(import_id), &[(name, resolution)]);
224 } 229 }
230 None => tested_by!(bogus_paths),
225 } 231 }
226 let resolution = Resolution { def, import: Some(import_id) };
227 self.update(module_id, Some(import_id), &[(name, resolution)]);
228 } 232 }
229 } 233 }
230 234
diff --git a/crates/ra_hir/src/nameres/tests.rs b/crates/ra_hir/src/nameres/tests.rs
index 36c1d74ce..f73f9d8a6 100644
--- a/crates/ra_hir/src/nameres/tests.rs
+++ b/crates/ra_hir/src/nameres/tests.rs
@@ -97,6 +97,32 @@ E: t
97} 97}
98 98
99#[test] 99#[test]
100fn bogus_paths() {
101 covers!(bogus_paths);
102 let map = def_map(
103 "
104 //- /lib.rs
105 mod foo;
106 struct S;
107 use self;
108
109 //- /foo/mod.rs
110 use super;
111 use crate;
112
113 ",
114 );
115 assert_snapshot_matches!(map, @r###"
116crate
117foo: t
118S: t v
119
120crate::foo
121"###
122 )
123}
124
125#[test]
100fn use_as() { 126fn use_as() {
101 let map = def_map( 127 let map = def_map(
102 " 128 "
diff --git a/crates/test_utils/src/marks.rs b/crates/test_utils/src/marks.rs
index 107432926..1c268b49c 100644
--- a/crates/test_utils/src/marks.rs
+++ b/crates/test_utils/src/marks.rs
@@ -30,13 +30,13 @@ use std::sync::atomic::{AtomicUsize, Ordering};
30 30
31#[macro_export] 31#[macro_export]
32macro_rules! tested_by { 32macro_rules! tested_by {
33 ($ident:ident) => { 33 ($ident:ident) => {{
34 #[cfg(test)] 34 #[cfg(test)]
35 { 35 {
36 // sic! use call-site crate 36 // sic! use call-site crate
37 crate::marks::$ident.fetch_add(1, std::sync::atomic::Ordering::SeqCst); 37 crate::marks::$ident.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
38 } 38 }
39 }; 39 }};
40} 40}
41 41
42#[macro_export] 42#[macro_export]