Skip to content

Commit db1736d

Browse files
committed
feat(cs): Enum value casing
1 parent 1aa7f23 commit db1736d

4 files changed

Lines changed: 81 additions & 9 deletions

File tree

hosts/dotnet/Hako.SourceGenerator/JSBindingGenerator.Bindings.cs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,8 @@ private static void GenerateModuleMethodExport(StringBuilder sb, ModuleModel mod
762762
var requiredParams = method.Parameters.Count(p => !p.IsOptional);
763763
var methodType = method.IsAsync ? "SetFunctionAsync" : "SetFunction";
764764

765-
sb.AppendLine($" init.{methodType}(\"{method.JsName}\", {(method.IsAsync ? "async " : "")}(ctx, thisArg, args) =>");
765+
sb.AppendLine(
766+
$" init.{methodType}(\"{method.JsName}\", {(method.IsAsync ? "async " : "")}(ctx, thisArg, args) =>");
766767
sb.AppendLine(" {");
767768

768769
if (requiredParams > 0)
@@ -820,9 +821,9 @@ private static void GenerateModuleMethodExport(StringBuilder sb, ModuleModel mod
820821
}
821822

822823
#endregion
823-
824+
824825
#region Name Casing Helpers
825-
826+
826827
private enum NameCasing
827828
{
828829
None = 0,
@@ -833,6 +834,13 @@ private enum NameCasing
833834
Lower = 5
834835
}
835836

837+
private enum ValueCasing
838+
{
839+
Original = 0,
840+
Lower = 1,
841+
Upper = 2
842+
}
843+
836844
private static string ApplyCasing(string name, NameCasing casing)
837845
{
838846
return casing switch
@@ -846,6 +854,16 @@ private static string ApplyCasing(string name, NameCasing casing)
846854
};
847855
}
848856

