aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2020-03-01 13:36:44 +0000
committerGitHub <[email protected]>2020-03-01 13:36:44 +0000
commitea67e2346e64a1a14206e6d0f163c6c2e19d0afb (patch)
tree80a4f5c9b04008df8502ed75b230661fb9041742 /crates/ra_hir_def/src
parent6db2da4993d3956fc7c8ebf152963a132611426a (diff)
parent0057d1e10d1bc94557e94e551079be0c9c281d3f (diff)
Merge #3384
3384: fix #2377 super::super::* r=flodiebold a=JoshMcguigan Thanks @matklad for the detailed explanation on #2377. I believe this fixes it. One thing I'm not sure about is you said the fix would involve changing `crates/ra_hir_def/src/path/lower/lower.rs`, but I only changed `crates/ra_hir_def/src/path/lower/lower_use.rs`. I'm not sure what kind of test code I'd have to write to expose the issue in `lower.rs`, but I'd be happy to add it if you are able to provide additional guidance. closes #2377 Co-authored-by: Josh Mcguigan <[email protected]>
Diffstat (limited to 'crates/ra_hir_def/src')
-rw-r--r--crates/ra_hir_def/src/nameres/tests.rs36
-rw-r--r--crates/ra_hir_def/src/path/lower.rs8
-rw-r--r--crates/ra_hir_def/src/path/lower/lower_use.rs11
3 files changed, 49 insertions, 6 deletions
diff --git a/crates/ra_hir_def/src/nameres/tests.rs b/crates/ra_hir_def/src/nameres/tests.rs
index 82f0f835c..dda5ed699 100644
--- a/crates/ra_hir_def/src/nameres/tests.rs
+++ b/crates/ra_hir_def/src/nameres/tests.rs
@@ -66,6 +66,42 @@ fn crate_def_map_smoke_test() {
66} 66}
67 67
68#[test] 68#[test]
69fn crate_def_map_super_super() {
70 let map = def_map(
71 "
72 //- /lib.rs
73 mod a {
74 const A: usize = 0;
75
76 mod b {
77 const B: usize = 0;
78
79 mod c {
80 use super::super::*;
81 }
82 }
83 }
84 ",
85 );
86 assert_snapshot!(map, @r###"
87 ⋮crate
88 ⋮a: t
89
90 ⋮crate::a
91 ⋮A: v
92 ⋮b: t
93
94 ⋮crate::a::b
95 ⋮B: v
96 ⋮c: t
97
98 ⋮crate::a::b::c
99 ⋮A: v
100 ⋮b: t
101 "###)
102}
103
104#[test]
69fn bogus_paths() { 105fn bogus_paths() {
70 covers!(bogus_paths); 106 covers!(bogus_paths);
71 let map = def_map( 107 let map = def_map(
diff --git a/crates/ra_hir_def/src/path/lower.rs b/crates/ra_hir_def/src/path/lower.rs
index 62aafd508..0934520d7 100644
--- a/crates/ra_hir_def/src/path/lower.rs
+++ b/crates/ra_hir_def/src/path/lower.rs
@@ -101,8 +101,12 @@ pub(super) fn lower_path(mut path: ast::Path, hygiene: &Hygiene) -> Option<Path>
101 break; 101 break;
102 } 102 }
103 ast::PathSegmentKind::SuperKw => { 103 ast::PathSegmentKind::SuperKw => {
104 kind = PathKind::Super(1); 104 let nested_super_count = if let PathKind::Super(n) = kind {
105 break; 105 n
106 } else {
107 0
108 };
109 kind = PathKind::Super(nested_super_count + 1);
106 } 110 }
107 } 111 }
108 path = match qualifier(&path) { 112 path = match qualifier(&path) {
diff --git a/crates/ra_hir_def/src/path/lower/lower_use.rs b/crates/ra_hir_def/src/path/lower/lower_use.rs
index b6d1125e2..278d5196e 100644
--- a/crates/ra_hir_def/src/path/lower/lower_use.rs
+++ b/crates/ra_hir_def/src/path/lower/lower_use.rs
@@ -103,10 +103,13 @@ fn convert_path(prefix: Option<ModPath>, path: ast::Path, hygiene: &Hygiene) ->
103 ModPath::from_segments(PathKind::Super(0), iter::empty()) 103 ModPath::from_segments(PathKind::Super(0), iter::empty())
104 } 104 }
105 ast::PathSegmentKind::SuperKw => { 105 ast::PathSegmentKind::SuperKw => {
106 if prefix.is_some() { 106 let nested_super_count = match prefix.map(|p| p.kind) {
107 return None; 107 Some(PathKind::Super(n)) => n,
108 } 108 Some(_) => return None,
109 ModPath::from_segments(PathKind::Super(1), iter::empty()) 109 None => 0,
110 };
111
112 ModPath::from_segments(PathKind::Super(nested_super_count + 1), iter::empty())
110 } 113 }
111 ast::PathSegmentKind::Type { .. } => { 114 ast::PathSegmentKind::Type { .. } => {
112 // not allowed in imports 115 // not allowed in imports