Skip to content

Commit bbaf740

Browse files
committed
Support named argument
1 parent efa0c67 commit bbaf740

18 files changed

+167
-11
lines changed

NetEscapades.EnumGenerators4/src/NetEscapades.EnumGenerators/EnumGenerator.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,26 @@ static List<EnumToGenerate> GetTypesToGenerate(Compilation compilation, IEnumera
111111
}
112112

113113
string enumName = enumSymbol.ToString();
114+
string extensionName = "EnumExtensions";
115+
116+
foreach (AttributeData attributeData in enumSymbol.GetAttributes())
117+
{
118+
if (!enumAttribute.Equals(attributeData.AttributeClass, SymbolEqualityComparer.Default))
119+
{
120+
continue;
121+
}
122+
123+
foreach (KeyValuePair<string, TypedConstant> namedArgument in attributeData.NamedArguments)
124+
{
125+
if (namedArgument.Key == "ExtensionClassName"
126+
&& namedArgument.Value.Value?.ToString() is { } n)
127+
{
128+
extensionName = n;
129+
}
130+
}
131+
break;
132+
}
133+
114134
ImmutableArray<ISymbol> enumMembers = enumSymbol.GetMembers();
115135
var members = new List<string>(enumMembers.Length);
116136

@@ -122,7 +142,7 @@ static List<EnumToGenerate> GetTypesToGenerate(Compilation compilation, IEnumera
122142
}
123143
}
124144

125-
enumsToGenerate.Add(new EnumToGenerate(enumName, members));
145+
enumsToGenerate.Add(new EnumToGenerate(extensionName, enumName, members));
126146
}
127147

128148
return enumsToGenerate;

NetEscapades.EnumGenerators4/src/NetEscapades.EnumGenerators/EnumToGenerate.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
public readonly struct EnumToGenerate
44
{
5+
public readonly string ExtensionName;
56
public readonly string Name;
67
public readonly List<string> Values;
78

8-
public EnumToGenerate(string name, List<string> values)
9+
public EnumToGenerate(string extensionName, string name, List<string> values)
910
{
1011
Name = name;
1112
Values = values;
13+
ExtensionName = extensionName;
1214
}
1315
}