857+
private static string ApplyValueCasing(string name, ValueCasing casing)
858+
{
859+
return casing switch
860+
{
861+
ValueCasing.Lower => name.ToLowerInvariant(),
862+
ValueCasing.Upper => name.ToUpperInvariant(),
863+
_ => name
864+
};
865+
}
866+
849867
private static string ToSnakeCase(string str)
850868
{
851869
if (string.IsNullOrEmpty(str))

hosts/dotnet/Hako.SourceGenerator/JSBindingGenerator.Enums.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ private static EnumResult GetEnumModel(GeneratorAttributeSyntaxContext context,
2929

3030
var jsEnumName = GetJsEnumName(enumSymbol);
3131
var casing = NameCasing.None;
32+
var valueCasing = ValueCasing.Original;
3233

3334
if (jsEnumAttr != null)
3435
{
@@ -38,6 +39,10 @@ private static EnumResult GetEnumModel(GeneratorAttributeSyntaxContext context,
3839
{
3940
casing = (NameCasing)(int)arg.Value.Value;
4041
}
42+
else if (arg.Key == "ValueCasing" && arg.Value.Value != null)
43+
{
44+
valueCasing = (ValueCasing)(int)arg.Value.Value;
45+
}
4146
}
4247
}
4348

@@ -50,10 +55,13 @@ private static EnumResult GetEnumModel(GeneratorAttributeSyntaxContext context,
5055
if (member.IsImplicitlyDeclared || !member.HasConstantValue)
5156
continue;
5257

58+
var propertyName = ApplyCasing(member.Name, casing);
59+
var valueName = ApplyValueCasing(member.Name, valueCasing);
60+
5361
values.Add(new EnumValueModel
5462
{
55-
Name = member.Name,
56-
JsName = ApplyCasing(member.Name, casing),
63+
Name = valueName,
64+
JsName = propertyName,
5765
Value = member.ConstantValue ?? 0,
5866
Documentation = ExtractXmlDocumentation(member)
5967
});

hosts/dotnet/Hako.SourceGenerator/JSBindingGenerator.cs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,7 @@ private static ModuleResult GetModuleModel(GeneratorAttributeSyntaxContext conte
495495
a.AttributeClass?.ToDisplayString() == "HakoJS.SourceGeneration.JSEnumAttribute");
496496

497497
var casing = NameCasing.None;
498+
var valueCasing = ValueCasing.Original;
498499
if (jsEnumAttr != null)
499500
{
500501
foreach (var arg in jsEnumAttr.NamedArguments)
@@ -503,6 +504,10 @@ private static ModuleResult GetModuleModel(GeneratorAttributeSyntaxContext conte
503504
{
504505
casing = (NameCasing)(int)arg.Value.Value;
505506
}
507+
else if (arg.Key == "ValueCasing" && arg.Value.Value != null)
508+
{
509+
valueCasing = (ValueCasing)(int)arg.Value.Value;
510+
}
506511
}
507512
}
508513

@@ -515,10 +520,13 @@ private static ModuleResult GetModuleModel(GeneratorAttributeSyntaxContext conte
515520
if (member.IsImplicitlyDeclared || !member.HasConstantValue)
516521
continue;
517522

523+
var propertyName = ApplyCasing(member.Name, casing);
524+
var valueName = ApplyValueCasing(member.Name, valueCasing);
525+
518526
enumValues.Add(new EnumValueModel
519527
{
520-
Name = member.Name,
521-
JsName = ApplyCasing(member.Name, casing),
528+
Name = valueName,
529+
JsName = propertyName,
522530
Value = member.ConstantValue ?? 0,
523531
Documentation = ExtractXmlDocumentation(member)
524532
});
@@ -1059,6 +1067,7 @@ private static List<ModuleEnumReference> FindModuleEnumReferences(INamedTypeSymb
10591067
exportName ??= jsEnumName;
10601068

10611069
var casing = NameCasing.None;
1070+
var valueCasing = ValueCasing.Original;
10621071
if (jsEnumAttr != null)
10631072
{
10641073
foreach (var arg in jsEnumAttr.NamedArguments)
@@ -1067,6 +1076,10 @@ private static List<ModuleEnumReference> FindModuleEnumReferences(INamedTypeSymb
10671076
{
10681077
casing = (NameCasing)(int)arg.Value.Value;
10691078
}
1079+
else if (arg.Key == "ValueCasing" && arg.Value.Value != null)
1080+
{
1081+
valueCasing = (ValueCasing)(int)arg.Value.Value;
1082+
}
10701083
}
10711084
}
10721085

@@ -1079,10 +1092,13 @@ private static List<ModuleEnumReference> FindModuleEnumReferences(INamedTypeSymb
10791092
if (member.IsImplicitlyDeclared || !member.HasConstantValue)
10801093
continue;
10811094

1095+
var propertyName = ApplyCasing(member.Name, casing);
1096+
var valueName = ApplyValueCasing(member.Name, valueCasing);
1097+
10821098
values.Add(new EnumValueModel
10831099
{
1084-
Name = member.Name,
1085-
JsName = ApplyCasing(member.Name, casing),
1100+
Name = valueName,
1101+
JsName = propertyName,
10861102
Value = member.ConstantValue ?? 0,
10871103
Documentation = ExtractXmlDocumentation(member)
10881104
});

hosts/dotnet/Hako/SourceGeneration/JSEnumAttribute.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,30 @@ public enum NameCasing
4141
Lower
4242
}
4343

44+
/// <summary>
45+
/// Defines simple casing transformations for enum values.
46+
/// </summary>
47+
public enum ValueCasing
48+
{
49+
/// <summary>
50+
/// Keep the original C# value name unchanged.
51+
/// Example: MyValue stays MyValue
52+
/// </summary>
53+
Original = 0,
54+
55+
/// <summary>
56+
/// Convert to lowercase.
57+
/// Example: MyValue becomes myvalue
58+
/// </summary>
59+
Lower,
60+
61+
/// <summary>
62+
/// Convert to uppercase.
63+
/// Example: MyValue becomes MYVALUE
64+
/// </summary>
65+
Upper
66+
}
67+
4468
/// <summary>
4569
/// Marks an enum for JavaScript marshaling.
4670
/// Regular enums marshal as strings, [Flags] enums marshal as numbers.
@@ -58,4 +82,10 @@ public class JSEnumAttribute : Attribute
5882
/// Default is None (keeps original C# naming).
5983
/// </summary>
6084
public NameCasing Casing { get; set; } = NameCasing.None;
85+
86+
/// <summary>
87+
/// Controls the casing style of enum values when marshaling to JavaScript.
88+
/// Default is Original (keeps original C# value names).
89+
/// </summary>
90+
public ValueCasing ValueCasing { get; set; } = ValueCasing.Original;
6191
}

0 commit comments

Comments
 (0)