Skip to content

Commit cf87296

Browse files
committed
Add new TransformFlags mod
This adds a "None = 0" member to Flags enums if they do not have an equivalent already
1 parent 650cc97 commit cf87296

File tree

112 files changed

+298
-3
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

112 files changed

+298
-3
lines changed

.silktouch/ce8a69a66cd3bd3f.stout

0 Bytes
Binary file not shown.

generator.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@
173173
"TransformHandles",
174174
"TransformFunctions",
175175
"TransformProperties",
176+
"TransformFlags",
176177
"AddVTables"
177178
],
178179
"ClangScraper": {

sources/SilkTouch/SilkTouch/Mods/Common/ModLoader.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class ModLoader
2626
nameof(AddApiProfiles) => typeof(AddApiProfiles),
2727
nameof(MixKhronosData) => typeof(MixKhronosData),
2828
nameof(TransformHandles) => typeof(TransformHandles),
29+
nameof(TransformFlags) => typeof(TransformFlags),
2930
nameof(ExtractNestedTyping) => typeof(ExtractNestedTyping),
3031
nameof(TransformProperties) => typeof(TransformProperties),
3132
nameof(ClangScraper) => typeof(ClangScraper),
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
using Microsoft.CodeAnalysis;
2+
using Microsoft.CodeAnalysis.CSharp;
3+
using Microsoft.CodeAnalysis.CSharp.Syntax;
4+
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
5+
6+
namespace Silk.NET.SilkTouch.Mods;
7+
8+
/// <summary>
9+
/// Transforms [Flags] enums to have a "None = 0" member if they do not already have an equivalent.
10+
/// </summary>
11+
public class TransformFlags : IMod
12+
{
13+
/// <inheritdoc />
14+
public async Task ExecuteAsync(IModContext ctx, CancellationToken ct = default)
15+
{
16+
var proj = ctx.SourceProject;
17+
if (proj == null)
18+
{
19+
return;
20+
}
21+
22+
var compilation = await proj.GetCompilationAsync(ct);
23+
if (compilation == null)
24+
{
25+
return;
26+
}
27+
28+
var rewriter = new Rewriter(compilation);
29+
foreach (var docId in proj?.DocumentIds ?? [])
30+
{
31+
var doc = proj!.GetDocument(docId) ?? throw new InvalidOperationException("Document missing");
32+
proj = doc.WithSyntaxRoot(
33+
rewriter.Visit(await doc.GetSyntaxRootAsync(ct))?.NormalizeWhitespace()
34+
?? throw new InvalidOperationException("Visit returned null.")
35+
).Project;
36+
}
37+
38+
ctx.SourceProject = proj;
39+
}
40+
41+
private class Rewriter(Compilation compilation) : CSharpSyntaxRewriter
42+
{
43+
public override SyntaxNode? VisitEnumDeclaration(EnumDeclarationSyntax node)
44+
{
45+
var isFlagsEnum = node.AttributeLists.SelectMany(list => list.Attributes)
46+
.Any(attribute => attribute.IsAttribute("System.Flags"));
47+
48+
if (!isFlagsEnum)
49+
{
50+
return base.VisitEnumDeclaration(node);
51+
}
52+
53+
var semanticModel = compilation.GetSemanticModel(node.SyntaxTree);
54+
var symbol = semanticModel.GetDeclaredSymbol(node);
55+
if (symbol == null)
56+
{
57+
return base.VisitEnumDeclaration(node);
58+
}
59+
60+
// Add None member if it doesn't exist yet
61+
var hasNoneMember = node.Members.Any(
62+
member => member.Identifier.Text == "None"
63+
|| (member.EqualsValue != null && semanticModel.GetConstantValue(member.EqualsValue.Value).Value is 0));
64+
65+
if (!hasNoneMember)
66+
{
67+
var noneMember = EnumMemberDeclaration("None")
68+
.WithEqualsValue(
69+
EqualsValueClause(
70+
LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(0))
71+
)
72+
);
73+
74+
node = node.WithMembers(node.Members.Insert(0, noneMember));
75+
}
76+
77+
return base.VisitEnumDeclaration(node);
78+
}
79+
}
80+
}

sources/Vulkan/Vulkan/Enums/AccessFlags3KHR.gen.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ namespace Silk.NET.Vulkan;
1313
[Flags]
1414
public enum AccessFlags3KHR : ulong
1515
{
16+
None = 0,
1617
Access3NoneKHR = unchecked((ulong)0UL),
1718
}

sources/Vulkan/Vulkan/Enums/BufferUsageFlags2.gen.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ namespace Silk.NET.Vulkan;
1313
[Flags]
1414
public enum BufferUsageFlags2 : ulong
1515
{
16+
None = 0,
1617
TransferSrcBit = unchecked((ulong)0x00000001UL),
1718
TransferDstBit = unchecked((ulong)0x00000002UL),
1819
UniformTexelBufferBit = unchecked((ulong)0x00000004UL),

sources/Vulkan/Vulkan/Enums/ExportMetalObjectTypeFlagsEXT.gen.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,7 @@ namespace Silk.NET.Vulkan;
1111

1212
[Transformed]
1313
[Flags]
14-
public enum ExportMetalObjectTypeFlagsEXT : uint { }
14+
public enum ExportMetalObjectTypeFlagsEXT : uint
15+
{
16+
None = 0,
17+
}

sources/Vulkan/Vulkan/Enums/FormatFeatureFlags2.gen.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ namespace Silk.NET.Vulkan;
1313
[Flags]
1414
public enum FormatFeatureFlags2 : ulong
1515
{
16+
None = 0,
1617
SampledImageBit = unchecked((ulong)0x00000001UL),
1718
StorageImageBit = unchecked((ulong)0x00000002UL),
1819
StorageImageAtomicBit = unchecked((ulong)0x00000004UL),

sources/Vulkan/Vulkan/Enums/ImageConstraintsInfoFlagsFuchsia.gen.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,7 @@ namespace Silk.NET.Vulkan;
1111

1212
[Transformed]
1313
[Flags]
14-
public enum ImageConstraintsInfoFlagsFuchsia : uint { }
14+
public enum ImageConstraintsInfoFlagsFuchsia : uint
15+
{
16+
None = 0,
17+
}

sources/Vulkan/Vulkan/Enums/MemoryDecompressionMethodFlagsNV.gen.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ namespace Silk.NET.Vulkan;
1313
[Flags]
1414
public enum MemoryDecompressionMethodFlagsNV : ulong
1515
{
16+
None = 0,
1617
Gdeflate1X0BitNV = unchecked((ulong)0x00000001UL),
1718
}

0 commit comments

Comments
 (0)