NetEscapades.EnumGenerators4/src/NetEscapades.EnumGenerators/SourceGenerationHelper.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,20 @@ namespace NetEscapades.EnumGenerators
1010
[System.AttributeUsage(System.AttributeTargets.Enum)]
1111
public class EnumExtensionsAttribute : System.Attribute
1212
{
13+
public string ExtensionClassName { get; set; }
1314
}
1415
}";
1516
public static string GenerateExtensionClass(List<EnumToGenerate> enumsToGenerate)
1617
{
1718
var sb = new StringBuilder();
1819
sb.Append(@"
1920
namespace NetEscapades.EnumGenerators
20-
{
21-
public static partial class EnumExtensions
22-
{");
21+
{");
2322
foreach(var enumToGenerate in enumsToGenerate)
2423
{
2524
sb.Append(@"
25+
public static partial class ").Append(enumToGenerate.ExtensionName).Append(@"
26+
{
2627
public static string ToStringFast(this ").Append(enumToGenerate.Name).Append(@" value)
2728
=> value switch
2829
{");
@@ -38,11 +39,10 @@ public static string ToStringFast(this ").Append(enumToGenerate.Name).Append(@"
3839
sb.Append(@"
3940
_ => value.ToString(),
4041
};
42+
}
4143
");
4244
}
43-
sb.Append(@"
44-
}
45-
}");
45+
sb.Append('}');
4646

4747
return sb.ToString();
4848
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace NetEscapades.EnumGenerators.IntegrationTests;
2+
3+
[EnumExtensions(ExtensionClassName = "DirectionExtensions")]
4+
public enum Direction
5+
{
6+
Left,
7+
Right,
8+
Up,
9+
Down,
10+
}

NetEscapades.EnumGenerators4/tests/NetEscapades.EnumGenerators.IntegrationTests/EnumExtensionsTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,16 @@ public void FastToStringIsSameAsToString(Colour value)
1717

1818
Assert.Equal(expected, actual);
1919
}
20+
21+
[Theory]
22+
[InlineData(Direction.Up)]
23+
[InlineData((Direction)15)]
24+
[InlineData((Direction)0)]
25+
public void CustomExtensionNameToStringFast(Direction value)
26+
{
27+
var expected = value.ToString();
28+
var actual = value.ToStringFast();
29+
30+
Assert.Equal(expected, actual);
31+
}
2032
}

NetEscapades.EnumGenerators4/tests/NetEscapades.EnumGenerators.Tests/EnumGeneratorSnapshotTests.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,48 @@ public enum Colour
9292
9393
[EnumExtensions]
9494
public enum Direction
95+
{
96+
Left,
97+
Right,
98+
Up,
99+
Down,
100+
}";
101+
102+
return TestHelper.Verify(source);
103+
}
104+
105+
[Fact]
106+
public Task GeneratesCustomEnumNameCorrectly()
107+
{
108+
var source = @"
109+
using NetEscapades.EnumGenerators;
110+
111+
[EnumExtensions(ExtensionClassName = ""ColourExtensions"")]
112+
public enum Colour // Yes, I'm British
113+
{
114+
Red = 0,
115+
Blue = 1,
116+
}";
117+
118+
return TestHelper.Verify(source);
119+
}
120+
121+
[Fact]
122+
public Task GeneratesCustomEnumNameCorrectly_TwoAttributes()
123+
{
124+
var source = @"
125+
using NetEscapades.EnumGenerators;
126+
127+
[EnumExtensions(ExtensionClassName = ""ColourExtensions"")]
128+
public enum Colour
129+
{
130+
Red = 0,
131+
Blue = 1,
132+
}
133+
134+
135+
[EnumExtensions(ExtensionClassName = ""DirectionExtensions"")]
136+
public enum Direction
95137
{
96138
Left,
97139
Right,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//HintName: EnumExtensionsAttribute.g.cs
2+
3+
4+
namespace NetEscapades.EnumGenerators
5+
{
6+
[System.AttributeUsage(System.AttributeTargets.Enum)]
7+
public class EnumExtensionsAttribute : System.Attribute
8+
{
9+
public string ExtensionClassName { get; set; }
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//HintName: EnumExtensions.g.cs
2+
3+
namespace NetEscapades.EnumGenerators
4+
{
5+
public static partial class ColourExtensions
6+
{
7+
public static string ToStringFast(this Colour value)
8+
=> value switch
9+
{
10+
Colour.Red => nameof(Colour.Red),
11+
Colour.Blue => nameof(Colour.Blue),
12+
_ => value.ToString(),
13+
};
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//HintName: EnumExtensionsAttribute.g.cs
2+
3+
4+
namespace NetEscapades.EnumGenerators
5+
{
6+
[System.AttributeUsage(System.AttributeTargets.Enum)]
7+
public class EnumExtensionsAttribute : System.Attribute
8+
{
9+
public string ExtensionClassName { get; set; }
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//HintName: EnumExtensions.g.cs
2+
3+
namespace NetEscapades.EnumGenerators
4+
{
5+
public static partial class ColourExtensions
6+
{
7+
public static string ToStringFast(this Colour value)
8+
=> value switch
9+
{
10+
Colour.Red => nameof(Colour.Red),
11+
Colour.Blue => nameof(Colour.Blue),
12+
_ => value.ToString(),
13+
};
14+
}
15+
16+
public static partial class DirectionExtensions
17+
{
18+
public static string ToStringFast(this Direction value)
19+
=> value switch
20+
{
21+
Direction.Left => nameof(Direction.Left),
22+
Direction.Right => nameof(Direction.Right),
23+
Direction.Up => nameof(Direction.Up),
24+
Direction.Down => nameof(Direction.Down),
25+
_ => value.ToString(),
26+
};
27+
}
28+
}

0 commit comments

Comments
 (0)