1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-18 14:21:41 +00:00

C#: Set PropertyInfo.class_name for method parameters

This commit is contained in:
Raul Santos
2023-06-16 23:05:11 +02:00
parent c0d8d91b15
commit 48e20c628a
6 changed files with 74 additions and 14 deletions

View File

@@ -4,12 +4,17 @@ namespace Godot.SourceGenerators
{
public PropertyInfo(VariantType type, string name, PropertyHint hint,
string? hintString, PropertyUsageFlags usage, bool exported)
: this(type, name, hint, hintString, usage, className: null, exported) { }
public PropertyInfo(VariantType type, string name, PropertyHint hint,
string? hintString, PropertyUsageFlags usage, string? className, bool exported)
{
Type = type;
Name = name;
Hint = hint;
HintString = hintString;
Usage = usage;
ClassName = className;
Exported = exported;
}
@@ -18,6 +23,7 @@ namespace Godot.SourceGenerators
public PropertyHint Hint { get; }
public string? HintString { get; }
public PropertyUsageFlags Usage { get; }
public string? ClassName { get; }
public bool Exported { get; }
}
}

View File

@@ -288,8 +288,14 @@ namespace Godot.SourceGenerators
.Append("\", usage: (global::Godot.PropertyUsageFlags)")
.Append((int)propertyInfo.Usage)
.Append(", exported: ")
.Append(propertyInfo.Exported ? "true" : "false")
.Append(")");
.Append(propertyInfo.Exported ? "true" : "false");
if (propertyInfo.ClassName != null)
{
source.Append(", className: new global::Godot.StringName(\"")
.Append(propertyInfo.ClassName)
.Append("\")");
}
source.Append(")");
}
private static MethodInfo DetermineMethodInfo(GodotMethodData method)
@@ -298,7 +304,9 @@ namespace Godot.SourceGenerators
if (method.RetType != null)
{
returnVal = DeterminePropertyInfo(method.RetType.Value.MarshalType, name: string.Empty);
returnVal = DeterminePropertyInfo(method.RetType.Value.MarshalType,
method.RetType.Value.TypeSymbol,
name: string.Empty);
}
else
{
@@ -317,6 +325,7 @@ namespace Godot.SourceGenerators
for (int i = 0; i < paramCount; i++)
{
arguments.Add(DeterminePropertyInfo(method.ParamTypes[i],
method.Method.Parameters[i].Type,
name: method.Method.Parameters[i].Name));
}
}
@@ -329,7 +338,7 @@ namespace Godot.SourceGenerators
defaultArguments: null);
}
private static PropertyInfo DeterminePropertyInfo(MarshalType marshalType, string name)
private static PropertyInfo DeterminePropertyInfo(MarshalType marshalType, ITypeSymbol typeSymbol, string name)
{
var memberVariantType = MarshalUtils.ConvertMarshalTypeToVariantType(marshalType)!.Value;
@@ -338,8 +347,14 @@ namespace Godot.SourceGenerators
if (memberVariantType == VariantType.Nil)
propUsage |= PropertyUsageFlags.NilIsVariant;
string? className = null;
if (memberVariantType == VariantType.Object && typeSymbol is INamedTypeSymbol namedTypeSymbol)
{
className = namedTypeSymbol.GetGodotScriptNativeClassName();
}
return new PropertyInfo(memberVariantType, name,
PropertyHint.None, string.Empty, propUsage, exported: false);
PropertyHint.None, string.Empty, propUsage, className, exported: false);
}
private static void GenerateHasMethodEntry(

View File

@@ -360,8 +360,14 @@ namespace Godot.SourceGenerators
.Append("\", usage: (global::Godot.PropertyUsageFlags)")
.Append((int)propertyInfo.Usage)
.Append(", exported: ")
.Append(propertyInfo.Exported ? "true" : "false")
.Append(")");
.Append(propertyInfo.Exported ? "true" : "false");
if (propertyInfo.ClassName != null)
{
source.Append(", className: new global::Godot.StringName(\"")
.Append(propertyInfo.ClassName)
.Append("\")");
}
source.Append(")");
}
private static MethodInfo DetermineMethodInfo(GodotSignalDelegateData signalDelegateData)
@@ -372,7 +378,9 @@ namespace Godot.SourceGenerators
if (invokeMethodData.RetType != null)
{
returnVal = DeterminePropertyInfo(invokeMethodData.RetType.Value.MarshalType, name: string.Empty);
returnVal = DeterminePropertyInfo(invokeMethodData.RetType.Value.MarshalType,
invokeMethodData.RetType.Value.TypeSymbol,
name: string.Empty);
}
else
{
@@ -391,6 +399,7 @@ namespace Godot.SourceGenerators
for (int i = 0; i < paramCount; i++)
{
arguments.Add(DeterminePropertyInfo(invokeMethodData.ParamTypes[i],
invokeMethodData.Method.Parameters[i].Type,
name: invokeMethodData.Method.Parameters[i].Name));
}
}
@@ -403,7 +412,7 @@ namespace Godot.SourceGenerators
defaultArguments: null);
}
private static PropertyInfo DeterminePropertyInfo(MarshalType marshalType, string name)
private static PropertyInfo DeterminePropertyInfo(MarshalType marshalType, ITypeSymbol typeSymbol, string name)
{
var memberVariantType = MarshalUtils.ConvertMarshalTypeToVariantType(marshalType)!.Value;
@@ -412,8 +421,14 @@ namespace Godot.SourceGenerators
if (memberVariantType == VariantType.Nil)
propUsage |= PropertyUsageFlags.NilIsVariant;
string? className = null;
if (memberVariantType == VariantType.Object && typeSymbol is INamedTypeSymbol namedTypeSymbol)
{
className = namedTypeSymbol.GetGodotScriptNativeClassName();
}
return new PropertyInfo(memberVariantType, name,
PropertyHint.None, string.Empty, propUsage, exported: false);
PropertyHint.None, string.Empty, propUsage, className, exported: false);
}
private static void GenerateHasSignalEntry(