Merge pull request #69933 from neikeq/issue-69822
C#: Fix exported properties of GodotObject[] type
This commit is contained in:
commit
0580790140
4 changed files with 39 additions and 27 deletions
|
@ -304,7 +304,12 @@ namespace Godot.SourceGenerators
|
|||
{
|
||||
return marshalType switch
|
||||
{
|
||||
// For generic Godot collections, VariantUtils.ConvertTo<T> is slower, so we need this special case
|
||||
// We need a special case for GodotObjectOrDerived[], because it's not supported by VariantUtils.ConvertTo<T>
|
||||
MarshalType.GodotObjectOrDerivedArray =>
|
||||
source.Append(VariantUtils, ".ConvertToSystemArrayOfGodotObject<",
|
||||
((IArrayTypeSymbol)typeSymbol).ElementType.FullQualifiedNameIncludeGlobal(), ">(",
|
||||
inputExpr, ")"),
|
||||
// We need a special case for generic Godot collections and GodotObjectOrDerived[], because VariantUtils.ConvertTo<T> is slower
|
||||
MarshalType.GodotGenericDictionary =>
|
||||
source.Append(VariantUtils, ".ConvertToDictionaryObject<",
|
||||
((INamedTypeSymbol)typeSymbol).TypeArguments[0].FullQualifiedNameIncludeGlobal(), ", ",
|
||||
|
@ -324,7 +329,10 @@ namespace Godot.SourceGenerators
|
|||
{
|
||||
return marshalType switch
|
||||
{
|
||||
// For generic Godot collections, VariantUtils.CreateFrom<T> is slower, so we need this special case
|
||||
// We need a special case for GodotObjectOrDerived[], because it's not supported by VariantUtils.CreateFrom<T>
|
||||
MarshalType.GodotObjectOrDerivedArray =>
|
||||
source.Append(VariantUtils, ".CreateFromSystemArrayOfGodotObject(", inputExpr, ")"),
|
||||
// We need a special case for generic Godot collections and GodotObjectOrDerived[], because VariantUtils.CreateFrom<T> is slower
|
||||
MarshalType.GodotGenericDictionary =>
|
||||
source.Append(VariantUtils, ".CreateFromDictionary(", inputExpr, ")"),
|
||||
MarshalType.GodotGenericArray =>
|
||||
|
@ -339,7 +347,11 @@ namespace Godot.SourceGenerators
|
|||
{
|
||||
return marshalType switch
|
||||
{
|
||||
// For generic Godot collections, Variant.As<T> is slower, so we need this special case
|
||||
// We need a special case for GodotObjectOrDerived[], because it's not supported by Variant.As<T>
|
||||
MarshalType.GodotObjectOrDerivedArray =>
|
||||
source.Append(inputExpr, ".AsGodotObjectArray<",
|
||||
((IArrayTypeSymbol)typeSymbol).ElementType.FullQualifiedNameIncludeGlobal(), ">()"),
|
||||
// We need a special case for generic Godot collections and GodotObjectOrDerived[], because Variant.As<T> is slower
|
||||
MarshalType.GodotGenericDictionary =>
|
||||
source.Append(inputExpr, ".AsGodotDictionary<",
|
||||
((INamedTypeSymbol)typeSymbol).TypeArguments[0].FullQualifiedNameIncludeGlobal(), ", ",
|
||||
|
@ -357,7 +369,10 @@ namespace Godot.SourceGenerators
|
|||
{
|
||||
return marshalType switch
|
||||
{
|
||||
// For generic Godot collections, Variant.From<T> is slower, so we need this special case
|
||||
// We need a special case for GodotObjectOrDerived[], because it's not supported by Variant.From<T>
|
||||
MarshalType.GodotObjectOrDerivedArray =>
|
||||
source.Append("global::Godot.Variant.CreateFrom(", inputExpr, ")"),
|
||||
// We need a special case for generic Godot collections, because Variant.From<T> is slower
|
||||
MarshalType.GodotGenericDictionary or MarshalType.GodotGenericArray =>
|
||||
source.Append("global::Godot.Variant.CreateFrom(", inputExpr, ")"),
|
||||
_ => source.Append("global::Godot.Variant.From<",
|
||||
|
|
|
@ -739,6 +739,26 @@ namespace Godot
|
|||
if (typeof(Godot.Object).IsAssignableFrom(type))
|
||||
return Convert.ChangeType(VariantUtils.ConvertTo<Godot.Object>(variant), type);
|
||||
|
||||
if (typeof(Godot.Object[]).IsAssignableFrom(type))
|
||||
{
|
||||
static Godot.Object[] ConvertToSystemArrayOfGodotObject(in godot_array nativeArray, Type type)
|
||||
{
|
||||
var array = Collections.Array.CreateTakingOwnershipOfDisposableValue(
|
||||
NativeFuncs.godotsharp_array_new_copy(nativeArray));
|
||||
|
||||
int length = array.Count;
|
||||
var ret = (Godot.Object[])Activator.CreateInstance(type, length)!;
|
||||
|
||||
for (int i = 0; i < length; i++)
|
||||
ret[i] = array[i].AsGodotObject();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
using var godotArray = NativeFuncs.godotsharp_variant_as_array(variant);
|
||||
return Convert.ChangeType(ConvertToSystemArrayOfGodotObject(godotArray, type), type);
|
||||
}
|
||||
|
||||
if (type.IsEnum)
|
||||
{
|
||||
var enumUnderlyingType = type.GetEnumUnderlyingType();
|
||||
|
|
|
@ -333,22 +333,6 @@ namespace Godot.NativeInterop
|
|||
return ret;
|
||||
}
|
||||
|
||||
// TODO: This needs reflection. Look for an alternative.
|
||||
internal static Godot.Object[] ConvertNativeGodotArrayToSystemArrayOfGodotObjectType(in godot_array p_array,
|
||||
Type type)
|
||||
{
|
||||
var array = Collections.Array.CreateTakingOwnershipOfDisposableValue(
|
||||
NativeFuncs.godotsharp_array_new_copy(p_array));
|
||||
|
||||
int length = array.Count;
|
||||
var ret = (Godot.Object[])Activator.CreateInstance(type, length)!;
|
||||
|
||||
for (int i = 0; i < length; i++)
|
||||
ret[i] = array[i].AsGodotObject();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
internal static StringName[] ConvertNativeGodotArrayToSystemArrayOfStringName(in godot_array p_array)
|
||||
{
|
||||
var array = Collections.Array.CreateTakingOwnershipOfDisposableValue(
|
||||
|
|
|
@ -594,12 +594,5 @@ namespace Godot.NativeInterop
|
|||
using var godotArray = NativeFuncs.godotsharp_variant_as_array(p_var);
|
||||
return Marshaling.ConvertNativeGodotArrayToSystemArrayOfGodotObjectType<T>(godotArray);
|
||||
}
|
||||
|
||||
// ReSharper disable once RedundantNameQualifier
|
||||
public static Godot.Object[] ConvertToSystemArrayOfGodotObject(in godot_variant p_var, Type type)
|
||||
{
|
||||
using var godotArray = NativeFuncs.godotsharp_variant_as_array(p_var);
|
||||
return Marshaling.ConvertNativeGodotArrayToSystemArrayOfGodotObjectType(godotArray, type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue