Skip to content

Commit 2dc5aa8

Browse files
authored
Merge pull request #19922 from Veykril/push-oxyomxrsplpx
feat: Add `dyn` keyword inlay hints
2 parents 789d915 + b973381 commit 2dc5aa8

25 files changed

+405
-217
lines changed

crates/hir-def/src/macro_expansion_tests/mbe/regression.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -931,11 +931,12 @@ pub fn new() {
931931
932932
933933
934-
935-
936-
937-
938-
934+
935+
936+
937+
938+
939+
939940
940941
941942

crates/ide/src/inlay_hints.rs

Lines changed: 39 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};
@@ -34,6 +34,7 @@ mod extern_block;
3434
mod generic_param;
3535
mod implicit_drop;
3636
mod implicit_static;
37+
mod implied_dyn_trait;
3738
mod lifetime;
3839
mod param_name;
3940
mod range_exclusive;
@@ -95,16 +96,16 @@ pub(crate) fn inlay_hints(
9596
return acc;
9697
};
9798
let famous_defs = FamousDefs(&sema, scope.krate());
99+
let display_target = famous_defs.1.to_display_target(sema.db);
98100

99101
let ctx = &mut InlayHintCtx::default();
100102
let mut hints = |event| {
101103
if let Some(node) = handle_event(ctx, event) {
102-
hints(&mut acc, ctx, &famous_defs, config, file_id, node);
104+
hints(&mut acc, ctx, &famous_defs, config, file_id, display_target, node);
103105
}
104106
};
105107
let mut preorder = file.preorder();
106108
while let Some(event) = preorder.next() {
107-
// FIXME: This can miss some hints that require the parent of the range to calculate
108109
if matches!((&event, range_limit), (WalkEvent::Enter(node), Some(range)) if range.intersect(node.text_range()).is_none())
109110
{
110111
preorder.skip_subtree();
@@ -144,10 +145,12 @@ pub(crate) fn inlay_hints_resolve(
144145
let famous_defs = FamousDefs(&sema, scope.krate());
145146
let mut acc = Vec::new();
146147

148+
let display_target = famous_defs.1.to_display_target(sema.db);
149+
147150
let ctx = &mut InlayHintCtx::default();
148151
let mut hints = |event| {
149152
if let Some(node) = handle_event(ctx, event) {
150-
hints(&mut acc, ctx, &famous_defs, config, file_id, node);
153+
hints(&mut acc, ctx, &famous_defs, config, file_id, display_target, node);
151154
}
152155
};
153156

@@ -202,17 +205,19 @@ fn handle_event(ctx: &mut InlayHintCtx, node: WalkEvent<SyntaxNode>) -> Option<S
202205
fn hints(
203206
hints: &mut Vec<InlayHint>,
204207
ctx: &mut InlayHintCtx,
205-
famous_defs @ FamousDefs(sema, _): &FamousDefs<'_, '_>,
208+
famous_defs @ FamousDefs(sema, _krate): &FamousDefs<'_, '_>,
206209
config: &InlayHintsConfig,
207210
file_id: EditionedFileId,
211+
display_target: DisplayTarget,
208212
node: SyntaxNode,
209213
) {
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());
214+
closing_brace::hints(
215+
hints,
216+
sema,
217+
config,
218+
display_target,
219+
InRealFile { file_id, value: node.clone() },
220+
);
216221
if let Some(any_has_generic_args) = ast::AnyHasGenericArgs::cast(node.clone()) {
217222
generic_param::hints(hints, famous_defs, config, any_has_generic_args);
218223
}
@@ -231,49 +236,57 @@ fn hints(
231236
closure_captures::hints(hints, famous_defs, config, it.clone());
232237
closure_ret::hints(hints, famous_defs, config, display_target, it)
233238
},
234-
ast::Expr::RangeExpr(it) => range_exclusive::hints(hints, famous_defs, config, file_id, it),
239+
ast::Expr::RangeExpr(it) => range_exclusive::hints(hints, famous_defs, config, it),
235240
_ => Some(()),
236241
}
237242
},
238243
ast::Pat(it) => {
239-
binding_mode::hints(hints, famous_defs, config, file_id, &it);
244+
binding_mode::hints(hints, famous_defs, config, &it);
240245
match it {
241246
ast::Pat::IdentPat(it) => {
242247
bind_pat::hints(hints, famous_defs, config, display_target, &it);
243248
}
244249
ast::Pat::RangePat(it) => {
245-
range_exclusive::hints(hints, famous_defs, config, file_id, it);
250+
range_exclusive::hints(hints, famous_defs, config, it);
246251
}
247252
_ => {}
248253
}
249254
Some(())
250255
},
251256
ast::Item(it) => match it {
252257
ast::Item::Fn(it) => {
253-
implicit_drop::hints(hints, famous_defs, config, file_id, &it);
258+
implicit_drop::hints(hints, famous_defs, config, display_target, &it);
254259
if let Some(extern_block) = &ctx.extern_block_parent {
255-
extern_block::fn_hints(hints, famous_defs, config, file_id, &it, extern_block);
260+
extern_block::fn_hints(hints, famous_defs, config, &it, extern_block);
256261
}
257-
lifetime::fn_hints(hints, ctx, famous_defs, config, file_id, it)
262+
lifetime::fn_hints(hints, ctx, famous_defs, config, it)
258263
},
259264
ast::Item::Static(it) => {
260265
if let Some(extern_block) = &ctx.extern_block_parent {
261-
extern_block::static_hints(hints, famous_defs, config, file_id, &it, extern_block);
266+
extern_block::static_hints(hints, famous_defs, config, &it, extern_block);
262267
}
263-
implicit_static::hints(hints, famous_defs, config, file_id, Either::Left(it))
268+
implicit_static::hints(hints, famous_defs, config, Either::Left(it))
264269
},
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),
270+
ast::Item::Const(it) => implicit_static::hints(hints, famous_defs, config, Either::Right(it)),
271+
ast::Item::Enum(it) => discriminant::enum_hints(hints, famous_defs, config, it),
272+
ast::Item::ExternBlock(it) => extern_block::extern_block_hints(hints, famous_defs, config, it),
268273
_ => None,
269274
},
270275
// FIXME: trait object type elisions
271276
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),
277+
ast::Type::FnPtrType(ptr) => lifetime::fn_ptr_hints(hints, ctx, famous_defs, config, ptr),
278+
ast::Type::PathType(path) => {
279+
lifetime::fn_path_hints(hints, ctx, famous_defs, config, &path);
280+
implied_dyn_trait::hints(hints, famous_defs, config, Either::Left(path));
281+
Some(())
282+
},
283+
ast::Type::DynTraitType(dyn_) => {
284+
implied_dyn_trait::hints(hints, famous_defs, config, Either::Right(dyn_));
285+
Some(())
286+
},
274287
_ => Some(()),
275288
},
276-
ast::GenericParamList(it) => bounds::hints(hints, famous_defs, config, file_id, it),
289+
ast::GenericParamList(it) => bounds::hints(hints, famous_defs, config, it),
277290
_ => Some(()),
278291
}
279292
};
@@ -438,6 +451,7 @@ pub enum InlayKind {
438451
Parameter,
439452
GenericParameter,
440453
Type,
454+
Dyn,
441455
Drop,
442456
RangeExclusive,
443457
ExternUnsafety,

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 {

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 {

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

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 {

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

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
}

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 {

0 commit comments

Comments
 (0)