Skip to content

Commit 9fc8eae

Browse files
committed
Auto merge of rust-lang#18008 - Veykril:inlay-hints-resolve, r=Veykril
internal: Improve inlay hint resolution reliability The payload now ships the range the inlay hint ought to be triggered for instead of trying to estimate it from its position which is somewhat brittle
2 parents 27979ad + be33a2e commit 9fc8eae

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

src/tools/rust-analyzer/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

src/tools/rust-analyzer/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
}

src/tools/rust-analyzer/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
}

src/tools/rust-analyzer/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

src/tools/rust-analyzer/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

src/tools/rust-analyzer/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

src/tools/rust-analyzer/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(

src/tools/rust-analyzer/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)