Skip to content

Commit be33a2e

Browse files
committed
Improve inlay hint resolution reliability
1 parent e77de38 commit be33a2e

20 files changed

+282
-216
lines changed

src/tools/rust-analyzer/crates/ide/src/inlay_hints.rs

Lines changed: 211 additions & 187 deletions
Large diffs are not rendered by default.

src/tools/rust-analyzer/crates/ide/src/inlay_hints/adjustment.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66
use either::Either;
77
use hir::{
88
Adjust, Adjustment, AutoBorrow, HirDisplay, Mutability, OverloadedDeref, PointerCast, Safety,
9-
Semantics,
109
};
11-
use ide_db::RootDatabase;
10+
use ide_db::famous_defs::FamousDefs;
1211

1312
use span::EditionedFileId;
1413
use stdx::never;
@@ -24,7 +23,7 @@ use crate::{
2423

2524
pub(super) fn hints(
2625
acc: &mut Vec<InlayHint>,
27-
sema: &Semantics<'_, RootDatabase>,
26+
FamousDefs(sema, _): &FamousDefs<'_, '_>,
2827
config: &InlayHintsConfig,
2928
file_id: EditionedFileId,
3029
expr: &ast::Expr,
@@ -156,6 +155,7 @@ pub(super) fn hints(
156155
kind: InlayKind::Adjustment,
157156
label,
158157
text_edit: None,
158+
resolve_parent: Some(expr.syntax().text_range()),
159159
});
160160
}
161161
if !postfix && needs_inner_parens {

src/tools/rust-analyzer/crates/ide/src/inlay_hints/bind_pat.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ pub(super) fn hints(
110110
position: InlayHintPosition::After,
111111
pad_left: !render_colons,
112112
pad_right: false,
113+
resolve_parent: Some(pat.syntax().text_range()),
113114
});
114115

115116
Some(())

src/tools/rust-analyzer/crates/ide/src/inlay_hints/binding_mode.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@
22
//! ```no_run
33
//! let /* & */ (/* ref */ x,) = &(0,);
44
//! ```
5-
use hir::{Mutability, Semantics};
6-
use ide_db::RootDatabase;
5+
use hir::Mutability;
6+
use ide_db::famous_defs::FamousDefs;
77

8+
use span::EditionedFileId;
89
use syntax::ast::{self, AstNode};
910

1011
use crate::{InlayHint, InlayHintPosition, InlayHintsConfig, InlayKind};
1112

1213
pub(super) fn hints(
1314
acc: &mut Vec<InlayHint>,
14-
sema: &Semantics<'_, RootDatabase>,
15+
FamousDefs(sema, _): &FamousDefs<'_, '_>,
1516
config: &InlayHintsConfig,
17+
_file_id: EditionedFileId,
1618
pat: &ast::Pat,
1719
) -> Option<()> {
1820
if !config.binding_mode_hints {
@@ -57,6 +59,7 @@ pub(super) fn hints(
5759
position: InlayHintPosition::Before,
5860
pad_left: false,
5961
pad_right: mut_reference,
62+
resolve_parent: Some(pat.syntax().text_range()),
6063
});
6164
});
6265
match pat {
@@ -75,6 +78,7 @@ pub(super) fn hints(
7578
position: InlayHintPosition::Before,
7679
pad_left: false,
7780
pad_right: true,
81+
resolve_parent: Some(pat.syntax().text_range()),
7882
});
7983
}
8084
ast::Pat::OrPat(pat) if !pattern_adjustments.is_empty() && outer_paren_pat.is_none() => {

src/tools/rust-analyzer/crates/ide/src/inlay_hints/chaining.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ pub(super) fn hints(
6767
position: InlayHintPosition::After,
6868
pad_left: true,
6969
pad_right: false,
70+
resolve_parent: Some(expr.syntax().text_range()),
7071
});
7172
}
7273
}

