diff options
Diffstat (limited to 'crates/ide/src/hover.rs')
-rw-r--r-- | crates/ide/src/hover.rs | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs index 317b6f011..6022bd275 100644 --- a/crates/ide/src/hover.rs +++ b/crates/ide/src/hover.rs | |||
@@ -98,6 +98,7 @@ pub(crate) fn hover( | |||
98 | ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced(sema.db)), | 98 | ast::NameRef(name_ref) => NameRefClass::classify(&sema, &name_ref).map(|d| d.referenced(sema.db)), |
99 | ast::Lifetime(lifetime) => NameClass::classify_lifetime(&sema, &lifetime) | 99 | ast::Lifetime(lifetime) => NameClass::classify_lifetime(&sema, &lifetime) |
100 | .map_or_else(|| NameRefClass::classify_lifetime(&sema, &lifetime).map(|d| d.referenced(sema.db)), |d| d.defined(sema.db)), | 100 | .map_or_else(|| NameRefClass::classify_lifetime(&sema, &lifetime).map(|d| d.referenced(sema.db)), |d| d.defined(sema.db)), |
101 | ast::SelfParam(self_param) => NameClass::classify_self_param(&sema, &self_param).and_then(|d| d.defined(sema.db)), | ||
101 | _ => None, | 102 | _ => None, |
102 | } | 103 | } |
103 | }; | 104 | }; |
@@ -134,17 +135,14 @@ pub(crate) fn hover( | |||
134 | return None; | 135 | return None; |
135 | } | 136 | } |
136 | 137 | ||
137 | let node = token.ancestors().find(|n| { | 138 | let node = token |
138 | ast::Expr::can_cast(n.kind()) | 139 | .ancestors() |
139 | || ast::Pat::can_cast(n.kind()) | 140 | .find(|n| ast::Expr::can_cast(n.kind()) || ast::Pat::can_cast(n.kind()))?; |
140 | || ast::SelfParam::can_cast(n.kind()) | ||
141 | })?; | ||
142 | 141 | ||
143 | let ty = match_ast! { | 142 | let ty = match_ast! { |
144 | match node { | 143 | match node { |
145 | ast::Expr(it) => sema.type_of_expr(&it)?, | 144 | ast::Expr(it) => sema.type_of_expr(&it)?, |
146 | ast::Pat(it) => sema.type_of_pat(&it)?, | 145 | ast::Pat(it) => sema.type_of_pat(&it)?, |
147 | ast::SelfParam(self_param) => sema.type_of_self(&self_param)?, | ||
148 | // If this node is a MACRO_CALL, it means that `descend_into_macros` failed to resolve. | 146 | // If this node is a MACRO_CALL, it means that `descend_into_macros` failed to resolve. |
149 | // (e.g expanding a builtin macro). So we give up here. | 147 | // (e.g expanding a builtin macro). So we give up here. |
150 | ast::MacroCall(_it) => return None, | 148 | ast::MacroCall(_it) => return None, |
@@ -386,7 +384,7 @@ fn pick_best(tokens: TokenAtOffset<SyntaxToken>) -> Option<SyntaxToken> { | |||
386 | return tokens.max_by_key(priority); | 384 | return tokens.max_by_key(priority); |
387 | fn priority(n: &SyntaxToken) -> usize { | 385 | fn priority(n: &SyntaxToken) -> usize { |
388 | match n.kind() { | 386 | match n.kind() { |
389 | IDENT | INT_NUMBER | LIFETIME_IDENT => 3, | 387 | IDENT | INT_NUMBER | LIFETIME_IDENT | T![self] => 3, |
390 | T!['('] | T![')'] => 2, | 388 | T!['('] | T![')'] => 2, |
391 | kind if kind.is_trivia() => 0, | 389 | kind if kind.is_trivia() => 0, |
392 | _ => 1, | 390 | _ => 1, |
@@ -3130,6 +3128,39 @@ fn foo<T: Foo>(t: T$0){} | |||
3130 | } | 3128 | } |
3131 | 3129 | ||
3132 | #[test] | 3130 | #[test] |
3131 | fn test_hover_self_has_go_to_type() { | ||
3132 | check_actions( | ||
3133 | r#" | ||
3134 | struct Foo; | ||
3135 | impl Foo { | ||
3136 | fn foo(&self$0) {} | ||
3137 | } | ||
3138 | "#, | ||
3139 | expect![[r#" | ||
3140 | [ | ||
3141 | GoToType( | ||
3142 | [ | ||
3143 | HoverGotoTypeData { | ||
3144 | mod_path: "test::Foo", | ||
3145 | nav: NavigationTarget { | ||
3146 | file_id: FileId( | ||
3147 | 0, | ||
3148 | ), | ||
3149 | full_range: 0..11, | ||
3150 | focus_range: 7..10, | ||
3151 | name: "Foo", | ||
3152 | kind: Struct, | ||
3153 | description: "struct Foo", | ||
3154 | }, | ||
3155 | }, | ||
3156 | ], | ||
3157 | ), | ||
3158 | ] | ||
3159 | "#]], | ||
3160 | ); | ||
3161 | } | ||
3162 | |||
3163 | #[test] | ||
3133 | fn hover_displays_normalized_crate_names() { | 3164 | fn hover_displays_normalized_crate_names() { |
3134 | check( | 3165 | check( |
3135 | r#" | 3166 | r#" |
@@ -3193,6 +3224,7 @@ impl Foo { | |||
3193 | "#, | 3224 | "#, |
3194 | expect![[r#" | 3225 | expect![[r#" |
3195 | *&self* | 3226 | *&self* |
3227 | |||
3196 | ```rust | 3228 | ```rust |
3197 | &Foo | 3229 | &Foo |
3198 | ``` | 3230 | ``` |
@@ -3212,6 +3244,7 @@ impl Foo { | |||
3212 | "#, | 3244 | "#, |
3213 | expect![[r#" | 3245 | expect![[r#" |
3214 | *self: Arc<Foo>* | 3246 | *self: Arc<Foo>* |
3247 | |||
3215 | ```rust | 3248 | ```rust |
3216 | Arc<Foo> | 3249 | Arc<Foo> |
3217 | ``` | 3250 | ``` |