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 } ;
89use syntax:: ast:: { self , AstNode , HasName } ;
910
1011use 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#"
93104enum 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 {
133159enum 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