From 6c077a83bceab5dcd80605c15e12f77236d6235b Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Mon, 21 Oct 2024 21:01:48 -0500 Subject: [PATCH 1/4] Handle C++ bracket default values for code gen to C# --- .../Flax.Build/Bindings/BindingsGenerator.CSharp.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index 06d2b9712..17c92fe44 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -153,6 +153,17 @@ namespace Flax.Build.Bindings case "false": return value; } + // Handle C++ bracket default values that are not arrays + if (value.StartsWith("{") && value.EndsWith("}") && valueType != null && !valueType.IsArray && valueType.Type != "Array") + { + value = value.Replace("{", "").Replace("}", "").Trim(); + if (string.IsNullOrEmpty(value)) + { + value = $"default({valueType.Type})"; + return value; + } + } + // Numbers if (float.TryParse(value, out _) || (value[value.Length - 1] == 'f' && float.TryParse(value.Substring(0, value.Length - 1), out _))) { From cc511453f5c4026a064d589e68708043ac3e7331 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Mon, 21 Oct 2024 21:24:59 -0500 Subject: [PATCH 2/4] Handle c# code gen when C++ field has default value with style type `type{}` --- .../Flax.Build/Bindings/BindingsGenerator.CSharp.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index 17c92fe44..9642c8b02 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -153,6 +153,17 @@ namespace Flax.Build.Bindings case "false": return value; } + // Handle float{_} style type of default values + if (valueType != null && value.StartsWith($"{valueType.Type}") && value.EndsWith("}")) + { + value = value.Replace($"{valueType.Type}", "").Replace("{", "").Replace("}", "").Trim(); + if (string.IsNullOrEmpty(value)) + { + value = $"default({valueType.Type})"; + return value; + } + } + // Handle C++ bracket default values that are not arrays if (value.StartsWith("{") && value.EndsWith("}") && valueType != null && !valueType.IsArray && valueType.Type != "Array") { From acbb5343204c1d49ef6d300c2957b3ae7b683cd7 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Mon, 21 Oct 2024 21:34:34 -0500 Subject: [PATCH 3/4] Handle ex: API_FIELD() Type FieldName {DefaultValue}; --- .../Flax.Build/Bindings/BindingsGenerator.Parsing.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs index b2a3604bb..d99fa8b92 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs @@ -1352,11 +1352,17 @@ namespace Flax.Build.Bindings desc.Name = ParseName(ref context); // Read ';' or default value or array size or bit-field size - token = context.Tokenizer.ExpectAnyTokens(new[] { TokenType.SemiColon, TokenType.Equal, TokenType.LeftBracket, TokenType.Colon }); + token = context.Tokenizer.ExpectAnyTokens(new[] { TokenType.SemiColon, TokenType.Equal, TokenType.LeftBracket, TokenType.LeftCurlyBrace, TokenType.Colon }); if (token.Type == TokenType.Equal) { context.Tokenizer.SkipUntil(TokenType.SemiColon, out desc.DefaultValue, false); } + // Handle ex: API_FIELD() Type FieldName {DefaultValue}; + else if (token.Type == TokenType.LeftCurlyBrace) + { + context.Tokenizer.SkipUntil(TokenType.SemiColon, out desc.DefaultValue, false); + desc.DefaultValue = '{' + desc.DefaultValue; + } else if (token.Type == TokenType.LeftBracket) { // Read the fixed array length From 4d0ed0136960bd3a4c477c403b7420a8263ed34a Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Tue, 22 Oct 2024 16:31:08 -0500 Subject: [PATCH 4/4] Add test case for field default values --- Source/Engine/Tests/TestScripting.h | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Source/Engine/Tests/TestScripting.h b/Source/Engine/Tests/TestScripting.h index 19fd76351..dc05750e1 100644 --- a/Source/Engine/Tests/TestScripting.h +++ b/Source/Engine/Tests/TestScripting.h @@ -8,6 +8,35 @@ #include "Engine/Scripting/ScriptingObject.h" #include "Engine/Scripting/SerializableScriptingObject.h" +// Test default values init on fields. +API_STRUCT(NoDefault) struct TestDefaultValues +{ + DECLARE_SCRIPTING_TYPE_MINIMAL(TestDefaultValues); + + // Default value case 1 + API_FIELD() float TestFloat1 = {}; + // Default value case 2 + API_FIELD() float TestFloat2 = { }; + // Default value case 3 + API_FIELD() float TestFloat3 = {1.0f}; + // Default value case 4 + API_FIELD() float TestFloat4 = float{}; + // Default value case 5 + API_FIELD() float TestFloat5 = float{ }; + // Default value case 6 + API_FIELD() float TestFloat6 = float{1.0f}; + // Default value case 7 + API_FIELD() float TestFloat7 {}; + // Default value case 8 + API_FIELD() float TestFloat8 {1.0f}; + // Default value case 9 + API_FIELD() float TestFloat9 = 1.0f; + // Default value case 10 + API_FIELD() float TestFloat10 = 1.f; + // Default value case 11 + API_FIELD() float TestFloat11 = 1; +}; + // Test interface (name conflict with namespace) API_INTERFACE(Namespace="Foo") class FLAXENGINE_API IFoo {