Fix Godot.SourceGenerators for generic classes
Fix invalid C# generated by source generators for generic classes and add generic classes to the Sample project for testing.
This commit is contained in:
parent
8c5e58ed74
commit
c52f21335c
@ -0,0 +1,16 @@
|
|||||||
|
namespace Godot.SourceGenerators.Sample
|
||||||
|
{
|
||||||
|
partial class Generic<T> : Godot.Object
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generic again but different generic parameters
|
||||||
|
partial class Generic<T, R> : Godot.Object
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generic again but without generic parameters
|
||||||
|
partial class Generic : Godot.Object
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
@ -97,9 +97,13 @@ namespace Godot.SourceGenerators
|
|||||||
string.Empty;
|
string.Empty;
|
||||||
bool hasNamespace = classNs.Length != 0;
|
bool hasNamespace = classNs.Length != 0;
|
||||||
|
|
||||||
string uniqueName = hasNamespace ?
|
var uniqueName = new StringBuilder();
|
||||||
classNs + "." + className + "_ScriptPath_Generated" :
|
if (hasNamespace)
|
||||||
className + "_ScriptPath_Generated";
|
uniqueName.Append($"{classNs}.");
|
||||||
|
uniqueName.Append(className);
|
||||||
|
if (symbol.IsGenericType)
|
||||||
|
uniqueName.Append($"Of{string.Join(string.Empty, symbol.TypeParameters)}");
|
||||||
|
uniqueName.Append("_ScriptPath_Generated");
|
||||||
|
|
||||||
var source = new StringBuilder();
|
var source = new StringBuilder();
|
||||||
|
|
||||||
@ -121,6 +125,8 @@ namespace Godot.SourceGenerators
|
|||||||
source.Append(attributes);
|
source.Append(attributes);
|
||||||
source.Append("\n partial class ");
|
source.Append("\n partial class ");
|
||||||
source.Append(className);
|
source.Append(className);
|
||||||
|
if (symbol.IsGenericType)
|
||||||
|
source.Append($"<{string.Join(", ", symbol.TypeParameters)}>");
|
||||||
source.Append("\n{\n}\n");
|
source.Append("\n{\n}\n");
|
||||||
|
|
||||||
if (hasNamespace)
|
if (hasNamespace)
|
||||||
@ -128,7 +134,7 @@ namespace Godot.SourceGenerators
|
|||||||
source.Append("\n}\n");
|
source.Append("\n}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
context.AddSource(uniqueName, SourceText.From(source.ToString(), Encoding.UTF8));
|
context.AddSource(uniqueName.ToString(), SourceText.From(source.ToString(), Encoding.UTF8));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void AddScriptTypesAssemblyAttr(GeneratorExecutionContext context,
|
private static void AddScriptTypesAssemblyAttr(GeneratorExecutionContext context,
|
||||||
@ -145,12 +151,15 @@ namespace Godot.SourceGenerators
|
|||||||
foreach (var godotClass in godotClasses)
|
foreach (var godotClass in godotClasses)
|
||||||
{
|
{
|
||||||
var qualifiedName = godotClass.Key.ToDisplayString(
|
var qualifiedName = godotClass.Key.ToDisplayString(
|
||||||
NullableFlowState.NotNull, SymbolDisplayFormat.FullyQualifiedFormat);
|
NullableFlowState.NotNull, SymbolDisplayFormat.FullyQualifiedFormat
|
||||||
|
.WithGenericsOptions(SymbolDisplayGenericsOptions.None));
|
||||||
if (!first)
|
if (!first)
|
||||||
sourceBuilder.Append(", ");
|
sourceBuilder.Append(", ");
|
||||||
first = false;
|
first = false;
|
||||||
sourceBuilder.Append("typeof(");
|
sourceBuilder.Append("typeof(");
|
||||||
sourceBuilder.Append(qualifiedName);
|
sourceBuilder.Append(qualifiedName);
|
||||||
|
if (godotClass.Key.IsGenericType)
|
||||||
|
sourceBuilder.Append($"<{new string(',', godotClass.Key.TypeParameters.Count() - 1)}>");
|
||||||
sourceBuilder.Append(")");
|
sourceBuilder.Append(")");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user