Skip to content

Commit c1e3da3

Browse files
committed
Remove unnecessary parameters in inlay-hint computation
1 parent 23f79c1 commit c1e3da3

File tree

10 files changed

+41
-58
lines changed

10 files changed

+41
-58
lines changed

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

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::{
66
use either::Either;
77
use hir::{
88
ClosureStyle, DisplayTarget, EditionedFileId, HasVisibility, HirDisplay, HirDisplayError,
9-
HirWrite, ModuleDef, ModuleDefId, Semantics, sym,
9+
HirWrite, InRealFile, ModuleDef, ModuleDefId, Semantics, sym,
1010
};
1111
use ide_db::{FileRange, RootDatabase, famous_defs::FamousDefs, text_edit::TextEditBuilder};
1212
use ide_db::{FxHashSet, text_edit::TextEdit};
@@ -95,16 +95,16 @@ pub(crate) fn inlay_hints(
9595
return acc;
9696
};
9797
let famous_defs = FamousDefs(&sema, scope.krate());
98+
let display_target = famous_defs.1.to_display_target(sema.db);
9899

99100
let ctx = &mut InlayHintCtx::default();
100101
let mut hints = |event| {
101102
if let Some(node) = handle_event(ctx, event) {
102-
hints(&mut acc, ctx, &famous_defs, config, file_id, node);
103+
hints(&mut acc, ctx, &famous_defs, config, file_id, display_target, node);
103104
}
104105
};
105106
let mut preorder = file.preorder();
106107
while let Some(event) = preorder.next() {
107-
// FIXME: This can miss some hints that require the parent of the range to calculate
108108
if matches!((&event, range_limit), (WalkEvent::Enter(node), Some(range)) if range.intersect(node.text_range()).is_none())
109109
{
110110
preorder.skip_subtree();
@@ -144,10 +144,12 @@ pub(crate) fn inlay_hints_resolve(
144144
let famous_defs = FamousDefs(&sema, scope.krate());
145145
let mut acc = Vec::new();
146146

147+
let display_target = famous_defs.1.to_display_target(sema.db);
148+
147149
let ctx = &mut InlayHintCtx::default();
148150
let mut hints = |event| {
149151
if let Some(node) = handle_event(ctx, event) {
150-
hints(&mut acc, ctx, &famous_defs, config, file_id, node);
152+
hints(&mut acc, ctx, &famous_defs, config, file_id, display_target, node);
151153
}
152154
};
153155

@@ -202,17 +204,19 @@ fn handle_event(ctx: &mut InlayHintCtx, node: WalkEvent<SyntaxNode>) -> Option<S
202204
fn hints(
203205
hints: &mut Vec<InlayHint>,
204206
ctx: &mut InlayHintCtx,
205-
famous_defs @ FamousDefs(sema, _): &FamousDefs<'_, '_>,
207+
famous_defs @ FamousDefs(sema, _krate): &FamousDefs<'_, '_>,
206208
config: &InlayHintsConfig,
207209
file_id: EditionedFileId,
210+
display_target: DisplayTarget,
208211
node: SyntaxNode,
209212
) {
210-
let file_id = file_id.editioned_file_id(sema.db);
211-
let Some(krate) = sema.first_crate(file_id.file_id()) else {
212-
return;
213-
};
214-
let display_target = krate.to_display_target(sema.db);
215-
closing_brace::hints(hints, sema, config, file_id, display_target, node.clone());
213+
closing_brace::hints(
214+
hints,
215+
sema,
216+
config,
217+
display_target,
218+
InRealFile { file_id, value: node.clone() },
219+
);
216220
if let Some(any_has_generic_args) = ast::AnyHasGenericArgs::cast(node.clone()) {
217221
generic_param::hints(hints, famous_defs, config, any_has_generic_args);
218222
}
@@ -231,49 +235,52 @@ fn hints(
231235
closure_captures::hints(hints, famous_defs, config, it.clone());
232236
closure_ret::hints(hints, famous_defs, config, display_target, it)
233237
},
234-
ast::Expr::RangeExpr(it) => range_exclusive::hints(hints, famous_defs, config, file_id, it),
238+
ast::Expr::RangeExpr(it) => range_exclusive::hints(hints, famous_defs, config, it),
235239
_ => Some(()),
236240
}
237241
},
238242
ast::Pat(it) => {
239-
binding_mode::hints(hints, famous_defs, config, file_id, &it);
243+
binding_mode::hints(hints, famous_defs, config, &it);
240244
match it {
241245
ast::Pat::IdentPat(it) => {
242246
bind_pat::hints(hints, famous_defs, config, display_target, &it);
243247
}
244248
ast::Pat::RangePat(it) => {
245-
range_exclusive::hints(hints, famous_defs, config, file_id, it);
249+
range_exclusive::hints(hints, famous_defs, config, it);
246250
}
247251
_ => {}
248252
}
249253
Some(())
250254
},
251255
ast::Item(it) => match it {
252256
ast::Item::Fn(it) => {
253-
implicit_drop::hints(hints, famous_defs, config, file_id, &it);
257+
implicit_drop::hints(hints, famous_defs, config, display_target, &it);
254258
if let Some(extern_block) = &ctx.extern_block_parent {
255-
extern_block::fn_hints(hints, famous_defs, config, file_id, &it, extern_block);
259+
extern_block::fn_hints(hints, famous_defs, config, &it, extern_block);
256260
}
257-
lifetime::fn_hints(hints, ctx, famous_defs, config, file_id, it)
261+
lifetime::fn_hints(hints, ctx, famous_defs, config, it)
258262
},
259263
ast::Item::Static(it) => {
260264
if let Some(extern_block) = &ctx.extern_block_parent {
261-
extern_block::static_hints(hints, famous_defs, config, file_id, &it, extern_block);
265+
extern_block::static_hints(hints, famous_defs, config, &it, extern_block);
262266
}
263-
implicit_static::hints(hints, famous_defs, config, file_id, Either::Left(it))
267+
implicit_static::hints(hints, famous_defs, config, Either::Left(it))
264268
},
265-
ast::Item::Const(it) => implicit_static::hints(hints, famous_defs, config, file_id, Either::Right(it)),
266-
ast::Item::Enum(it) => discriminant::enum_hints(hints, famous_defs, config, file_id, it),
267-
ast::Item::ExternBlock(it) => extern_block::extern_block_hints(hints, famous_defs, config, file_id, it),
269+
ast::Item::Const(it) => implicit_static::hints(hints, famous_defs, config, Either::Right(it)),
270+
ast::Item::Enum(it) => discriminant::enum_hints(hints, famous_defs, config, it),
271+
ast::Item::ExternBlock(it) => extern_block::extern_block_hints(hints, famous_defs, config, it),
268272
_ => None,
269273
},
270274
// FIXME: trait object type elisions
271275
ast::Type(ty) => match ty {
272-
ast::Type::FnPtrType(ptr) => lifetime::fn_ptr_hints(hints, ctx, famous_defs, config, file_id, ptr),
273-
ast::Type::PathType(path) => lifetime::fn_path_hints(hints, ctx, famous_defs, config, file_id, path),
276+
ast::Type::FnPtrType(ptr) => lifetime::fn_ptr_hints(hints, ctx, famous_defs, config, ptr),
277+
ast::Type::PathType(path) => {
278+
lifetime::fn_path_hints(hints, ctx, famous_defs, config, path);
279+
Some(())
280+
},
274281
_ => Some(()),
275282
},
276-
ast::GenericParamList(it) => bounds::hints(hints, famous_defs, config, file_id, it),
283+
ast::GenericParamList(it) => bounds::hints(hints, famous_defs, config, it),
277284
_ => Some(()),
278285
}
279286
};

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use hir::Mutability;
88
use ide_db::famous_defs::FamousDefs;
99

1010
use ide_db::text_edit::TextEditBuilder;
11-
use span::EditionedFileId;
1211
use syntax::ast::{self, AstNode};
1312

1413
use crate::{InlayHint, InlayHintLabel, InlayHintPosition, InlayHintsConfig, InlayKind};
@@ -17,7 +16,6 @@ pub(super) fn hints(
1716
acc: &mut Vec<InlayHint>,
1817
FamousDefs(sema, _): &FamousDefs<'_, '_>,
1918
config: &InlayHintsConfig,
20-
_file_id: EditionedFileId,
2119
pat: &ast::Pat,
2220
) -> Option<()> {
2321
if !config.binding_mode_hints {

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
//! Currently this renders the implied `Sized` bound.
44
use ide_db::{FileRange, famous_defs::FamousDefs};
55

6-
use span::EditionedFileId;
76
use syntax::ast::{self, AstNode, HasTypeBounds};
87

98
use crate::{
@@ -15,7 +14,6 @@ pub(super) fn hints(
1514
acc: &mut Vec<InlayHint>,
1615
famous_defs @ FamousDefs(sema, _): &FamousDefs<'_, '_>,
1716
config: &InlayHintsConfig,
18-
_file_id: EditionedFileId,
1917
params: ast::GenericParamList,
2018
) -> Option<()> {
2119
if !config.sized_bound {

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
//! fn g() {
44
//! } /* fn g */
55
//! ```
6-
use hir::{DisplayTarget, HirDisplay, Semantics};
6+
use hir::{DisplayTarget, HirDisplay, InRealFile, Semantics};
77
use ide_db::{FileRange, RootDatabase};
8-
use span::EditionedFileId;
98
use syntax::{
109
SyntaxKind, SyntaxNode, T,
1110
ast::{self, AstNode, HasLoopBody, HasName},
@@ -21,15 +20,14 @@ pub(super) fn hints(
2120
acc: &mut Vec<InlayHint>,
2221
sema: &Semantics<'_, RootDatabase>,
2322
config: &InlayHintsConfig,
24-
file_id: EditionedFileId,
2523
display_target: DisplayTarget,
26-
original_node: SyntaxNode,
24+
InRealFile { file_id, value: node }: InRealFile<SyntaxNode>,
2725
) -> Option<()> {
2826
let min_lines = config.closing_brace_hints_min_lines?;
2927

3028
let name = |it: ast::Name| it.syntax().text_range();
3129

32-
let mut node = original_node.clone();
30+
let mut node = node.clone();
3331
let mut closing_token;
3432
let (label, name_range) = if let Some(item_list) = ast::AssocItemList::cast(node.clone()) {
3533
closing_token = item_list.r_curly_token()?;
@@ -44,7 +42,7 @@ pub(super) fn hints(
4442
let hint_text = match trait_ {
4543
Some(tr) => format!(
4644
"impl {} for {}",
47-
tr.name(sema.db).display(sema.db, file_id.edition()),
45+
tr.name(sema.db).display(sema.db, display_target.edition),
4846
ty.display_truncated(sema.db, config.max_length, display_target,
4947
)),
5048
None => format!("impl {}", ty.display_truncated(sema.db, config.max_length, display_target)),
@@ -142,7 +140,8 @@ pub(super) fn hints(
142140
return None;
143141
}
144142

145-
let linked_location = name_range.map(|range| FileRange { file_id: file_id.into(), range });
143+
let linked_location =
144+
name_range.map(|range| FileRange { file_id: file_id.file_id(sema.db), range });
146145
acc.push(InlayHint {
147146
range: closing_token.text_range(),
148147
kind: InlayKind::ClosingBrace,
@@ -151,7 +150,7 @@ pub(super) fn hints(
151150
position: InlayHintPosition::After,
152151
pad_left: true,
153152
pad_right: false,
154-
resolve_parent: Some(original_node.text_range()),
153+
resolve_parent: Some(node.text_range()),
155154
});
156155

157156
None

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
use hir::Semantics;
88
use ide_db::text_edit::TextEdit;
99
use ide_db::{RootDatabase, famous_defs::FamousDefs};
10-
use span::EditionedFileId;
1110
use syntax::ast::{self, AstNode, HasName};
1211

1312
use crate::{
@@ -19,7 +18,6 @@ pub(super) fn enum_hints(
1918
acc: &mut Vec<InlayHint>,
2019
FamousDefs(sema, _): &FamousDefs<'_, '_>,
2120
config: &InlayHintsConfig,
22-
_: EditionedFileId,
2321
enum_: ast::Enum,
2422
) -> Option<()> {
2523
if let DiscriminantHints::Never = config.discriminant_hints {

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
//! Extern block hints
22
use ide_db::{famous_defs::FamousDefs, text_edit::TextEdit};
3-
use span::EditionedFileId;
43
use syntax::{AstNode, SyntaxToken, ast};
54

65
use crate::{InlayHint, InlayHintsConfig};
@@ -9,7 +8,6 @@ pub(super) fn extern_block_hints(
98
acc: &mut Vec<InlayHint>,
109
FamousDefs(sema, _): &FamousDefs<'_, '_>,
1110
config: &InlayHintsConfig,
12-
_file_id: EditionedFileId,
1311
extern_block: ast::ExternBlock,
1412
) -> Option<()> {
1513
if extern_block.unsafe_token().is_some() {
@@ -36,7 +34,6 @@ pub(super) fn fn_hints(
3634
acc: &mut Vec<InlayHint>,
3735
FamousDefs(sema, _): &FamousDefs<'_, '_>,
3836
config: &InlayHintsConfig,
39-
_file_id: EditionedFileId,
4037
fn_: &ast::Fn,
4138
extern_block: &ast::ExternBlock,
4239
) -> Option<()> {
@@ -55,7 +52,6 @@ pub(super) fn static_hints(
5552
acc: &mut Vec<InlayHint>,
5653
FamousDefs(sema, _): &FamousDefs<'_, '_>,
5754
config: &InlayHintsConfig,
58-
_file_id: EditionedFileId,
5955
static_: &ast::Static,
6056
extern_block: &ast::ExternBlock,
6157
) -> Option<()> {

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ use hir::{
1212
};
1313
use ide_db::{FileRange, famous_defs::FamousDefs};
1414

15-
use span::EditionedFileId;
1615
use syntax::{
1716
ToSmolStr,
1817
ast::{self, AstNode},
@@ -25,7 +24,7 @@ pub(super) fn hints(
2524
acc: &mut Vec<InlayHint>,
2625
FamousDefs(sema, _): &FamousDefs<'_, '_>,
2726
config: &InlayHintsConfig,
28-
file_id: EditionedFileId,
27+
display_target: hir::DisplayTarget,
2928
node: &ast::Fn,
3029
) -> Option<()> {
3130
if !config.implicit_drop_hints {
@@ -94,7 +93,7 @@ pub(super) fn hints(
9493
MirSpan::Unknown => continue,
9594
};
9695
let binding = &hir.bindings[binding_idx];
97-
let name = binding.name.display_no_db(file_id.edition()).to_smolstr();
96+
let name = binding.name.display_no_db(display_target.edition).to_smolstr();
9897
if name.starts_with("<ra@") {
9998
continue; // Ignore desugared variables
10099
}

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use either::Either;
66
use ide_db::famous_defs::FamousDefs;
77
use ide_db::text_edit::TextEdit;
8-
use span::EditionedFileId;
98
use syntax::{
109
SyntaxKind,
1110
ast::{self, AstNode},
@@ -17,7 +16,6 @@ pub(super) fn hints(
1716
acc: &mut Vec<InlayHint>,
1817
FamousDefs(_sema, _): &FamousDefs<'_, '_>,
1918
config: &InlayHintsConfig,
20-
_file_id: EditionedFileId,
2119
statik_or_const: Either<ast::Static, ast::Const>,
2220
) -> Option<()> {
2321
if config.lifetime_elision_hints != LifetimeElisionHints::Always {

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

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use std::iter;
66

77
use ide_db::{FxHashMap, famous_defs::FamousDefs, syntax_helpers::node_ext::walk_ty};
88
use itertools::Itertools;
9-
use span::EditionedFileId;
109
use syntax::{SmolStr, format_smolstr};
1110
use syntax::{
1211
SyntaxKind, SyntaxToken,
@@ -23,7 +22,6 @@ pub(super) fn fn_hints(
2322
ctx: &mut InlayHintCtx,
2423
fd: &FamousDefs<'_, '_>,
2524
config: &InlayHintsConfig,
26-
file_id: EditionedFileId,
2725
func: ast::Fn,
2826
) -> Option<()> {
2927
if config.lifetime_elision_hints == LifetimeElisionHints::Never {
@@ -40,7 +38,6 @@ pub(super) fn fn_hints(
4038
ctx,
4139
fd,
4240
config,
43-
file_id,
4441
param_list.params().filter_map(|it| {
4542
Some((
4643
it.pat().and_then(|it| match it {
@@ -74,7 +71,6 @@ pub(super) fn fn_ptr_hints(
7471
ctx: &mut InlayHintCtx,
7572
fd: &FamousDefs<'_, '_>,
7673
config: &InlayHintsConfig,
77-
file_id: EditionedFileId,
7874
func: ast::FnPtrType,
7975
) -> Option<()> {
8076
if config.lifetime_elision_hints == LifetimeElisionHints::Never {
@@ -97,7 +93,6 @@ pub(super) fn fn_ptr_hints(
9793
ctx,
9894
fd,
9995
config,
100-
file_id,
10196
param_list.params().filter_map(|it| {
10297
Some((
10398
it.pat().and_then(|it| match it {
@@ -140,7 +135,6 @@ pub(super) fn fn_path_hints(
140135
ctx: &mut InlayHintCtx,
141136
fd: &FamousDefs<'_, '_>,
142137
config: &InlayHintsConfig,
143-
file_id: EditionedFileId,
144138
func: ast::PathType,
145139
) -> Option<()> {
146140
if config.lifetime_elision_hints == LifetimeElisionHints::Never {
@@ -163,7 +157,6 @@ pub(super) fn fn_path_hints(
163157
ctx,
164158
fd,
165159
config,
166-
file_id,
167160
param_list.type_args().filter_map(|it| Some((None, it.ty()?))),
168161
generic_param_list,
169162
ret_type,
@@ -202,7 +195,6 @@ fn hints_(
202195
ctx: &mut InlayHintCtx,
203196
FamousDefs(_, _): &FamousDefs<'_, '_>,
204197
config: &InlayHintsConfig,
205-
_file_id: EditionedFileId,
206198
params: impl Iterator<Item = (Option<ast::Name>, ast::Type)>,
207199
generic_param_list: Option<ast::GenericParamList>,
208200
ret_type: Option<ast::RetType>,

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
//! if let ../* < */100 = 50 {}
55
//! ```
66
use ide_db::famous_defs::FamousDefs;
7-
use span::EditionedFileId;
87
use syntax::{SyntaxToken, T, ast};
98

109
use crate::{InlayHint, InlayHintsConfig};
@@ -13,7 +12,6 @@ pub(super) fn hints(
1312
acc: &mut Vec<InlayHint>,
1413
FamousDefs(_sema, _): &FamousDefs<'_, '_>,
1514
config: &InlayHintsConfig,
16-
_file_id: EditionedFileId,
1715
range: impl ast::RangeItem,
1816
) -> Option<()> {
1917
(config.range_exclusive_hints && range.end().is_some())

0 commit comments

Comments
 (0)