Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit c12ede8

Browse files
committed
fix: Discriminant hints only render for datacarrying enums with primitive repr
1 parent 2f8cd66 commit c12ede8

File tree

3 files changed

+49
-46
lines changed

3 files changed

+49
-46
lines changed

crates/hir/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,6 +1075,10 @@ impl Enum {
10751075
db.enum_data(self.id).variants.iter().map(|(id, _)| Variant { parent: self, id }).collect()
10761076
}
10771077

1078+
pub fn repr(self, db: &dyn HirDatabase) -> Option<ReprOptions> {
1079+
db.enum_data(self.id).repr
1080+
}
1081+
10781082
pub fn ty(self, db: &dyn HirDatabase) -> Type {
10791083
Type::from_def(db, self.id)
10801084
}
@@ -1112,6 +1116,7 @@ impl Enum {
11121116
)
11131117
}
11141118

1119+
/// Returns true if at least one variant of this enum is a non-unit variant.
11151120
pub fn is_data_carrying(self, db: &dyn HirDatabase) -> bool {
11161121
self.variants(db).iter().any(|v| !matches!(v.kind(db), StructKind::Unit))
11171122
}

crates/ide/src/inlay_hints/discriminant.rs

Lines changed: 43 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,23 @@ pub(super) fn enum_hints(
2020
_: FileId,
2121
enum_: ast::Enum,
2222
) -> Option<()> {
23-
let enabled = match config.discriminant_hints {
24-
DiscriminantHints::Always => true,
25-
DiscriminantHints::Fieldless => {
26-
!sema.to_def(&enum_)?.is_data_carrying(sema.db)
27-
|| enum_.variant_list()?.variants().any(|v| v.expr().is_some())
28-
}
29-
DiscriminantHints::Never => false,
30-
};
31-
if !enabled {
23+
if let DiscriminantHints::Never = config.discriminant_hints {
24+
return None;
25+
}
26+
27+
let def = sema.to_def(&enum_)?;
28+
let data_carrying = def.is_data_carrying(sema.db);
29+
if matches!(config.discriminant_hints, DiscriminantHints::Fieldless) && data_carrying {
30+
return None;
31+
}
32+
// data carrying enums without a primitive repr have no stable discriminants
33+
if data_carrying && def.repr(sema.db).map_or(true, |r| r.int.is_none()) {
3234
return None;
3335
}
3436
for variant in enum_.variant_list()?.variants() {
3537
variant_hints(acc, sema, &variant);
3638
}
37-
None
39+
Some(())
3840
}
3941

4042
fn variant_hints(
@@ -91,7 +93,6 @@ fn variant_hints(
9193

9294
Some(())
9395
}
94-
9596
#[cfg(test)]
9697
mod tests {
9798
use crate::inlay_hints::{
@@ -123,30 +124,30 @@ mod tests {
123124
check_discriminants(
124125
r#"
125126
enum Enum {
126-
Variant,
127-
//^^^^^^^ = 0$
128-
Variant1,
129-
//^^^^^^^^ = 1$
130-
Variant2,
131-
//^^^^^^^^ = 2$
132-
Variant5 = 5,
133-
Variant6,
134-
//^^^^^^^^ = 6$
127+
Variant,
128+
// ^^^^^^^ = 0$
129+
Variant1,
130+
// ^^^^^^^^ = 1$
131+
Variant2,
132+
// ^^^^^^^^ = 2$
133+
Variant5 = 5,
134+
Variant6,
135+
// ^^^^^^^^ = 6$
135136
}
136137
"#,
137138
);
138139
check_discriminants_fieldless(
139140
r#"
140141
enum Enum {
141-
Variant,
142-
//^^^^^^^ = 0
143-
Variant1,
144-
//^^^^^^^^ = 1
145-
Variant2,
146-
//^^^^^^^^ = 2
147-
Variant5 = 5,
148-
Variant6,
149-
//^^^^^^^^ = 6
142+
Variant,
143+
// ^^^^^^^ = 0
144+
Variant1,
145+
// ^^^^^^^^ = 1
146+
Variant2,
147+
// ^^^^^^^^ = 2
148+
Variant5 = 5,
149+
Variant6,
150+
// ^^^^^^^^ = 6
150151
}
151152
"#,
152153
);
@@ -156,26 +157,23 @@ enum Enum {
156157
fn datacarrying_mixed() {
157158
check_discriminants(
158159
r#"
160+
#[repr(u8)]
159161
enum Enum {
160162
Variant(),
161-
//^^^^^^^^^ = 0
163+
// ^^^^^^^^^ = 0
162164
Variant1,
163-
//^^^^^^^^ = 1
165+
// ^^^^^^^^ = 1
164166
Variant2 {},
165-
//^^^^^^^^^^^ = 2
167+
// ^^^^^^^^^^^ = 2
166168
Variant3,
167-
//^^^^^^^^ = 3
169+
// ^^^^^^^^ = 3
168170
Variant5 = 5,
169171
Variant6,
170-
//^^^^^^^^ = 6
172+
// ^^^^^^^^ = 6
171173
}
172174
"#,
173175
);
174-
}
175-
176-
#[test]
177-
fn datacarrying_mixed_fieldless_set() {
178-
check_discriminants_fieldless(
176+
check_discriminants(
179177
r#"
180178
enum Enum {
181179
Variant(),
@@ -187,20 +185,20 @@ enum Enum {
187185
}
188186
"#,
189187
);
188+
}
189+
190+
#[test]
191+
fn datacarrying_mixed_fieldless_set() {
190192
check_discriminants_fieldless(
191193
r#"
194+
#[repr(u8)]
192195
enum Enum {
193196
Variant(),
194-
//^^^^^^^^^ = 0
195197
Variant1,
196-
//^^^^^^^^ = 1
197198
Variant2 {},
198-
//^^^^^^^^^^^ = 2
199199
Variant3,
200-
//^^^^^^^^ = 3
201-
Variant5 = 5,
200+
Variant5,
202201
Variant6,
203-
//^^^^^^^^ = 6
204202
}
205203
"#,
206204
);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ pub(crate) fn handle_analyzer_status(
102102
.collect::<Vec<&AbsPath>>()
103103
);
104104
}
105-
format_to!(buf, "\nVfs memory usage: {}\n", snap.vfs_memory_usage());
105+
format_to!(buf, "\nVfs memory usage: {}\n", profile::Bytes::new(snap.vfs_memory_usage() as _));
106106
buf.push_str("\nAnalysis:\n");
107107
buf.push_str(
108108
&snap

0 commit comments

Comments
 (0)