Skip to content

Commit

Permalink
[bgen] Add methods to convert between arrays of strong enum values an…
Browse files Browse the repository at this point in the history
…d their underlying native enum type. (#21089)

This will be helpful for some new Xcode 16 APIs.
  • Loading branch information
rolfbjarne committed Aug 27, 2024
1 parent c90fc43 commit da709f1
Show file tree
Hide file tree
Showing 9 changed files with 122 additions and 14 deletions.
41 changes: 41 additions & 0 deletions src/bgen/Enums.cs
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,47 @@ void GenerateEnum (Type type)
indent--;
print ("}");

if (BindingTouch.SupportsXmlDocumentation) {
print ($"/// <summary>Converts an array of <see cref=\"global::{type.FullName}\" /> enum values into an array of their corresponding constants.</summary>");
print ($"/// <param name=\"values\">The array of enum values to convert.</param>");
}
print ($"internal static {backingFieldTypeName}?[]? ToConstantArray (this {type.Name}[]? values)");
print ("{");
indent++;
print ("if (values is null)");
print ("\treturn null;");
print ($"var rv = new global::System.Collections.Generic.List<{backingFieldTypeName}?> ();");
print ("for (var i = 0; i < values.Length; i++) {");
indent++;
print ("var value = values [i];");
print ("rv.Add (value.GetConstant ());");
indent--;
print ("}");
print ("return rv.ToArray ();");
indent--;
print ("}");
print ("");
if (BindingTouch.SupportsXmlDocumentation) {
print ($"/// <summary>Converts an array of <see cref=\"{backingFieldTypeName}\" /> values into an array of their corresponding enum values.</summary>");
print ($"/// <param name=\"values\">The array if <see cref=\"{backingFieldTypeName}\" /> values to convert.</param>");
}
print ($"internal static {type.Name}[]? ToEnumArray (this {backingFieldTypeName}[]? values)");
print ("{");
indent++;
print ("if (values is null)");
print ("\treturn null;");
print ($"var rv = new global::System.Collections.Generic.List<{type.Name}> ();");
print ("for (var i = 0; i < values.Length; i++) {");
indent++;
print ("var value = values [i];");
print ("rv.Add (GetValue (value));");
indent--;
print ("}");
print ("return rv.ToArray ();");
indent--;
print ("}");
print ("");

if (isFlagsEnum) {
if (BindingTouch.SupportsXmlDocumentation) {
print ($"/// <summary>Retrieves all the <see cref=\"global::{type.FullName}\" /> constants named by the flags <paramref name=\"value\" />.</summary>");
Expand Down
39 changes: 25 additions & 14 deletions tests/generator/BGenTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1648,20 +1648,31 @@ public void BackingFieldType (Profile profile)
const string nuintName = "System.nuint";
#endif

var nsNumberGetConstant = bgen.ApiAssembly.MainModule.GetType ("BackingField", "NSNumberFieldTypeExtensions").Methods.First ((v) => v.Name == "GetConstant");
Assert.AreEqual ("Foundation.NSNumber", nsNumberGetConstant.ReturnType.FullName, "NSNumber #1");
var nsNumberGetValue = bgen.ApiAssembly.MainModule.GetType ("BackingField", "NSNumberFieldTypeExtensions").Methods.First ((v) => v.Name == "GetValue");
Assert.AreEqual ("Foundation.NSNumber", nsNumberGetValue.Parameters [0].ParameterType.FullName, "NSNumber #2");

var nsNSIntegerGetConstant = bgen.ApiAssembly.MainModule.GetType ("BackingField", "NSIntegerFieldTypeExtensions").Methods.First ((v) => v.Name == "GetConstant");
Assert.AreEqual ($"System.Nullable`1<{nintName}>", nsNSIntegerGetConstant.ReturnType.FullName, "NSInteger #1");
var nsNSIntegerGetValue = bgen.ApiAssembly.MainModule.GetType ("BackingField", "NSIntegerFieldTypeExtensions").Methods.First ((v) => v.Name == "GetValue");
Assert.AreEqual (nintName, nsNSIntegerGetValue.Parameters [0].ParameterType.FullName, "NSInteger #2");

var nsNSUIntegerGetConstant = bgen.ApiAssembly.MainModule.GetType ("BackingField", "NSUIntegerFieldTypeExtensions").Methods.First ((v) => v.Name == "GetConstant");
Assert.AreEqual ($"System.Nullable`1<{nuintName}>", nsNSUIntegerGetConstant.ReturnType.FullName, "NSUInteger #1");
var nsNSUIntegerGetValue = bgen.ApiAssembly.MainModule.GetType ("BackingField", "NSUIntegerFieldTypeExtensions").Methods.First ((v) => v.Name == "GetValue");
Assert.AreEqual (nuintName, nsNSUIntegerGetValue.Parameters [0].ParameterType.FullName, "NSUInteger #2");
var testCases = new [] {
new { BackingFieldType = "NSNumber", NullableType = "Foundation.NSNumber", RenderedBackingFieldType = "Foundation.NSNumber", SimplifiedNullableType = "Foundation.NSNumber" },
new { BackingFieldType = "NSInteger", NullableType = $"System.Nullable`1<{nintName}>", RenderedBackingFieldType = nintName, SimplifiedNullableType = "System.Nullable`1" },
new { BackingFieldType = "NSUInteger", NullableType = $"System.Nullable`1<{nuintName}>", RenderedBackingFieldType = nuintName, SimplifiedNullableType = "System.Nullable`1" },
};

foreach (var tc in testCases) {
var getConstant = bgen.ApiAssembly.MainModule.GetType ("BackingField", $"{tc.BackingFieldType}FieldTypeExtensions").Methods.First ((v) => v.Name == "GetConstant");
Assert.AreEqual (tc.NullableType, getConstant.ReturnType.FullName, $"{tc.BackingFieldType}: GetConstant return type");

var getValue = bgen.ApiAssembly.MainModule.GetType ("BackingField", $"{tc.BackingFieldType}FieldTypeExtensions").Methods.First ((v) => v.Name == "GetValue");
Assert.AreEqual (tc.RenderedBackingFieldType, getValue.Parameters [0].ParameterType.FullName, $"{tc.BackingFieldType}: GetValue parameter type");

var toEnumArray = bgen.ApiAssembly.MainModule.GetType ("BackingField", $"{tc.BackingFieldType}FieldTypeExtensions").Methods.First ((v) => v.Name == "ToEnumArray");
Assert.IsTrue (toEnumArray.ReturnType.IsArray, $"{tc.BackingFieldType} ToEnumArray return type IsArray");
Assert.AreEqual ($"{tc.BackingFieldType}FieldType", toEnumArray.ReturnType.GetElementType ().Name, $"{tc.BackingFieldType} ToEnumArray return type");
Assert.IsTrue (toEnumArray.Parameters [0].ParameterType.IsArray, $"{tc.BackingFieldType} ToEnumArray parameter type IsArray");
Assert.AreEqual (tc.RenderedBackingFieldType, toEnumArray.Parameters [0].ParameterType.GetElementType ().FullName, $"{tc.BackingFieldType} ToEnumArray parameter type");

var toConstantArray = bgen.ApiAssembly.MainModule.GetType ("BackingField", $"{tc.BackingFieldType}FieldTypeExtensions").Methods.First ((v) => v.Name == "ToConstantArray");
Assert.IsTrue (toConstantArray.ReturnType.IsArray, $"{tc.BackingFieldType} ToConstantArray return type IsArray");
Assert.AreEqual (tc.SimplifiedNullableType, toConstantArray.ReturnType.GetElementType ().FullName, $"{tc.BackingFieldType} ToConstantArray return type");
Assert.IsTrue (toConstantArray.Parameters [0].ParameterType.IsArray, $"{tc.BackingFieldType} ToConstantArray parameter type IsArray");
Assert.AreEqual ($"{tc.BackingFieldType}FieldType", toConstantArray.Parameters [0].ParameterType.GetElementType ().Name, $"{tc.BackingFieldType} ToConstantArray parameter type");
}
}

[Test]
Expand Down
8 changes: 8 additions & 0 deletions tests/generator/ExpectedXmlDocs.MacCatalyst.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@
<summary>Retrieves the <see cref="T:XmlDocumentation.E2" /> value named by <paramref name="constant" />.</summary>
<param name="constant">The name of the constant to retrieve.</param>
</member>
<member name="M:XmlDocumentation.E2Extensions.ToConstantArray(XmlDocumentation.E2[])">
<summary>Converts an array of <see cref="T:XmlDocumentation.E2" /> enum values into an array of their corresponding constants.</summary>
<param name="values">The array of enum values to convert.</param>
</member>
<member name="M:XmlDocumentation.E2Extensions.ToEnumArray(Foundation.NSString[])">
<summary>Converts an array of <see cref="T:Foundation.NSString" /> values into an array of their corresponding enum values.</summary>
<param name="values">The array if <see cref="T:Foundation.NSString" /> values to convert.</param>
</member>
<member name="T:XmlDocumentation.E3">
<summary>
Summary for E3
Expand Down
8 changes: 8 additions & 0 deletions tests/generator/ExpectedXmlDocs.iOS.legacy.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@
<summary>Retrieves the <see cref="T:XmlDocumentation.E2" /> value named by <paramref name="constant" />.</summary>
<param name="constant">The name of the constant to retrieve.</param>
</member>
<member name="M:XmlDocumentation.E2Extensions.ToConstantArray(XmlDocumentation.E2[])">
<summary>Converts an array of <see cref="T:XmlDocumentation.E2" /> enum values into an array of their corresponding constants.</summary>
<param name="values">The array of enum values to convert.</param>
</member>
<member name="M:XmlDocumentation.E2Extensions.ToEnumArray(Foundation.NSString[])">
<summary>Converts an array of <see cref="T:Foundation.NSString" /> values into an array of their corresponding enum values.</summary>
<param name="values">The array if <see cref="T:Foundation.NSString" /> values to convert.</param>
</member>
<member name="T:XmlDocumentation.E3">
<summary>
Summary for E3
Expand Down
8 changes: 8 additions & 0 deletions tests/generator/ExpectedXmlDocs.iOS.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@
<summary>Retrieves the <see cref="T:XmlDocumentation.E2" /> value named by <paramref name="constant" />.</summary>
<param name="constant">The name of the constant to retrieve.</param>
</member>
<member name="M:XmlDocumentation.E2Extensions.ToConstantArray(XmlDocumentation.E2[])">
<summary>Converts an array of <see cref="T:XmlDocumentation.E2" /> enum values into an array of their corresponding constants.</summary>
<param name="values">The array of enum values to convert.</param>
</member>
<member name="M:XmlDocumentation.E2Extensions.ToEnumArray(Foundation.NSString[])">
<summary>Converts an array of <see cref="T:Foundation.NSString" /> values into an array of their corresponding enum values.</summary>
<param name="values">The array if <see cref="T:Foundation.NSString" /> values to convert.</param>
</member>
<member name="T:XmlDocumentation.E3">
<summary>
Summary for E3
Expand Down
8 changes: 8 additions & 0 deletions tests/generator/ExpectedXmlDocs.macOS.legacy.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@
<summary>Retrieves the <see cref="T:XmlDocumentation.E2" /> value named by <paramref name="constant" />.</summary>
<param name="constant">The name of the constant to retrieve.</param>
</member>
<member name="M:XmlDocumentation.E2Extensions.ToConstantArray(XmlDocumentation.E2[])">
<summary>Converts an array of <see cref="T:XmlDocumentation.E2" /> enum values into an array of their corresponding constants.</summary>
<param name="values">The array of enum values to convert.</param>
</member>
<member name="M:XmlDocumentation.E2Extensions.ToEnumArray(Foundation.NSString[])">
<summary>Converts an array of <see cref="T:Foundation.NSString" /> values into an array of their corresponding enum values.</summary>
<param name="values">The array if <see cref="T:Foundation.NSString" /> values to convert.</param>
</member>
<member name="T:XmlDocumentation.E3">
<summary>
Summary for E3
Expand Down
8 changes: 8 additions & 0 deletions tests/generator/ExpectedXmlDocs.macOS.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@
<summary>Retrieves the <see cref="T:XmlDocumentation.E2" /> value named by <paramref name="constant" />.</summary>
<param name="constant">The name of the constant to retrieve.</param>
</member>
<member name="M:XmlDocumentation.E2Extensions.ToConstantArray(XmlDocumentation.E2[])">
<summary>Converts an array of <see cref="T:XmlDocumentation.E2" /> enum values into an array of their corresponding constants.</summary>
<param name="values">The array of enum values to convert.</param>
</member>
<member name="M:XmlDocumentation.E2Extensions.ToEnumArray(Foundation.NSString[])">
<summary>Converts an array of <see cref="T:Foundation.NSString" /> values into an array of their corresponding enum values.</summary>
<param name="values">The array if <see cref="T:Foundation.NSString" /> values to convert.</param>
</member>
<member name="T:XmlDocumentation.E3">
<summary>
Summary for E3
Expand Down
8 changes: 8 additions & 0 deletions tests/generator/ExpectedXmlDocs.tvOS.legacy.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@
<summary>Retrieves the <see cref="T:XmlDocumentation.E2" /> value named by <paramref name="constant" />.</summary>
<param name="constant">The name of the constant to retrieve.</param>
</member>
<member name="M:XmlDocumentation.E2Extensions.ToConstantArray(XmlDocumentation.E2[])">
<summary>Converts an array of <see cref="T:XmlDocumentation.E2" /> enum values into an array of their corresponding constants.</summary>
<param name="values">The array of enum values to convert.</param>
</member>
<member name="M:XmlDocumentation.E2Extensions.ToEnumArray(Foundation.NSString[])">
<summary>Converts an array of <see cref="T:Foundation.NSString" /> values into an array of their corresponding enum values.</summary>
<param name="values">The array if <see cref="T:Foundation.NSString" /> values to convert.</param>
</member>
<member name="T:XmlDocumentation.E3">
<summary>
Summary for E3
Expand Down
8 changes: 8 additions & 0 deletions tests/generator/ExpectedXmlDocs.tvOS.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@
<summary>Retrieves the <see cref="T:XmlDocumentation.E2" /> value named by <paramref name="constant" />.</summary>
<param name="constant">The name of the constant to retrieve.</param>
</member>
<member name="M:XmlDocumentation.E2Extensions.ToConstantArray(XmlDocumentation.E2[])">
<summary>Converts an array of <see cref="T:XmlDocumentation.E2" /> enum values into an array of their corresponding constants.</summary>
<param name="values">The array of enum values to convert.</param>
</member>
<member name="M:XmlDocumentation.E2Extensions.ToEnumArray(Foundation.NSString[])">
<summary>Converts an array of <see cref="T:Foundation.NSString" /> values into an array of their corresponding enum values.</summary>
<param name="values">The array if <see cref="T:Foundation.NSString" /> values to convert.</param>
</member>
<member name="T:XmlDocumentation.E3">
<summary>
Summary for E3
Expand Down

2 comments on commit da709f1

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

Please sign in to comment.