4
4
//! Bar/* = 0*/,
5
5
//! }
6
6
//! ```
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 } ;
8
9
use syntax:: ast:: { self , AstNode , HasName } ;
9
10
10
11
use crate :: {
11
12
DiscriminantHints , InlayHint , InlayHintLabel , InlayHintsConfig , InlayKind , InlayTooltip ,
12
13
} ;
13
14
14
- pub ( super ) fn hints (
15
+ pub ( super ) fn enum_hints (
15
16
acc : & mut Vec < InlayHint > ,
16
17
FamousDefs ( sema, _) : & FamousDefs < ' _ , ' _ > ,
17
18
config : & InlayHintsConfig ,
18
19
_: FileId ,
19
- variant : & ast:: Variant ,
20
+ enum_ : ast:: Enum ,
20
21
) -> 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 ,
28
26
} ;
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
+ }
29
35
36
+ fn variant_hints (
37
+ acc : & mut Vec < InlayHint > ,
38
+ sema : & Semantics < ' _ , RootDatabase > ,
39
+ variant : & ast:: Variant ,
40
+ ) -> Option < ( ) > {
30
41
if variant. eq_token ( ) . is_some ( ) {
31
42
return None ;
32
43
}
@@ -39,7 +50,7 @@ pub(super) fn hints(
39
50
let d = v. eval ( sema. db ) ;
40
51
41
52
acc. push ( InlayHint {
42
- range : match field_list {
53
+ range : match variant . field_list ( ) {
43
54
Some ( field_list) => name. syntax ( ) . text_range ( ) . cover ( field_list. syntax ( ) . text_range ( ) ) ,
44
55
None => name. syntax ( ) . text_range ( ) ,
45
56
} ,
@@ -91,15 +102,30 @@ mod tests {
91
102
check_discriminants (
92
103
r#"
93
104
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
103
129
}
104
130
"# ,
105
131
) ;
@@ -133,13 +159,10 @@ enum Enum {
133
159
enum Enum {
134
160
Variant(),
135
161
Variant1,
136
- //^^^^^^^^1
137
162
Variant2 {},
138
163
Variant3,
139
- //^^^^^^^^3
140
164
Variant5 = 5,
141
165
Variant6,
142
- //^^^^^^^^6
143
166
}
144
167
"# ,
145
168
) ;
0 commit comments