Skip to content

Commit 7acc434

Browse files
committed
Auto merge of #14071 - Veykril:inlay-hints, r=Veykril
fix: Don't render fieldless discriminant inlay hints for datacarrying enums
2 parents bfe82cd + 14f19c7 commit 7acc434

File tree

2 files changed

+47
-26
lines changed

2 files changed

+47
-26
lines changed

crates/ide/src/inlay_hints.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -422,11 +422,9 @@ fn hints(
422422
// static type elisions
423423
ast::Item::Static(it) => implicit_static::hints(hints, config, Either::Left(it)),
424424
ast::Item::Const(it) => implicit_static::hints(hints, config, Either::Right(it)),
425+
ast::Item::Enum(it) => discriminant::enum_hints(hints, famous_defs, config, file_id, it),
425426
_ => None,
426427
},
427-
ast::Variant(v) => {
428-
discriminant::hints(hints, famous_defs, config, file_id, &v)
429-
},
430428
// FIXME: fn-ptr type, dyn fn type, and trait object type elisions
431429
ast::Type(_) => None,
432430
_ => None,

crates/ide/src/inlay_hints/discriminant.rs

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,40 @@
44
//! Bar/* = 0*/,
55
//! }
66
//! ```
7-
use ide_db::{base_db::FileId, famous_defs::FamousDefs};
7+
use hir::Semantics;
8+
use ide_db::{base_db::FileId, famous_defs::FamousDefs, RootDatabase};
89
use syntax::ast::{self, AstNode, HasName};
910

1011
use crate::{
1112
DiscriminantHints, InlayHint, InlayHintLabel, InlayHintsConfig, InlayKind, InlayTooltip,
1213
};
1314

14-
pub(super) fn hints(
15+
pub(super) fn enum_hints(
1516
acc: &mut Vec<InlayHint>,
1617
FamousDefs(sema, _): &FamousDefs<'_, '_>,
1718
config: &InlayHintsConfig,
1819
_: FileId,
19-
variant: &ast::Variant,
20+
enum_: ast::Enum,
2021
) -> Option<()> {
21-
let field_list = match config.discriminant_hints {
22-
DiscriminantHints::Always => variant.field_list(),
23-
DiscriminantHints::Fieldless => match variant.field_list() {
24-
Some(_) => return None,
25-
None => None,
26-
},
27-
DiscriminantHints::Never => return None,
22+
let disabled = match config.discriminant_hints {
23+
DiscriminantHints::Always => false,
24+
DiscriminantHints::Fieldless => sema.to_def(&enum_)?.is_data_carrying(sema.db),
25+
DiscriminantHints::Never => true,
2826
};
27+
if disabled {
28+
return None;
29+
}
30+
for variant in enum_.variant_list()?.variants() {
31+
variant_hints(acc, sema, &variant);
32+
}
33+
None
34+
}
2935

36+
fn variant_hints(
37+
acc: &mut Vec<InlayHint>,
38+
sema: &Semantics<'_, RootDatabase>,
39+
variant: &ast::Variant,
40+
) -> Option<()> {
3041
if variant.eq_token().is_some() {
3142
return None;
3243
}
@@ -39,7 +50,7 @@ pub(super) fn hints(
3950
let d = v.eval(sema.db);
4051

4152
acc.push(InlayHint {
42-
range: match field_list {
53+
range: match variant.field_list() {
4354
Some(field_list) => name.syntax().text_range().cover(field_list.syntax().text_range()),
4455
None => name.syntax().text_range(),
4556
},
@@ -91,15 +102,30 @@ mod tests {
91102
check_discriminants(
92103
r#"
93104
enum Enum {
94-
Variant,
95-
//^^^^^^^0
96-
Variant1,
97-
//^^^^^^^^1
98-
Variant2,
99-
//^^^^^^^^2
100-
Variant5 = 5,
101-
Variant6,
102-
//^^^^^^^^6
105+
Variant,
106+
//^^^^^^^0
107+
Variant1,
108+
//^^^^^^^^1
109+
Variant2,
110+
//^^^^^^^^2
111+
Variant5 = 5,
112+
Variant6,
113+
//^^^^^^^^6
114+
}
115+
"#,
116+
);
117+
check_discriminants_fieldless(
118+
r#"
119+
enum Enum {
120+
Variant,
121+
//^^^^^^^0
122+
Variant1,
123+
//^^^^^^^^1
124+
Variant2,
125+
//^^^^^^^^2
126+
Variant5 = 5,
127+
Variant6,
128+
//^^^^^^^^6
103129
}
104130
"#,
105131
);
@@ -133,13 +159,10 @@ enum Enum {
133159
enum Enum {
134160
Variant(),
135161
Variant1,
136-
//^^^^^^^^1
137162
Variant2 {},
138163
Variant3,
139-
//^^^^^^^^3
140164
Variant5 = 5,
141165
Variant6,
142-
//^^^^^^^^6
143166
}
144167
"#,
145168
);

0 commit comments

Comments
 (0)