@@ -17,12 +17,12 @@ public void Initialize(GeneratorInitializationContext context)
1717
1818 public void Execute ( GeneratorExecutionContext context )
1919 {
20- //#if DEBUG
21- // if (!Debugger.IsAttached)
22- // {
23- // Debugger.Launch();
24- // }
25- //#endif
20+ //#if DEBUG
21+ // if (!Debugger.IsAttached)
22+ // {
23+ // Debugger.Launch();
24+ // }
25+ //#endif
2626 context . AddSource ( $ "{ SourceGeneratorHelper . AttributeName } Attribute.g.cs", SourceText . From ( $@ "using System;
2727namespace { SourceGeneratorHelper . NameSpace }
2828{{
@@ -69,113 +69,181 @@ public sealed class {SourceGeneratorHelper.AttributeName}Attribute : Attribute
6969 // .DefaultIfEmpty(SourceGeneratorHelper.ExtensionMethodName).First()
7070 // : SourceGeneratorHelper.ExtensionMethodName;
7171
72+
73+ /**********************/
74+ var memberAttribute = new Dictionary < string , string > ( ) ;
75+ foreach ( var member in enumSymbol . GetMembers ( ) )
76+ {
77+ if ( member is not IFieldSymbol field
78+ || field . ConstantValue is null )
79+ continue ;
80+
81+ foreach ( var attribute in member . GetAttributes ( ) )
82+ {
83+ if ( attribute . AttributeClass is null ||
84+ attribute . AttributeClass . Name != "DisplayAttribute" ) continue ;
85+
86+ foreach ( var namedArgument in attribute . NamedArguments )
87+ if ( namedArgument . Key . Equals ( "Name" , StringComparison . OrdinalIgnoreCase ) &&
88+ namedArgument . Value . Value ? . ToString ( ) is { } dn )
89+ {
90+ memberAttribute . Add ( member . Name , dn ) ;
91+ break ;
92+ }
93+ }
94+ }
95+
7296 var sourceBuilder = new StringBuilder ( $@ "using System;
7397namespace { SourceGeneratorHelper . NameSpace }
7498{{
7599 public static class { symbol . Name } EnumExtensions
76100 {{" ) ;
77101
78102 //ToStringFast
79- sourceBuilder . Append ( $@ "
80- public static string { SourceGeneratorHelper . ExtensionMethodNameToString } (this { symbolName } states)
103+ ToStringFast ( sourceBuilder , symbolName , e ) ;
104+
105+ //IsDefined enum
106+ IsDefinedEnum ( sourceBuilder , symbolName , e ) ;
107+
108+ //IsDefined string
109+ IsDefinedString ( sourceBuilder , e , symbolName ) ;
110+
111+ //ToDisplay string
112+ ToDisplay ( sourceBuilder , symbolName , e , memberAttribute ) ;
113+
114+ //GetValues
115+ GetValuesFast ( sourceBuilder , symbolName , e ) ;
116+
117+ //GetNames
118+ GetNamesFast ( sourceBuilder , symbolName , e ) ;
119+
120+ //GetLength
121+ GetLengthFast ( sourceBuilder , symbolName , e ) ;
122+
123+ sourceBuilder . Append ( @"
124+ }
125+ }
126+ " ) ;
127+
128+ context . AddSource ( $ "{ symbol . Name } _EnumGenerator.g.cs",
129+ SourceText . From ( sourceBuilder . ToString ( ) , Encoding . UTF8 ) ) ;
130+ }
131+ }
132+
133+ private static void ToDisplay ( StringBuilder sourceBuilder , string symbolName , EnumDeclarationSyntax e ,
134+ Dictionary < string , string > memberAttribute )
135+ {
136+ sourceBuilder . Append ( $@ "
137+ public static string { SourceGeneratorHelper . ExtensionMethodNameToDisplay } (this { symbolName } states)
81138 {{
82139 return states switch
83140 {{
84141" ) ;
85- foreach ( var member in e . Members . Select ( x => x . Identifier . ValueText ) )
86- sourceBuilder . AppendLine ( $@ " { symbolName } .{ member } => nameof({ symbolName } .{ member } ),") ;
87- sourceBuilder . Append (
88- @" _ => throw new ArgumentOutOfRangeException(nameof(states), states, null)
142+ foreach ( var member in e . Members )
143+ {
144+ var display = memberAttribute
145+ . FirstOrDefault ( r =>
146+ r . Key . Equals ( member . Identifier . ValueText , StringComparison . OrdinalIgnoreCase ) )
147+ . Value
148+ ?? member . Identifier . ValueText ;
149+
150+ sourceBuilder . AppendLine (
151+ $@ " { symbolName } .{ member . Identifier . ValueText } => ""{ display } "",") ;
152+ }
153+
154+ sourceBuilder . Append (
155+ @" _ => throw new ArgumentOutOfRangeException(nameof(states), states, null)
89156 };
90157 }" ) ;
158+ }
91159
160+ private static void IsDefinedString ( StringBuilder sourceBuilder , EnumDeclarationSyntax e , string symbolName )
161+ {
162+ sourceBuilder . Append ( $@ "
163+ public static bool { SourceGeneratorHelper . ExtensionMethodNameIsDefined } (string states)
164+ {{
165+ return states switch
166+ {{
167+ " ) ;
168+ foreach ( var member in e . Members . Select ( x => x . Identifier . ValueText ) )
169+ sourceBuilder . AppendLine ( $@ " nameof({ symbolName } .{ member } ) => true,") ;
170+ sourceBuilder . Append (
171+ @" _ => throw new ArgumentOutOfRangeException(nameof(states), states, null)
172+ };
173+ }" ) ;
174+ }
92175
93- //IsDefined enum
94- sourceBuilder . Append ( $@ "
176+ private static void IsDefinedEnum ( StringBuilder sourceBuilder , string symbolName , EnumDeclarationSyntax e )
177+ {
178+ sourceBuilder . Append ( $@ "
95179 public static bool { SourceGeneratorHelper . ExtensionMethodNameIsDefined } ({ symbolName } states)
96180 {{
97181 return states switch
98182 {{
99183" ) ;
100- foreach ( var member in e . Members . Select ( x => x . Identifier . ValueText ) )
101- sourceBuilder . AppendLine ( $@ " { symbolName } .{ member } => true,") ;
102- sourceBuilder . Append (
103- @" _ => throw new ArgumentOutOfRangeException(nameof(states), states, null)
184+ foreach ( var member in e . Members . Select ( x => x . Identifier . ValueText ) )
185+ sourceBuilder . AppendLine ( $@ " { symbolName } .{ member } => true,") ;
186+ sourceBuilder . Append (
187+ @" _ => throw new ArgumentOutOfRangeException(nameof(states), states, null)
104188 };
105189 }" ) ;
190+ }
106191
107-
108- //IsDefined string
109- sourceBuilder . Append ( $@ "
110- public static bool { SourceGeneratorHelper . ExtensionMethodNameIsDefined } (string states)
192+ private static void ToStringFast ( StringBuilder sourceBuilder , string symbolName , EnumDeclarationSyntax e )
193+ {
194+ sourceBuilder . Append ( $@ "
195+ public static string { SourceGeneratorHelper . ExtensionMethodNameToString } (this { symbolName } states)
111196 {{
112197 return states switch
113198 {{
114199" ) ;
115- foreach ( var member in e . Members . Select ( x => x . Identifier . ValueText ) )
116- sourceBuilder . AppendLine ( $@ " nameof( { symbolName } .{ member } ) => true ,") ;
117- sourceBuilder . Append (
118- @" _ => throw new ArgumentOutOfRangeException(nameof(states), states, null)
200+ foreach ( var member in e . Members . Select ( x => x . Identifier . ValueText ) )
201+ sourceBuilder . AppendLine ( $@ " { symbolName } .{ member } => nameof( { symbolName } . { member } ) ,") ;
202+ sourceBuilder . Append (
203+ @" _ => throw new ArgumentOutOfRangeException(nameof(states), states, null)
119204 };
120205 }" ) ;
206+ }
121207
208+ private static void GetValuesFast ( StringBuilder sourceBuilder , string symbolName , EnumDeclarationSyntax e )
209+ {
210+ sourceBuilder . Append ( $@ "
211+ public static { symbolName } [] { SourceGeneratorHelper . ExtensionMethodNameGetValues } ()
212+ {{
213+ return new[]
214+ {{
215+ " ) ;
216+ foreach ( var member in e . Members . Select ( x => x . Identifier . ValueText ) )
217+ sourceBuilder . AppendLine ( $@ " { symbolName } .{ member } ,") ;
122218
123- /**********************/
124- var memberAttribute = new Dictionary < string , string > ( ) ;
125- foreach ( var member in enumSymbol . GetMembers ( ) )
126- {
127- if ( member is not IFieldSymbol field
128- || field . ConstantValue is null )
129- continue ;
130-
131- foreach ( var attribute in member . GetAttributes ( ) )
132- {
133- if ( attribute . AttributeClass is null ||
134- attribute . AttributeClass . Name != "DisplayAttribute" ) continue ;
135-
136- foreach ( var namedArgument in attribute . NamedArguments )
137- if ( namedArgument . Key . Equals ( "Name" , StringComparison . OrdinalIgnoreCase ) &&
138- namedArgument . Value . Value ? . ToString ( ) is { } dn )
139- {
140- memberAttribute . Add ( member . Name , dn ) ;
141- break ;
142- }
143- }
144- }
145-
219+ sourceBuilder . Append ( @" };
220+ }" ) ;
221+ }
146222
147- //ToDisplay string
148- sourceBuilder . Append ( $@ "
149- public static string { SourceGeneratorHelper . ExtensionMethodNameToDisplay } (this { symbolName } states)
223+ private static void GetNamesFast ( StringBuilder sourceBuilder , string symbolName , EnumDeclarationSyntax e )
224+ {
225+ sourceBuilder . Append ( $@ "
226+ public static string[] { SourceGeneratorHelper . ExtensionMethodNameGetNames } ()
150227 {{
151- return states switch
228+ return new[]
152229 {{
153230" ) ;
154- //foreach (var member in e.Members.Select(x => x.Identifier.ValueText))
155- foreach ( var member in e . Members )
156- {
157- var display = memberAttribute
158- . FirstOrDefault ( r =>
159- r . Key . Equals ( member . Identifier . ValueText , StringComparison . OrdinalIgnoreCase ) )
160- . Value
161- ?? member . Identifier . ValueText ;
162-
163- sourceBuilder . AppendLine (
164- $@ " { symbolName } .{ member . Identifier . ValueText } => ""{ display } "",") ;
165- }
231+ foreach ( var member in e . Members . Select ( x => x . Identifier . ValueText ) )
232+ sourceBuilder . AppendLine ( $@ " nameof({ symbolName } .{ member } ),") ;
166233
167- sourceBuilder . Append (
168- @" _ => throw new ArgumentOutOfRangeException(nameof(states), states, null)
169- };
234+ sourceBuilder . Append ( @" };
170235 }" ) ;
171-
172- sourceBuilder . Append ( @"
173236 }
174- }
237+
238+ private static void GetLengthFast ( StringBuilder sourceBuilder , string symbolName , EnumDeclarationSyntax e )
239+ {
240+ sourceBuilder . Append ( $@ "
241+ public static int { SourceGeneratorHelper . ExtensionMethodNameGetLength } ()
242+ {{
243+ return { e . Members . Count } ;
175244" ) ;
176245
177- context . AddSource ( $ "{ symbol . Name } _EnumGenerator.g.cs",
178- SourceText . From ( sourceBuilder . ToString ( ) , Encoding . UTF8 ) ) ;
179- }
246+ sourceBuilder . Append ( @"
247+ }" ) ;
180248 }
181249}
0 commit comments