src/tools/rust-analyzer/crates/ide/src/inlay_hints/closing_brace.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@ pub(super) fn hints(
1818
sema: &Semantics<'_, RootDatabase>,
1919
config: &InlayHintsConfig,
2020
file_id: EditionedFileId,
21-
mut node: SyntaxNode,
21+
original_node: SyntaxNode,
2222
) -> Option<()> {
2323
let min_lines = config.closing_brace_hints_min_lines?;
2424

2525
let name = |it: ast::Name| it.syntax().text_range();
2626

27+
let mut node = original_node.clone();
2728
let mut closing_token;
2829
let (label, name_range) = if let Some(item_list) = ast::AssocItemList::cast(node.clone()) {
2930
closing_token = item_list.r_curly_token()?;
@@ -145,6 +146,7 @@ pub(super) fn hints(
145146
position: InlayHintPosition::After,
146147
pad_left: true,
147148
pad_right: false,
149+
resolve_parent: Some(original_node.text_range()),
148150
});
149151

150152
None

src/tools/rust-analyzer/crates/ide/src/inlay_hints/closure_captures.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ pub(super) fn hints(
4040
position: InlayHintPosition::After,
4141
pad_left: false,
4242
pad_right: false,
43+
resolve_parent: Some(closure.syntax().text_range()),
4344
});
4445
range
4546
}
@@ -52,6 +53,7 @@ pub(super) fn hints(
5253
position: InlayHintPosition::After,
5354
pad_left: false,
5455
pad_right: false,
56+
resolve_parent: None,
5557
});
5658
let last = captures.len() - 1;
5759
for (idx, capture) in captures.into_iter().enumerate() {
@@ -85,6 +87,7 @@ pub(super) fn hints(
8587
position: InlayHintPosition::After,
8688
pad_left: false,
8789
pad_right: false,
90+
resolve_parent: Some(closure.syntax().text_range()),
8891
});
8992

9093
if idx != last {
@@ -96,6 +99,7 @@ pub(super) fn hints(
9699
position: InlayHintPosition::After,
97100
pad_left: false,
98101
pad_right: false,
102+
resolve_parent: None,
99103
});
100104
}
101105
}
@@ -107,6 +111,7 @@ pub(super) fn hints(
107111
position: InlayHintPosition::After,
108112
pad_left: false,
109113
pad_right: true,
114+
resolve_parent: None,
110115
});
111116

112117
Some(())

src/tools/rust-analyzer/crates/ide/src/inlay_hints/closure_ret.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ pub(super) fn hints(
7272
position: InlayHintPosition::After,
7373
pad_left: false,
7474
pad_right: false,
75+
resolve_parent: Some(closure.syntax().text_range()),
7576
});
7677
Some(())
7778
}

src/tools/rust-analyzer/crates/ide/src/inlay_hints/discriminant.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,15 @@ pub(super) fn enum_hints(
3535
return None;
3636
}
3737
for variant in enum_.variant_list()?.variants() {
38-
variant_hints(acc, sema, &variant);
38+
variant_hints(acc, sema, &enum_, &variant);
3939
}
4040
Some(())
4141
}
4242

4343
fn variant_hints(
4444
acc: &mut Vec<InlayHint>,
4545
sema: &Semantics<'_, RootDatabase>,
46+
enum_: &ast::Enum,
4647
variant: &ast::Variant,
4748
) -> Option<()> {
4849
if variant.expr().is_some() {
@@ -90,6 +91,7 @@ fn variant_hints(
9091
position: InlayHintPosition::After,
9192
pad_left: false,
9293
pad_right: false,
94+
resolve_parent: Some(enum_.syntax().text_range()),
9395
});
9496

9597
Some(())

src/tools/rust-analyzer/crates/ide/src/inlay_hints/fn_lifetime_fn.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
//! ```no_run
33
//! fn example/* <'0> */(a: &/* '0 */()) {}
44
//! ```
5-
use ide_db::{syntax_helpers::node_ext::walk_ty, FxHashMap};
5+
use ide_db::{famous_defs::FamousDefs, syntax_helpers::node_ext::walk_ty, FxHashMap};
66
use itertools::Itertools;
7+
use span::EditionedFileId;
78
use syntax::{
89
ast::{self, AstNode, HasGenericParams, HasName},
910
SyntaxToken,
@@ -14,7 +15,9 @@ use crate::{InlayHint, InlayHintPosition, InlayHintsConfig, InlayKind, LifetimeE
1415

1516
pub(super) fn hints(
1617
acc: &mut Vec<InlayHint>,
18+
FamousDefs(_, _): &FamousDefs<'_, '_>,
1719
config: &InlayHintsConfig,
20+
_file_id: EditionedFileId,
1821
func: ast::Fn,
1922
) -> Option<()> {
2023
if config.lifetime_elision_hints == LifetimeElisionHints::Never {
@@ -29,6 +32,7 @@ pub(super) fn hints(
2932
position: InlayHintPosition::After,
3033
pad_left: false,
3134
pad_right: true,
35+
resolve_parent: None,
3236
};
3337

3438
let param_list = func.param_list()?;
@@ -195,6 +199,7 @@ pub(super) fn hints(
195199
position: InlayHintPosition::After,
196200
pad_left: false,
197201
pad_right: true,
202+
resolve_parent: None,
198203
});
199204
}
200205
(None, allocated_lifetimes) => acc.push(InlayHint {
@@ -205,6 +210,7 @@ pub(super) fn hints(
205210
position: InlayHintPosition::After,
206211
pad_left: false,
207212
pad_right: false,
213+
resolve_parent: None,
208214
}),
209215
}
210216
Some(())

0 commit comments

Comments
 (0)