Skip to content

Commit 5ca5d52

Browse files
committed
Improve inlay hint resolution reliability
1 parent 13ac53e commit 5ca5d52

20 files changed

+282
-216
lines changed

crates/ide/src/inlay_hints.rs

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

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 {

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(())

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() => {

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
}

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

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(())

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
}

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(())

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(())

crates/ide/src/inlay_hints/generic_param.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ pub(crate) fn hints(
9292
kind: InlayKind::GenericParameter,
9393
label,
9494
text_edit: None,
95+
resolve_parent: Some(node.syntax().text_range()),
9596
})
9697
});
9798

crates/ide/src/inlay_hints/implicit_drop.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
use hir::{
99
db::{DefDatabase as _, HirDatabase as _},
1010
mir::{MirSpan, TerminatorKind},
11-
ChalkTyInterner, DefWithBody, Semantics,
11+
ChalkTyInterner, DefWithBody,
1212
};
13-
use ide_db::{FileRange, RootDatabase};
13+
use ide_db::{famous_defs::FamousDefs, FileRange};
1414

1515
use span::EditionedFileId;
1616
use syntax::{
@@ -22,16 +22,16 @@ use crate::{InlayHint, InlayHintLabel, InlayHintPosition, InlayHintsConfig, Inla
2222

2323
pub(super) fn hints(
2424
acc: &mut Vec<InlayHint>,
25-
sema: &Semantics<'_, RootDatabase>,
25+
FamousDefs(sema, _): &FamousDefs<'_, '_>,
2626
config: &InlayHintsConfig,
2727
file_id: EditionedFileId,
28-
def: &ast::Fn,
28+
node: &ast::Fn,
2929
) -> Option<()> {
3030
if !config.implicit_drop_hints {
3131
return None;
3232
}
3333

34-
let def = sema.to_def(def)?;
34+
let def = sema.to_def(node)?;
3535
let def: DefWithBody = def.into();
3636

3737
let (hir, source_map) = sema.db.body_with_source_map(def.into());
@@ -121,6 +121,7 @@ pub(super) fn hints(
121121
kind: InlayKind::Drop,
122122
label,
123123
text_edit: None,
124+
resolve_parent: Some(node.syntax().text_range()),
124125
})
125126
}
126127
}

