Просмотр исходного кода

Merge pull request #55597 from raulsntos/csharp-source-generators-generics

Fix C# `Godot.SourceGenerators` for generic classes
Ignacio Roldán Etcheverry 3 лет назад
Родитель
Сommit
97034939fe

+ 3 - 2
modules/mono/SdkPackageVersions.props

@@ -1,6 +1,7 @@
 <Project>
   <PropertyGroup>
-    <PackageVersion_Godot_NET_Sdk>4.0.0-dev5</PackageVersion_Godot_NET_Sdk>
-    <PackageVersion_Godot_SourceGenerators>4.0.0-dev2</PackageVersion_Godot_SourceGenerators>
+    <PackageFloatingVersion_Godot>4.0.*-*</PackageFloatingVersion_Godot>
+    <PackageVersion_Godot_NET_Sdk>4.0.0-dev6</PackageVersion_Godot_NET_Sdk>
+    <PackageVersion_Godot_SourceGenerators>4.0.0-dev3</PackageVersion_Godot_SourceGenerators>
   </PropertyGroup>
 </Project>

+ 1 - 1
modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets

@@ -17,6 +17,6 @@
 
   <!-- C# source generators -->
   <ItemGroup Condition=" '$(DisableImplicitGodotGeneratorReferences)' != 'true' ">
-    <PackageReference Include="Godot.SourceGenerators" Version="$(PackageVersion_Godot_SourceGenerators)" />
+    <PackageReference Include="Godot.SourceGenerators" Version="$(PackageFloatingVersion_Godot)" />
   </ItemGroup>
 </Project>

+ 16 - 0
modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/Generic.cs

@@ -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
+    {
+    }
+}

+ 14 - 5
modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptPathAttributeGenerator.cs

@@ -97,9 +97,13 @@ namespace Godot.SourceGenerators
                 string.Empty;
             bool hasNamespace = classNs.Length != 0;
 
-            string uniqueName = hasNamespace ?
-                classNs + "." + className + "_ScriptPath_Generated" :
-                className + "_ScriptPath_Generated";
+            var uniqueName = new StringBuilder();
+            if (hasNamespace)
+                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();
 
@@ -121,6 +125,8 @@ namespace Godot.SourceGenerators
             source.Append(attributes);
             source.Append("\n    partial class ");
             source.Append(className);
+            if (symbol.IsGenericType)
+                source.Append($"<{string.Join(", ", symbol.TypeParameters)}>");
             source.Append("\n{\n}\n");
 
             if (hasNamespace)
@@ -128,7 +134,7 @@ namespace Godot.SourceGenerators
                 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,
@@ -145,12 +151,15 @@ namespace Godot.SourceGenerators
             foreach (var godotClass in godotClasses)
             {
                 var qualifiedName = godotClass.Key.ToDisplayString(
-                    NullableFlowState.NotNull, SymbolDisplayFormat.FullyQualifiedFormat);
+                    NullableFlowState.NotNull, SymbolDisplayFormat.FullyQualifiedFormat
+                        .WithGenericsOptions(SymbolDisplayGenericsOptions.None));
                 if (!first)
                     sourceBuilder.Append(", ");
                 first = false;
                 sourceBuilder.Append("typeof(");
                 sourceBuilder.Append(qualifiedName);
+                if (godotClass.Key.IsGenericType)
+                    sourceBuilder.Append($"<{new string(',', godotClass.Key.TypeParameters.Count() - 1)}>");
                 sourceBuilder.Append(")");
             }