From f4b62ce38492d8653b2ba804091fbacf7c91a699 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Mon, 6 Dec 2021 16:45:03 +0100 Subject: [PATCH] Add support for array initializers as default values for scripting fields --- .../Bindings/BindingsGenerator.CSharp.cs | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index e4474d866..6cca1d84a 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -144,6 +144,47 @@ namespace Flax.Build.Bindings if (apiType != null && apiType.IsStruct) return null; + // Special case for array initializers + if (value.StartsWith("{") && value.EndsWith("}") && !attribute) + { + if (valueType == null) + throw new Exception("Unknown type for value initializer of default value " + value); + TypeInfo itemType; + if (valueType.Type == "Array") + itemType = valueType.GenericArgs[0]; + else if (valueType.IsArray) + { + itemType = (TypeInfo)value.Clone(); + itemType.IsArray = false; + } + else + throw new Exception("Cannot use array initializer as default value for type " + valueType); + var sb = new StringBuilder(); + var items = new List(); + var braces = 0; + for (int i = 1; i < value.Length - 1; i++) + { + var c = value[i]; + if (c == ',' && braces == 0) + { + items.Add(sb.ToString()); + sb.Clear(); + continue; + } + else if (c == '(') + braces++; + else if (c == ')') + braces--; + sb.Append(c); + } + items.Add(sb.ToString()); + sb.Clear(); + sb.Append("new ").Append(GenerateCSharpNativeToManaged(buildData, valueType, caller)).Append('{'); + for(int i = 0; i < items.Count; i++) + sb.Append(GenerateCSharpDefaultValueNativeToManaged(buildData, items[i], caller, itemType, attribute)).Append(','); + sb.Append('}'); + return sb.ToString(); + } // Special case for value constructors if (value.Contains('(') && value.Contains(')')) return "new " + value;