소스 검색

Merge pull request #46953 from neikeq/issue-46879

C#: Fix ScriptPathAttribute generator with none or nested namespaces
Rémi Verschelde 4 년 전
부모
커밋
6cfea412a9

+ 2 - 2
modules/mono/SdkPackageVersions.props

@@ -1,6 +1,6 @@
 <Project>
   <PropertyGroup>
-    <PackageVersion_Godot_NET_Sdk>4.0.0-dev4</PackageVersion_Godot_NET_Sdk>
-    <PackageVersion_Godot_SourceGenerators>4.0.0-dev1</PackageVersion_Godot_SourceGenerators>
+    <PackageVersion_Godot_NET_Sdk>4.0.0-dev5</PackageVersion_Godot_NET_Sdk>
+    <PackageVersion_Godot_SourceGenerators>4.0.0-dev2</PackageVersion_Godot_SourceGenerators>
   </PropertyGroup>
 </Project>

+ 5 - 4
modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk.csproj

@@ -23,11 +23,12 @@
 
   <ItemGroup>
     <!-- Package Sdk\Sdk.props and Sdk\Sdk.targets file -->
-    <None Include="Sdk\Sdk.props" Pack="true" PackagePath="Sdk" Visible="false" />
-    <None Include="Sdk\Sdk.targets" Pack="true" PackagePath="Sdk" Visible="false" />
+    <None Include="Sdk\Sdk.props" Pack="true" PackagePath="Sdk" />
+    <None Include="Sdk\Sdk.targets" Pack="true" PackagePath="Sdk" />
     <!-- SdkPackageVersions.props -->
-
-    <None Include="..\..\..\SdkPackageVersions.props" Pack="true" PackagePath="Sdk" Visible="false" />
+    <None Include="..\..\..\SdkPackageVersions.props" Pack="true" PackagePath="Sdk">
+      <Link>Sdk\SdkPackageVersions.props</Link>
+    </None>
   </ItemGroup>
 
   <Target Name="CopyNupkgToSConsOutputDir" AfterTargets="Pack">

+ 3 - 0
modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs

@@ -82,5 +82,8 @@ namespace Godot.SourceGenerators
 
         public static string FullQualifiedName(this INamedTypeSymbol symbol)
             => symbol.ToDisplayString(NullableFlowState.NotNull, FullyQualifiedFormatOmitGlobal);
+
+        public static string FullQualifiedName(this INamespaceSymbol namespaceSymbol)
+            => namespaceSymbol.ToDisplayString(FullyQualifiedFormatOmitGlobal);
     }
 }

+ 44 - 18
modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptPathAttributeGenerator.cs

@@ -69,7 +69,7 @@ namespace Godot.SourceGenerators
             IEnumerable<ClassDeclarationSyntax> classDeclarations
         )
         {
-            var attributesBuilder = new StringBuilder();
+            var attributes = new StringBuilder();
 
             // Remember syntax trees for which we already added an attribute, to prevent unnecessary duplicates.
             var attributedTrees = new List<SyntaxTree>();
@@ -81,28 +81,54 @@ namespace Godot.SourceGenerators
 
                 attributedTrees.Add(cds.SyntaxTree);
 
-                if (attributesBuilder.Length != 0)
-                    attributesBuilder.Append("\n    ");
+                if (attributes.Length != 0)
+                    attributes.Append("\n");
 
-                attributesBuilder.Append(@"[ScriptPathAttribute(""res://");
-                attributesBuilder.Append(RelativeToDir(cds.SyntaxTree.FilePath, godotProjectDir));
-                attributesBuilder.Append(@""")]");
+                attributes.Append(@"[ScriptPathAttribute(""res://");
+                attributes.Append(RelativeToDir(cds.SyntaxTree.FilePath, godotProjectDir));
+                attributes.Append(@""")]");
             }
 
-            string classNs = symbol.ContainingNamespace.Name;
             string className = symbol.Name;
 
-            var source = $@"using Godot;
-namespace {classNs}
-{{
-    {attributesBuilder}
-    partial class {className}
-    {{
-    }}
-}}
-";
-            context.AddSource(classNs + "." + className + "_ScriptPath_Generated",
-                SourceText.From(source, Encoding.UTF8));
+            INamespaceSymbol namespaceSymbol = symbol.ContainingNamespace;
+            string classNs = namespaceSymbol != null && !namespaceSymbol.IsGlobalNamespace ?
+                namespaceSymbol.FullQualifiedName() :
+                string.Empty;
+            bool hasNamespace = classNs.Length != 0;
+
+            string uniqueName = hasNamespace ?
+                classNs + "." + className + "_ScriptPath_Generated" :
+                className + "_ScriptPath_Generated";
+
+            var source = new StringBuilder();
+
+            // using Godot;
+            // namespace {classNs} {
+            //     {attributesBuilder}
+            //     partial class {className} { }
+            // }
+
+            source.Append("using Godot;\n");
+
+            if (hasNamespace)
+            {
+                source.Append("namespace ");
+                source.Append(classNs);
+                source.Append(" {\n\n");
+            }
+
+            source.Append(attributes);
+            source.Append("\n    partial class ");
+            source.Append(className);
+            source.Append("\n{\n}\n");
+
+            if (hasNamespace)
+            {
+                source.Append("\n}\n");
+            }
+
+            context.AddSource(uniqueName, SourceText.From(source.ToString(), Encoding.UTF8));
         }
 
         private static void AddScriptTypesAssemblyAttr(GeneratorExecutionContext context,