mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-29 13:25:09 +00:00
Also search for pattern nodes in ranged hover
This commit is contained in:
parent
486603d559
commit
f2d2ce03c7
1 changed files with 41 additions and 10 deletions
|
@ -12,12 +12,8 @@ use ide_db::{
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use stdx::format_to;
|
use stdx::format_to;
|
||||||
use syntax::{
|
use syntax::{
|
||||||
algo::{self, find_node_at_range},
|
algo, ast, display::fn_as_proc_macro_label, match_ast, AstNode, AstToken, Direction,
|
||||||
ast,
|
SyntaxKind::*, SyntaxToken, T,
|
||||||
display::fn_as_proc_macro_label,
|
|
||||||
match_ast, AstNode, AstToken, Direction,
|
|
||||||
SyntaxKind::*,
|
|
||||||
SyntaxToken, T,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -88,7 +84,15 @@ pub(crate) fn hover(
|
||||||
let offset = if range.is_empty() {
|
let offset = if range.is_empty() {
|
||||||
range.start()
|
range.start()
|
||||||
} else {
|
} else {
|
||||||
let expr = find_node_at_range::<ast::Expr>(&file, range).map(Either::Left)?;
|
let expr = file.covering_element(range).ancestors().find_map(|it| {
|
||||||
|
match_ast! {
|
||||||
|
match it {
|
||||||
|
ast::Expr(expr) => Some(Either::Left(expr)),
|
||||||
|
ast::Pat(pat) => Some(Either::Right(pat)),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})?;
|
||||||
return hover_type_info(&sema, config, expr).map(|it| RangeInfo::new(range, it));
|
return hover_type_info(&sema, config, expr).map(|it| RangeInfo::new(range, it));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4097,7 +4101,34 @@ fn f() { let expr$0 = $0[1, 2, 3, 4] }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn hover_range_shows_coercions_if_applicable() {
|
fn hover_range_for_pat() {
|
||||||
|
check_hover_range(
|
||||||
|
r#"
|
||||||
|
fn foo() {
|
||||||
|
let $0x$0 = 0;
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
expect![[r#"
|
||||||
|
```rust
|
||||||
|
i32
|
||||||
|
```"#]],
|
||||||
|
);
|
||||||
|
|
||||||
|
check_hover_range(
|
||||||
|
r#"
|
||||||
|
fn foo() {
|
||||||
|
let $0x$0 = "";
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
expect![[r#"
|
||||||
|
```rust
|
||||||
|
&str
|
||||||
|
```"#]],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn hover_range_shows_coercions_if_applicable_expr() {
|
||||||
check_hover_range(
|
check_hover_range(
|
||||||
r#"
|
r#"
|
||||||
fn foo() {
|
fn foo() {
|
||||||
|
@ -4105,7 +4136,7 @@ fn foo() {
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
```
|
```text
|
||||||
Type: &&&&&u32
|
Type: &&&&&u32
|
||||||
Coerced to: &u32
|
Coerced to: &u32
|
||||||
```
|
```
|
||||||
|
@ -4118,7 +4149,7 @@ fn foo() {
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
```
|
```text
|
||||||
Type: &u32
|
Type: &u32
|
||||||
Coerced to: *const u32
|
Coerced to: *const u32
|
||||||
```
|
```
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue