You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-08 12:40:44 +00:00
C#: Replace most conversions between Variant and System.Object
This commit replaces most usages of `ConvertManagedObjectToVariant` and `ConvertVariantToManagedObjectOfType`, by using the `Godot.Variant` struct instead of `System.Object`. The most notable change is to the `GetGodotPropertyDefaultValues` method that's generated for scripts. The dictionary it returns now stores `Godot.Variant` values. Remaining usages are: - The `DelegateUtils` class, for the serialization of closure display classes during assembly reloading by the editor. These display classes are compiler generated classes to store values captured by a closure. Since it's generated by the compiler, the only way we have to access the fields is through reflection. This leads to using `System.Object`. - Converting parameters when invoking constructors from the engine. This will be replaced with source generators in the future. - Legacy support for old `GetGodotPropertyDefaultValues` return values. We need to keep supporting the old version of this generated method for some time. Otherwise, if loading a project built with the previous version, it could lead to the loss of exported property values. Ideally, we should remove this legacy support before a stable release.
This commit is contained in:
@@ -368,7 +368,7 @@ namespace Godot.SourceGenerators
|
||||
source.Append(VariantUtils, ".ConvertToSignalInfo(", inputExpr, ")"),
|
||||
MarshalType.Enum =>
|
||||
source.Append("(", typeSymbol.FullQualifiedNameIncludeGlobal(),
|
||||
")", VariantUtils, ".ConvertToInt32(", inputExpr, ")"),
|
||||
")", VariantUtils, ".ConvertToInt64(", inputExpr, ")"),
|
||||
MarshalType.ByteArray =>
|
||||
source.Append(VariantUtils, ".ConvertAsPackedByteArrayToSystemArray(", inputExpr, ")"),
|
||||
MarshalType.Int32Array =>
|
||||
@@ -491,7 +491,7 @@ namespace Godot.SourceGenerators
|
||||
MarshalType.SignalInfo =>
|
||||
source.Append(VariantUtils, ".CreateFromSignalInfo(", inputExpr, ")"),
|
||||
MarshalType.Enum =>
|
||||
source.Append(VariantUtils, ".CreateFromInt((int)", inputExpr, ")"),
|
||||
source.Append(VariantUtils, ".CreateFromInt((long)", inputExpr, ")"),
|
||||
MarshalType.ByteArray =>
|
||||
source.Append(VariantUtils, ".CreateFromPackedByteArray(", inputExpr, ")"),
|
||||
MarshalType.Int32Array =>
|
||||
|
||||
@@ -174,7 +174,8 @@ namespace Godot.SourceGenerators
|
||||
}
|
||||
else
|
||||
{
|
||||
var propertyGet = propertyDeclarationSyntax.AccessorList?.Accessors.Where(a => a.Keyword.IsKind(SyntaxKind.GetKeyword)).FirstOrDefault();
|
||||
var propertyGet = propertyDeclarationSyntax.AccessorList?.Accessors
|
||||
.Where(a => a.Keyword.IsKind(SyntaxKind.GetKeyword)).FirstOrDefault();
|
||||
if (propertyGet != null)
|
||||
{
|
||||
if (propertyGet.ExpressionBody != null)
|
||||
@@ -200,7 +201,8 @@ namespace Godot.SourceGenerators
|
||||
{
|
||||
var returns = propertyGet.DescendantNodes().OfType<ReturnStatementSyntax>();
|
||||
if (returns.Count() == 1)
|
||||
{// Generate only single return
|
||||
{
|
||||
// Generate only single return
|
||||
var returnStatementSyntax = returns.Single();
|
||||
if (returnStatementSyntax.Expression is IdentifierNameSyntax identifierNameSyntax)
|
||||
{
|
||||
@@ -277,7 +279,8 @@ namespace Godot.SourceGenerators
|
||||
{
|
||||
source.Append("#pragma warning disable CS0109 // Disable warning about redundant 'new' keyword\n");
|
||||
|
||||
string dictionaryType = "System.Collections.Generic.Dictionary<Godot.StringName, object>";
|
||||
string dictionaryType =
|
||||
"global::System.Collections.Generic.Dictionary<global::Godot.StringName, global::Godot.Variant>";
|
||||
|
||||
source.Append("#if TOOLS\n");
|
||||
source.Append(" internal new static ");
|
||||
@@ -304,7 +307,7 @@ namespace Godot.SourceGenerators
|
||||
source.Append(" values.Add(PropertyName.");
|
||||
source.Append(exportedMember.Name);
|
||||
source.Append(", ");
|
||||
source.Append(defaultValueLocalName);
|
||||
source.AppendManagedToVariantExpr(defaultValueLocalName, exportedMember.Type);
|
||||
source.Append(");\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -455,7 +455,7 @@ namespace GodotTools
|
||||
_menuPopup.IdPressed += _MenuOptionPressed;
|
||||
|
||||
// External editor settings
|
||||
EditorDef("mono/editor/external_editor", ExternalEditorId.None);
|
||||
EditorDef("mono/editor/external_editor", Variant.From(ExternalEditorId.None));
|
||||
|
||||
string settingsHintStr = "Disabled";
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using Godot;
|
||||
using Godot.NativeInterop;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Runtime.CompilerServices;
|
||||
@@ -8,30 +9,31 @@ namespace GodotTools.Internals
|
||||
{
|
||||
public static float EditorScale => Internal.godot_icall_Globals_EditorScale();
|
||||
|
||||
public static unsafe object GlobalDef(string setting, object defaultValue, bool restartIfChanged = false)
|
||||
// ReSharper disable once UnusedMethodReturnValue.Global
|
||||
public static Variant GlobalDef(string setting, Variant defaultValue, bool restartIfChanged = false)
|
||||
{
|
||||
using godot_string settingIn = Marshaling.ConvertStringToNative(setting);
|
||||
using godot_variant defaultValueIn = Marshaling.ConvertManagedObjectToVariant(defaultValue);
|
||||
Internal.godot_icall_Globals_GlobalDef(settingIn, defaultValueIn, restartIfChanged, out godot_variant result);
|
||||
using (result)
|
||||
return Marshaling.ConvertVariantToManagedObject(result);
|
||||
using godot_variant defaultValueIn = defaultValue.CopyNativeVariant();
|
||||
Internal.godot_icall_Globals_GlobalDef(settingIn, defaultValueIn, restartIfChanged,
|
||||
out godot_variant result);
|
||||
return Variant.CreateTakingOwnershipOfDisposableValue(result);
|
||||
}
|
||||
|
||||
public static unsafe object EditorDef(string setting, object defaultValue, bool restartIfChanged = false)
|
||||
// ReSharper disable once UnusedMethodReturnValue.Global
|
||||
public static Variant EditorDef(string setting, Variant defaultValue, bool restartIfChanged = false)
|
||||
{
|
||||
using godot_string settingIn = Marshaling.ConvertStringToNative(setting);
|
||||
using godot_variant defaultValueIn = Marshaling.ConvertManagedObjectToVariant(defaultValue);
|
||||
Internal.godot_icall_Globals_EditorDef(settingIn, defaultValueIn, restartIfChanged, out godot_variant result);
|
||||
using (result)
|
||||
return Marshaling.ConvertVariantToManagedObject(result);
|
||||
using godot_variant defaultValueIn = defaultValue.CopyNativeVariant();
|
||||
Internal.godot_icall_Globals_EditorDef(settingIn, defaultValueIn, restartIfChanged,
|
||||
out godot_variant result);
|
||||
return Variant.CreateTakingOwnershipOfDisposableValue(result);
|
||||
}
|
||||
|
||||
public static object EditorShortcut(string setting)
|
||||
public static Variant EditorShortcut(string setting)
|
||||
{
|
||||
using godot_string settingIn = Marshaling.ConvertStringToNative(setting);
|
||||
Internal.godot_icall_Globals_EditorShortcut(settingIn, out godot_variant result);
|
||||
using (result)
|
||||
return Marshaling.ConvertVariantToManagedObject(result);
|
||||
return Variant.CreateTakingOwnershipOfDisposableValue(result);
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
|
||||
Reference in New Issue
Block a user