@@ -71,7 +71,8 @@ public sealed class {SourceGeneratorHelper.AttributeName}Attribute : Attribute
71
71
72
72
73
73
/**********************/
74
- var memberAttribute = new Dictionary < string , string > ( ) ;
74
+ var enumDisplayNames = new Dictionary < string , string > ( StringComparer . OrdinalIgnoreCase ) ;
75
+ var enumDescriptions = new Dictionary < string , string > ( StringComparer . OrdinalIgnoreCase ) ;
75
76
foreach ( var member in enumSymbol . GetMembers ( ) )
76
77
{
77
78
if ( member is not IFieldSymbol field
@@ -84,21 +85,36 @@ public sealed class {SourceGeneratorHelper.AttributeName}Attribute : Attribute
84
85
attribute . AttributeClass . Name != "DisplayAttribute" ) continue ;
85
86
86
87
foreach ( var namedArgument in attribute . NamedArguments )
88
+ {
87
89
if ( namedArgument . Key . Equals ( "Name" , StringComparison . OrdinalIgnoreCase ) &&
88
- namedArgument . Value . Value ? . ToString ( ) is { } dn )
90
+ namedArgument . Value . Value ? . ToString ( ) is { } displayName )
89
91
{
90
- memberAttribute . Add ( member . Name , dn ) ;
91
- break ;
92
+ enumDisplayNames . Add ( member . Name , displayName ) ;
93
+ }
94
+ if ( namedArgument . Key . Equals ( "Description" , StringComparison . OrdinalIgnoreCase ) &&
95
+ namedArgument . Value . Value ? . ToString ( ) is { } description )
96
+ {
97
+ enumDescriptions . Add ( member . Name , description ) ;
92
98
}
99
+
100
+ }
93
101
}
94
102
}
95
103
96
104
var sourceBuilder = new StringBuilder ( $@ "using System;
105
+ using System.Collections.Generic;
106
+ using System.Collections.Immutable;
97
107
namespace { SourceGeneratorHelper . NameSpace }
98
108
{{
99
109
public static class { symbol . Name } EnumExtensions
100
110
{{" ) ;
101
111
112
+ //DisplayNames Dictionary
113
+ DisplayNamesDictionary ( sourceBuilder , symbolName , e , enumDisplayNames ) ;
114
+
115
+ //DisplayDescriptions Dictionary
116
+ DisplayDescriptionsDictionary ( sourceBuilder , symbolName , e , enumDescriptions ) ;
117
+
102
118
//ToStringFast
103
119
ToStringFast ( sourceBuilder , symbolName , e ) ;
104
120
@@ -109,7 +125,10 @@ public static class {symbol.Name}EnumExtensions
109
125
IsDefinedString ( sourceBuilder , e , symbolName ) ;
110
126
111
127
//ToDisplay string
112
- ToDisplay ( sourceBuilder , symbolName , e , memberAttribute ) ;
128
+ ToDisplay ( sourceBuilder , symbolName , e , enumDisplayNames ) ;
129
+
130
+ //ToDisplay string
131
+ ToDescription ( sourceBuilder , symbolName , e , enumDescriptions ) ;
113
132
114
133
//GetValues
115
134
GetValuesFast ( sourceBuilder , symbolName , e ) ;
@@ -131,28 +150,51 @@ public static class {symbol.Name}EnumExtensions
131
150
}
132
151
133
152
private static void ToDisplay ( StringBuilder sourceBuilder , string symbolName , EnumDeclarationSyntax e ,
134
- Dictionary < string , string > memberAttribute )
153
+ Dictionary < string , string > enumDisplayNames )
135
154
{
136
155
sourceBuilder . Append ( $@ "
137
- public static string { SourceGeneratorHelper . ExtensionMethodNameToDisplay } (this { symbolName } states)
156
+ public static string { SourceGeneratorHelper . ExtensionMethodNameToDisplay } (this { symbolName } states, string defaultValue = null )
138
157
{{
139
158
return states switch
140
159
{{
141
160
" ) ;
142
161
foreach ( var member in e . Members )
143
162
{
144
- var display = memberAttribute
145
- . FirstOrDefault ( r =>
146
- r . Key . Equals ( member . Identifier . ValueText , StringComparison . OrdinalIgnoreCase ) )
147
- . Value
148
- ?? member . Identifier . ValueText ;
163
+ var key = member . Identifier . ValueText ;
164
+ var enumDisplayName = enumDisplayNames . TryGetValue ( key , out var found )
165
+ ? found
166
+ : key ;
167
+ sourceBuilder . AppendLine (
168
+ $@ " { symbolName } .{ member . Identifier . ValueText } => ""{ enumDisplayName ?? key } "",") ;
169
+ }
170
+
171
+ sourceBuilder . Append (
172
+ @" _ => defaultValue ?? throw new ArgumentOutOfRangeException(nameof(states), states, null)
173
+ };
174
+ }" ) ;
175
+ }
149
176
177
+ private static void ToDescription ( StringBuilder sourceBuilder , string symbolName , EnumDeclarationSyntax e ,
178
+ Dictionary < string , string > enumDescriptions )
179
+ {
180
+ sourceBuilder . Append ( $@ "
181
+ public static string { SourceGeneratorHelper . ExtensionMethodNameToDescription } (this { symbolName } states, string defaultValue = null)
182
+ {{
183
+ return states switch
184
+ {{
185
+ " ) ;
186
+ foreach ( var member in e . Members )
187
+ {
188
+ var key = member . Identifier . ValueText ;
189
+ var enumDescription = enumDescriptions . TryGetValue ( key , out var found )
190
+ ? found
191
+ : key ;
150
192
sourceBuilder . AppendLine (
151
- $@ " { symbolName } .{ member . Identifier . ValueText } => ""{ display } "",") ;
193
+ $@ " { symbolName } .{ member . Identifier . ValueText } => ""{ enumDescription ?? key } "",") ;
152
194
}
153
195
154
196
sourceBuilder . Append (
155
- @" _ => throw new ArgumentOutOfRangeException(nameof(states), states, null)
197
+ @" _ => defaultValue ?? throw new ArgumentOutOfRangeException(nameof(states), states, null)
156
198
};
157
199
}" ) ;
158
200
}
@@ -192,19 +234,63 @@ private static void IsDefinedEnum(StringBuilder sourceBuilder, string symbolName
192
234
private static void ToStringFast ( StringBuilder sourceBuilder , string symbolName , EnumDeclarationSyntax e )
193
235
{
194
236
sourceBuilder . Append ( $@ "
195
- public static string { SourceGeneratorHelper . ExtensionMethodNameToString } (this { symbolName } states)
237
+ public static string { SourceGeneratorHelper . ExtensionMethodNameToString } (this { symbolName } states, string defaultValue = null )
196
238
{{
197
239
return states switch
198
240
{{
199
241
" ) ;
200
242
foreach ( var member in e . Members . Select ( x => x . Identifier . ValueText ) )
201
243
sourceBuilder . AppendLine ( $@ " { symbolName } .{ member } => nameof({ symbolName } .{ member } ),") ;
202
244
sourceBuilder . Append (
203
- @" _ => throw new ArgumentOutOfRangeException(nameof(states), states, null)
245
+ @" _ => defaultValue ?? throw new ArgumentOutOfRangeException(nameof(states), states, null)
204
246
};
205
247
}" ) ;
206
248
}
207
249
250
+ private static void DisplayNamesDictionary ( StringBuilder sourceBuilder , string symbolName , EnumDeclarationSyntax e ,
251
+ Dictionary < string , string > enumDisplayNames )
252
+ {
253
+ sourceBuilder . Append ( $@ "
254
+ public static readonly ImmutableDictionary<{ symbolName } , string> { SourceGeneratorHelper . PropertyDisplayNamesDictionary } = new Dictionary<{ symbolName } , string>
255
+ {{
256
+ " ) ;
257
+ foreach ( var member in e . Members )
258
+ {
259
+ var key = member . Identifier . ValueText ;
260
+ var enumDisplayName = enumDisplayNames . TryGetValue ( key , out var found )
261
+ ? found
262
+ : key ;
263
+ sourceBuilder . AppendLine (
264
+ $@ " {{{symbolName}.{ member . Identifier . ValueText } , ""{ enumDisplayName ?? key } ""}},") ;
265
+ }
266
+ sourceBuilder . Append (
267
+ @"
268
+ }.ToImmutableDictionary();
269
+ " ) ;
270
+ }
271
+
272
+ private static void DisplayDescriptionsDictionary ( StringBuilder sourceBuilder , string symbolName , EnumDeclarationSyntax e ,
273
+ Dictionary < string , string > enumDescriptionNames )
274
+ {
275
+ sourceBuilder . Append ( $@ "
276
+ public static readonly ImmutableDictionary<{ symbolName } , string> { SourceGeneratorHelper . PropertyDisplayDescriptionsDictionary } = new Dictionary<{ symbolName } , string>
277
+ {{
278
+ " ) ;
279
+ foreach ( var member in e . Members )
280
+ {
281
+ var key = member . Identifier . ValueText ;
282
+ var enumDescription = enumDescriptionNames . TryGetValue ( key , out var found )
283
+ ? found
284
+ : key ;
285
+ sourceBuilder . AppendLine (
286
+ $@ " {{{symbolName}.{ member . Identifier . ValueText } , ""{ enumDescription ?? key } ""}},") ;
287
+ }
288
+ sourceBuilder . Append (
289
+ @"
290
+ }.ToImmutableDictionary();
291
+ " ) ;
292
+ }
293
+
208
294
private static void GetValuesFast ( StringBuilder sourceBuilder , string symbolName , EnumDeclarationSyntax e )
209
295
{
210
296
sourceBuilder . Append ( $@ "
0 commit comments