Skip to content

Commit 2f6d9bb

Browse files
authored
Merge pull request #2 from EngRajabi/cleanup
add more methods
2 parents 218cbc4 + 4f493b9 commit 2f6d9bb

File tree

8 files changed

+259
-80
lines changed

8 files changed

+259
-80
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,7 @@
1+
## 1.0.11
2+
- Add method GetValuesFast
3+
- Add method GetNamesFast
4+
- Add method GetLengthFast
5+
16
## 1.0.10
27
- Add method ToDisplayFast

README.md

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://raw.githubusercontent.com/EngRajabi/Enum.Source.Generator/master/LICENSE)
22
[![Nuget](https://img.shields.io/nuget/dt/Supernova.Enum.Generators?label=Nuget.org%20Downloads&style=flat-square&color=blue)](https://www.nuget.org/packages/Supernova.Enum.Generators)
3+
[![Nuget](https://img.shields.io/nuget/vpre/Supernova.Enum.Generators.svg?label=NuGet)](https://www.nuget.org/packages/Supernova.Enum.Generators)
34

45
# Supernova.Enum.Generators
56
# The best Source Generator for working with enums in C#
@@ -79,25 +80,54 @@ For example:
7980
_ => throw new ArgumentOutOfRangeException(nameof(states), states, null)
8081
};
8182
}
83+
public static UnitTests.UserTypeTest[] GetValuesFast()
84+
{
85+
return new[]
86+
{
87+
UnitTests.UserTypeTest.Men,
88+
UnitTests.UserTypeTest.Women,
89+
UnitTests.UserTypeTest.None,
90+
};
91+
}
92+
public static string[] GetNamesFast()
93+
{
94+
return new[]
95+
{
96+
nameof(UnitTests.UserTypeTest.Men),
97+
nameof(UnitTests.UserTypeTest.Women),
98+
nameof(UnitTests.UserTypeTest.None),
99+
};
100+
}
101+
public static int GetLengthFast()
102+
{
103+
return 3;
104+
105+
}
82106
}
83107
```
84108

85109
You do not see this file inside the project. But you can use it.
86110

87111
Usage
88112
```csharp
89-
var stringEnum = UserType.Men.StringToFast(); //Men;
113+
var stringEnum = UserTypeTest.Men.StringToFast(); //Men;
90114
91115
var isDefined = UserTypeTestEnumExtensions.IsDefinedFast(UserType.Men); //true;
92116
93-
var displayEnum = UserType.Men.ToDisplayFast(); //مرد
117+
var displayEnum = UserTypeTest.Men.ToDisplayFast(); //مرد
118+
119+
var names = UserTypeTestEnumExtensions.GetNamesFast(); //string[]
120+
121+
var values = UserTypeTestEnumExtensions.GetValuesFast(); //UserType[]
122+
123+
var length = UserTypeTestEnumExtensions.GetLengthFast(); //3
94124
```
95125

96126
If you had trouble using UserTypeTestEnumExtensions and the IDE did not recognize it. This is an IDE problem and you need to restart the IDE once.
97127

98128
Benchmark
99129

100-
![Benchmark](https://raw.githubusercontent.com/EngRajabi/Enum.Source.Generator/master/Supernova.Enum.Generators.png?v=1)
130+
![Benchmark](https://raw.githubusercontent.com/EngRajabi/Enum.Source.Generator/master/Supernova.Enum.Generators.png?v=4)
101131

102132
## Contributing
103133

Supernova.Enum.Generators.png

16.6 KB
Loading

Supernova.Enum.Generators/EnumSourceGenerator.cs

Lines changed: 142 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
2727
namespace {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;
7397
namespace {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
}

Supernova.Enum.Generators/SourceGeneratorHelper.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ public static class SourceGeneratorHelper
1616
public const string ExtensionMethodNameToString = "StringToFast";
1717
public const string ExtensionMethodNameIsDefined = "IsDefinedFast";
1818
public const string ExtensionMethodNameToDisplay = "ToDisplayFast";
19+
public const string ExtensionMethodNameGetValues = "GetValuesFast";
20+
public const string ExtensionMethodNameGetNames = "GetNamesFast";
21+
public const string ExtensionMethodNameGetLength = "GetLengthFast";
1922

2023
public const string Attribute = Header + $@"
2124

Supernova.Enum.Generators/Supernova.Enum.Generators.csproj

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@
55
<PackageId>Supernova.Enum.Generators</PackageId>
66
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
77
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
8-
<Version>1.0.10</Version>
9-
<PackageVersion>1.0.10</PackageVersion>
10-
<AssemblyVersion>1.0.10</AssemblyVersion>
8+
<Version>1.0.11</Version>
9+
<PackageVersion>1.0.11</PackageVersion>
10+
<AssemblyVersion>1.0.11</AssemblyVersion>
1111
<PackageReadmeFile>README.md</PackageReadmeFile>
1212
<PackageIcon>icon.png</PackageIcon>
13+
<PackageReleaseNotes>v1.0.11
14+
- Add method GetValuesFast
15+
- Add method GetNamesFast
16+
- Add method GetLengthFast</PackageReleaseNotes>
1317
</PropertyGroup>
1418

1519
<ItemGroup>

0 commit comments

Comments
 (0)