From 5c24f8c36500d72ecb1080222230c4738bef0105 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Thu, 13 Oct 2022 13:35:15 +0200 Subject: [PATCH] Add `ScriptingTypeHandle` support for scripting bindings as `System.Type` --- Source/Engine/Scripting/ManagedCLR/MUtils.cpp | 23 ++++++++++++++++++ Source/Engine/Scripting/ManagedCLR/MUtils.h | 2 ++ .../Bindings/BindingsGenerator.Api.cs | 24 ++++++++++++------- .../Bindings/BindingsGenerator.CSharp.cs | 1 + .../Bindings/BindingsGenerator.Cpp.cs | 6 +++++ 5 files changed, 48 insertions(+), 8 deletions(-) diff --git a/Source/Engine/Scripting/ManagedCLR/MUtils.cpp b/Source/Engine/Scripting/ManagedCLR/MUtils.cpp index 1b0c17386..ce54b77ac 100644 --- a/Source/Engine/Scripting/ManagedCLR/MUtils.cpp +++ b/Source/Engine/Scripting/ManagedCLR/MUtils.cpp @@ -186,6 +186,29 @@ MonoString* MUtils::ToString(const StringView& str, MonoDomain* domain) return mono_string_new_utf16(domain, (const mono_unichar2*)*str, str.Length()); } +ScriptingTypeHandle MUtils::UnboxScriptingTypeHandle(MonoReflectionType* value) +{ + MonoClass* klass = GetClass(value); + if (!klass) + return ScriptingTypeHandle(); + const MString typeName = MUtils::GetClassFullname(klass); + const ScriptingTypeHandle typeHandle = Scripting::FindScriptingType(typeName); + if (!typeHandle) + LOG(Warning, "Unknown scripting type {}", String(typeName)); + return typeHandle; +} + +MonoReflectionType* MUtils::BoxScriptingTypeHandle(const ScriptingTypeHandle& value) +{ + MonoReflectionType* result = nullptr; + if (value) + { + MonoType* monoType = mono_class_get_type(value.GetType().ManagedClass->GetNative()); + result = mono_type_get_object(mono_domain_get(), monoType); + } + return result; +} + VariantType MUtils::UnboxVariantType(MonoReflectionType* value) { if (value == nullptr) diff --git a/Source/Engine/Scripting/ManagedCLR/MUtils.h b/Source/Engine/Scripting/ManagedCLR/MUtils.h index 4fe2b55a8..34b2f8881 100644 --- a/Source/Engine/Scripting/ManagedCLR/MUtils.h +++ b/Source/Engine/Scripting/ManagedCLR/MUtils.h @@ -33,6 +33,8 @@ namespace MUtils extern FLAXENGINE_API MonoString* ToString(const StringView& str); extern FLAXENGINE_API MonoString* ToString(const StringView& str, MonoDomain* domain); + extern FLAXENGINE_API ScriptingTypeHandle UnboxScriptingTypeHandle(MonoReflectionType* value); + extern FLAXENGINE_API MonoReflectionType* BoxScriptingTypeHandle(const ScriptingTypeHandle& value); extern FLAXENGINE_API VariantType UnboxVariantType(MonoReflectionType* value); extern FLAXENGINE_API VariantType UnboxVariantType(MonoType* monoType); extern FLAXENGINE_API MonoReflectionType* BoxVariantType(const VariantType& value); diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Api.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Api.cs index a5cf4e8c6..b8b042ffc 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Api.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Api.cs @@ -174,14 +174,22 @@ namespace Flax.Build.Bindings return false; // Skip for special types - if (typeInfo.Type == "BytesContainer" && typeInfo.GenericArgs == null) - return false; - if (typeInfo.Type == "Variant" && typeInfo.GenericArgs == null) - return false; - if (typeInfo.Type == "VariantType" && typeInfo.GenericArgs == null) - return false; - if (typeInfo.Type == "Function" && typeInfo.GenericArgs != null) - return false; + if (typeInfo.GenericArgs == null) + { + if (typeInfo.Type == "BytesContainer") + return false; + if (typeInfo.Type == "Variant") + return false; + if (typeInfo.Type == "VariantType") + return false; + if (typeInfo.Type == "ScriptingTypeHandle") + return false; + } + else + { + if (typeInfo.Type == "Function") + return false; + } // Find API type info var apiType = FindApiTypeInfo(buildData, typeInfo, caller); diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index 9cd21f16e..1f907606b 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -43,6 +43,7 @@ namespace Flax.Build.Bindings { "StringAnsi", "string" }, { "StringAnsiView", "string" }, { "ScriptingObject", "FlaxEngine.Object" }, + { "ScriptingTypeHandle", "System.Type" }, { "PersistentScriptingObject", "FlaxEngine.Object" }, { "ManagedScriptingObject", "FlaxEngine.Object" }, { "MClass", "System.Type" }, diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs index 9c7456e40..1f6fcfb04 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs @@ -407,6 +407,9 @@ namespace Flax.Build.Bindings case "VariantType": type = "MonoReflectionType*"; return "MUtils::BoxVariantType({0})"; + case "ScriptingTypeHandle": + type = "MonoReflectionType*"; + return "MUtils::BoxScriptingTypeHandle({0})"; case "ScriptingObject": case "ManagedScriptingObject": case "PersistentScriptingObject": @@ -590,6 +593,9 @@ namespace Flax.Build.Bindings case "VariantType": type = "MonoReflectionType*"; return "MUtils::UnboxVariantType({0})"; + case "ScriptingTypeHandle": + type = "MonoReflectionType*"; + return "MUtils::UnboxScriptingTypeHandle({0})"; case "CultureInfo": type = "void*"; return "MUtils::ToNative({0})";