crates/ide/src/inlay_hints/implicit_static.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
//! static S: &/* 'static */str = "";
44
//! ```
55
use either::Either;
6+
use ide_db::famous_defs::FamousDefs;
7+
use span::EditionedFileId;
68
use syntax::{
79
ast::{self, AstNode},
810
SyntaxKind,
@@ -12,7 +14,9 @@ use crate::{InlayHint, InlayHintPosition, InlayHintsConfig, InlayKind, LifetimeE
1214

1315
pub(super) fn hints(
1416
acc: &mut Vec<InlayHint>,
17+
FamousDefs(_sema, _): &FamousDefs<'_, '_>,
1518
config: &InlayHintsConfig,
19+
_file_id: EditionedFileId,
1620
statik_or_const: Either<ast::Static, ast::Const>,
1721
) -> Option<()> {
1822
if config.lifetime_elision_hints != LifetimeElisionHints::Always {
@@ -38,6 +42,7 @@ pub(super) fn hints(
3842
position: InlayHintPosition::After,
3943
pad_left: false,
4044
pad_right: true,
45+
resolve_parent: None,
4146
});
4247
}
4348
}

crates/ide/src/inlay_hints/param_name.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ use std::fmt::Display;
77

88
use either::Either;
99
use hir::{Callable, Semantics};
10-
use ide_db::RootDatabase;
10+
use ide_db::{famous_defs::FamousDefs, RootDatabase};
1111

12+
use span::EditionedFileId;
1213
use stdx::to_lower_snake_case;
1314
use syntax::{
1415
ast::{self, AstNode, HasArgList, HasName, UnaryOp},
@@ -19,8 +20,9 @@ use crate::{InlayHint, InlayHintLabel, InlayHintPosition, InlayHintsConfig, Inla
1920

2021
pub(super) fn hints(
2122
acc: &mut Vec<InlayHint>,
22-
sema: &Semantics<'_, RootDatabase>,
23+
FamousDefs(sema, _): &FamousDefs<'_, '_>,
2324
config: &InlayHintsConfig,
25+
_file_id: EditionedFileId,
2426
expr: ast::Expr,
2527
) -> Option<()> {
2628
if !config.parameter_hints {
@@ -60,6 +62,7 @@ pub(super) fn hints(
6062
position: InlayHintPosition::Before,
6163
pad_left: false,
6264
pad_right: true,
65+
resolve_parent: Some(expr.syntax().text_range()),
6366
}
6467
});
6568

crates/ide/src/inlay_hints/range_exclusive.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,17 @@
33
//! for i in 0../* < */10 {}
44
//! if let ../* < */100 = 50 {}
55
//! ```
6+
use ide_db::famous_defs::FamousDefs;
7+
use span::EditionedFileId;
68
use syntax::{ast, SyntaxToken, T};
79

810
use crate::{InlayHint, InlayHintsConfig};
911

1012
pub(super) fn hints(
1113
acc: &mut Vec<InlayHint>,
14+
FamousDefs(_sema, _): &FamousDefs<'_, '_>,
1215
config: &InlayHintsConfig,
16+
_file_id: EditionedFileId,
1317
range: impl ast::RangeItem,
1418
) -> Option<()> {
1519
(config.range_exclusive_hints && range.end().is_some())
@@ -30,6 +34,7 @@ fn inlay_hint(token: SyntaxToken) -> InlayHint {
3034
kind: crate::InlayKind::RangeExclusive,
3135
label: crate::InlayHintLabel::from("<"),
3236
text_edit: None,
37+
resolve_parent: None,
3338
}
3439
}
3540

crates/ide/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -439,12 +439,12 @@ impl Analysis {
439439
&self,
440440
config: &InlayHintsConfig,
441441
file_id: FileId,
442-
position: TextSize,
442+
resolve_range: TextRange,
443443
hash: u64,
444444
hasher: impl Fn(&InlayHint) -> u64 + Send + UnwindSafe,
445445
) -> Cancellable<Option<InlayHint>> {
446446
self.with_db(|db| {
447-
inlay_hints::inlay_hints_resolve(db, file_id, position, hash, config, hasher)
447+
inlay_hints::inlay_hints_resolve(db, file_id, resolve_range, hash, config, hasher)
448448
})
449449
}
450450

crates/rust-analyzer/src/handlers/request.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1602,14 +1602,14 @@ pub(crate) fn handle_inlay_hints_resolve(
16021602
anyhow::ensure!(snap.file_exists(file_id), "Invalid LSP resolve data");
16031603

16041604
let line_index = snap.file_line_index(file_id)?;
1605-
let hint_position = from_proto::offset(&line_index, original_hint.position)?;
1605+
let range = from_proto::text_range(&line_index, resolve_data.resolve_range)?;
16061606

16071607
let mut forced_resolve_inlay_hints_config = snap.config.inlay_hints();
16081608
forced_resolve_inlay_hints_config.fields_to_resolve = InlayFieldsToResolve::empty();
16091609
let resolve_hints = snap.analysis.inlay_hints_resolve(
16101610
&forced_resolve_inlay_hints_config,
16111611
file_id,
1612-
hint_position,
1612+
range,
16131613
hash,
16141614
|hint| {
16151615
std::hash::BuildHasher::hash_one(

crates/rust-analyzer/src/lsp/ext.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -819,6 +819,7 @@ pub struct InlayHintResolveData {
819819
pub file_id: u32,
820820
// This is a string instead of a u64 as javascript can't represent u64 fully
821821
pub hash: String,
822+
pub resolve_range: lsp_types::Range,
822823
pub version: Option<i32>,
823824
}
824825

0 commit comments

Comments
 (0)