diff options
Diffstat (limited to 'crates/ra_hir_def/src/path')
-rw-r--r-- | crates/ra_hir_def/src/path/lower.rs | 6 | ||||
-rw-r--r-- | crates/ra_hir_def/src/path/lower/lower_use.rs | 12 |
2 files changed, 13 insertions, 5 deletions
diff --git a/crates/ra_hir_def/src/path/lower.rs b/crates/ra_hir_def/src/path/lower.rs index c71b52d89..62aafd508 100644 --- a/crates/ra_hir_def/src/path/lower.rs +++ b/crates/ra_hir_def/src/path/lower.rs | |||
@@ -22,6 +22,7 @@ pub(super) use lower_use::lower_use_tree; | |||
22 | /// It correctly handles `$crate` based path from macro call. | 22 | /// It correctly handles `$crate` based path from macro call. |
23 | pub(super) fn lower_path(mut path: ast::Path, hygiene: &Hygiene) -> Option<Path> { | 23 | pub(super) fn lower_path(mut path: ast::Path, hygiene: &Hygiene) -> Option<Path> { |
24 | let mut kind = PathKind::Plain; | 24 | let mut kind = PathKind::Plain; |
25 | let mut type_anchor = None; | ||
25 | let mut segments = Vec::new(); | 26 | let mut segments = Vec::new(); |
26 | let mut generic_args = Vec::new(); | 27 | let mut generic_args = Vec::new(); |
27 | loop { | 28 | loop { |
@@ -63,7 +64,8 @@ pub(super) fn lower_path(mut path: ast::Path, hygiene: &Hygiene) -> Option<Path> | |||
63 | match trait_ref { | 64 | match trait_ref { |
64 | // <T>::foo | 65 | // <T>::foo |
65 | None => { | 66 | None => { |
66 | kind = PathKind::Type(Box::new(self_type)); | 67 | type_anchor = Some(Box::new(self_type)); |
68 | kind = PathKind::Plain; | ||
67 | } | 69 | } |
68 | // <T as Trait<A>>::Foo desugars to Trait<Self=T, A>::Foo | 70 | // <T as Trait<A>>::Foo desugars to Trait<Self=T, A>::Foo |
69 | Some(trait_ref) => { | 71 | Some(trait_ref) => { |
@@ -111,7 +113,7 @@ pub(super) fn lower_path(mut path: ast::Path, hygiene: &Hygiene) -> Option<Path> | |||
111 | segments.reverse(); | 113 | segments.reverse(); |
112 | generic_args.reverse(); | 114 | generic_args.reverse(); |
113 | let mod_path = ModPath { kind, segments }; | 115 | let mod_path = ModPath { kind, segments }; |
114 | return Some(Path { mod_path, generic_args }); | 116 | return Some(Path { type_anchor, mod_path, generic_args }); |
115 | 117 | ||
116 | fn qualifier(path: &ast::Path) -> Option<ast::Path> { | 118 | fn qualifier(path: &ast::Path) -> Option<ast::Path> { |
117 | if let Some(q) = path.qualifier() { | 119 | if let Some(q) = path.qualifier() { |
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 062c02063..3218eaf0a 100644 --- a/crates/ra_hir_def/src/path/lower/lower_use.rs +++ b/crates/ra_hir_def/src/path/lower/lower_use.rs | |||
@@ -9,6 +9,7 @@ use hir_expand::{ | |||
9 | name::{AsName, Name}, | 9 | name::{AsName, Name}, |
10 | }; | 10 | }; |
11 | use ra_syntax::ast::{self, NameOwner}; | 11 | use ra_syntax::ast::{self, NameOwner}; |
12 | use test_utils::tested_by; | ||
12 | 13 | ||
13 | use crate::path::{ModPath, PathKind}; | 14 | use crate::path::{ModPath, PathKind}; |
14 | 15 | ||
@@ -34,6 +35,7 @@ pub(crate) fn lower_use_tree( | |||
34 | } | 35 | } |
35 | } else { | 36 | } else { |
36 | let alias = tree.alias().and_then(|a| a.name()).map(|a| a.as_name()); | 37 | let alias = tree.alias().and_then(|a| a.name()).map(|a| a.as_name()); |
38 | let is_glob = tree.has_star(); | ||
37 | if let Some(ast_path) = tree.path() { | 39 | if let Some(ast_path) = tree.path() { |
38 | // Handle self in a path. | 40 | // Handle self in a path. |
39 | // E.g. `use something::{self, <...>}` | 41 | // E.g. `use something::{self, <...>}` |
@@ -48,11 +50,15 @@ pub(crate) fn lower_use_tree( | |||
48 | } | 50 | } |
49 | } | 51 | } |
50 | if let Some(path) = convert_path(prefix, ast_path, hygiene) { | 52 | if let Some(path) = convert_path(prefix, ast_path, hygiene) { |
51 | let is_glob = tree.has_star(); | ||
52 | cb(path, &tree, is_glob, alias) | 53 | cb(path, &tree, is_glob, alias) |
53 | } | 54 | } |
54 | // FIXME: report errors somewhere | 55 | // FIXME: report errors somewhere |
55 | // We get here if we do | 56 | // We get here if we do |
57 | } else if is_glob { | ||
58 | tested_by!(glob_enum_group); | ||
59 | if let Some(prefix) = prefix { | ||
60 | cb(prefix, &tree, is_glob, None) | ||
61 | } | ||
56 | } | 62 | } |
57 | } | 63 | } |
58 | } | 64 | } |