@@ -12,12 +12,8 @@ use ide_db::{
12
12
use itertools:: Itertools ;
13
13
use stdx:: format_to;
14
14
use syntax:: {
15
- algo:: { self , find_node_at_range} ,
16
- ast,
17
- display:: fn_as_proc_macro_label,
18
- match_ast, AstNode , AstToken , Direction ,
19
- SyntaxKind :: * ,
20
- SyntaxToken , T ,
15
+ algo, ast, display:: fn_as_proc_macro_label, match_ast, AstNode , AstToken , Direction ,
16
+ SyntaxKind :: * , SyntaxToken , T ,
21
17
} ;
22
18
23
19
use crate :: {
@@ -88,7 +84,15 @@ pub(crate) fn hover(
88
84
let offset = if range. is_empty ( ) {
89
85
range. start ( )
90
86
} else {
91
- let expr = find_node_at_range :: < ast:: Expr > ( & file, range) . map ( Either :: Left ) ?;
87
+ let expr = file. covering_element ( range) . ancestors ( ) . find_map ( |it| {
88
+ match_ast ! {
89
+ match it {
90
+ ast:: Expr ( expr) => Some ( Either :: Left ( expr) ) ,
91
+ ast:: Pat ( pat) => Some ( Either :: Right ( pat) ) ,
92
+ _ => None ,
93
+ }
94
+ }
95
+ } ) ?;
92
96
return hover_type_info ( & sema, config, expr) . map ( |it| RangeInfo :: new ( range, it) ) ;
93
97
} ;
94
98
@@ -4097,15 +4101,42 @@ fn f() { let expr$0 = $0[1, 2, 3, 4] }
4097
4101
}
4098
4102
4099
4103
#[ test]
4100
- fn hover_range_shows_coercions_if_applicable ( ) {
4104
+ fn hover_range_for_pat ( ) {
4105
+ check_hover_range (
4106
+ r#"
4107
+ fn foo() {
4108
+ let $0x$0 = 0;
4109
+ }
4110
+ "# ,
4111
+ expect ! [ [ r#"
4112
+ ```rust
4113
+ i32
4114
+ ```"# ] ] ,
4115
+ ) ;
4116
+
4117
+ check_hover_range (
4118
+ r#"
4119
+ fn foo() {
4120
+ let $0x$0 = "";
4121
+ }
4122
+ "# ,
4123
+ expect ! [ [ r#"
4124
+ ```rust
4125
+ &str
4126
+ ```"# ] ] ,
4127
+ ) ;
4128
+ }
4129
+
4130
+ #[ test]
4131
+ fn hover_range_shows_coercions_if_applicable_expr ( ) {
4101
4132
check_hover_range (
4102
4133
r#"
4103
4134
fn foo() {
4104
4135
let x: &u32 = $0&&&&&0$0;
4105
4136
}
4106
4137
"# ,
4107
4138
expect ! [ [ r#"
4108
- ```
4139
+ ```text
4109
4140
Type: &&&&&u32
4110
4141
Coerced to: &u32
4111
4142
```
@@ -4118,7 +4149,7 @@ fn foo() {
4118
4149
}
4119
4150
"# ,
4120
4151
expect ! [ [ r#"
4121
- ```
4152
+ ```text
4122
4153
Type: &u32
4123
4154
Coerced to: *const u32
4124
4155
```
0 commit comments